当前位置:首页 » 存储配置 » 8086中字符串存储

8086中字符串存储

发布时间: 2022-04-21 12:22:51

Ⅰ 8086汇编语言问题

***********************
更新的说明在后面
***********************
你的问题很含糊
1. 输入一个16进制数
如何输入?从键盘吗?如果是,那本身就已经是ASCII编码了
如果不是,那就不应该叫输入,而应说成是给定一个数
2. 16进制数
那是什么含意?在计算机的存储器中存入的都是二进制数,
而我们人不习惯二进制,于是就已10或16进制给出他们或者让计算机把它们表示出来。
如我们要在某些内存单元存储一些数据:包括二进制的10010110,十进制的96,十六进制的96(即95H=十进制的142),那么它们在内存里面对应的是什么样子呢?
如果只允许存放在一个存储单元内,即一个字节,那么,
1. 二进制数只能直接存入,即该存储单元8个二进制位分别为10010110;
2. 对于十进制的96,则可以有两种形式:压缩BCD和二进制,该存储单元8个二进制位分别对应1001(9)0110(6) 和 01100000 = 2的6次方 + 2的5次方 =64 + 32 = 96 ;
3. 对于十六进制的96(即96H=十进制的142, 实际上也就是二进制的10010110),和二进制完全一样存储
如果允许存放在多个存储单元内,即多个字节,那么,
1. 二进制数可以一个位存放在一个单元,共需要8个字节即8个单元,如果直接把每一位的值存入该单元,则每个单元仅用了其中的一位(其余各位为0),如果存入的值每一位值的ASCII码,则每个单元分别存放的是字符 '1' '0' '0' '1' '0' '1' '1' '0' ;
2. 对于十进制的96,则可以1).非压缩BCD,一个字节存入9,一个字节存入6,即00001001 和 00000110;2). 字符串,分别存入字符‘9’和字符‘6’,分别是00111001和00110110
3. 对于十六进制的96,此处同十进制。

************************************************************************
* 综上,你的这个转换,首先需要说明你的输入数据格式,然后才能说如何转换 *
************************************************************************

Ⅱ 8086汇编语言中如何清空缓冲区里的字符串

最简单的就是往那个缓冲区送一堆零过去,通常将CX设置成缓冲区的长度,将AL清零,然后使用重复字符串操作指令来清空缓冲区:
MOV
CX,
LEN
;缓冲区的长度,以字节为单位
LEA
DI,
STR_BUFF
;缓冲区首地址送如
DI
寄存器
XOR
AL,
AL
;AL
清零
REPZ
STOSB
;重复至CX等于0
如果缓冲区巨大,可以送字过去,这样可以加快运行速度:
MOV
BX,
LEN
;缓冲区长度
MOV
CL,
2
SHR
BX,
CL
;缓冲区长度除以2,得到缓冲区的字长度
MOV
CX,
BX
;送入CX计数器
LEA
DI,
STR_BUFF
;字符串缓冲区首地址送如DI寄存器
XOR
AX,
AX
;AX寄存器清零
REPZ
STOSW
;重复至CX等于0
有时候还要考虑缓冲区是奇数,即缓冲区执行上诉代码后,还有一个字节没有处理,这时候,需要多加几句。
XOR
DX,
DX
MOV
BX,
LEN
TEST
BX,
1
JZ
L1
MOV
DX,
0FFH
;做标记,指明字符串是奇数
L1:
MOV
CL,
2
SHR
BX,
CL
;缓冲区长度除以2,得到缓冲区的字长度
MOV
CX,
BX
;送入CX计数器
LEA
DI,
STR_BUFF
;字符串缓冲区首地址送如DI寄存器
XOR
AX,
AX
;AX寄存器清零
REPZ
STOSW
;重复至CX等于0
CMP
DX,
0FFH
JNZ
EXIT
STOSB
EXIT:
......
还有许多其他的方法,但是效率最高的就是这个了,其他利用LOOP等循环指令或CMP
CX,
0,JNZ
xx
这种方法速度都要慢一下。

Ⅲ 字符串在内存中怎么储存

    字符串是以ASCII字符NUL结尾的字符序列。
ASCII字符NUL表示为\0.字符串通常存储在数组或者从堆上分配的内存中。只是,并不是全部的字符数组都是字符串,字符数组可能没有NUL字符。
字符数组也用来表示布尔值等小的整数单元,以节省内存空间。

    C中有两种类型的字符串:
     单字节字符串
     由char数据类型组成的序列
     宽字符串
     由wchar_t数据类型组成的序列
     wchar_t数据类型用来表示宽字符,要么是16位宽。要么是32位宽。这两种字符串都以NUL结尾。能够在string.h中找到单字节字符串函数。而在wchar.h中找到宽字符串函数。宽字符主要用于非拉丁字符集,对于支持外语的应用程序非常实用,
     字符串的长度是字符串中除了NUL字符外的字符数。为字符串分配内存的时候,要记住为全部的字符加上NUL字符分配足够的空间。

Ⅳ 汇编语言字符窜存储

字符串在内存中以字节(byte)为单位存储,字符串包含多少字符就需要多少byte来存。汇编中定义一个字符串如下:

myStringBYTE"ABCDEF",0;常以0作为字符串的结尾

内存中存储顺序如图所示,从箭头开始,依次向下。假设第一个地址是0000h,下一个byte的地址就是00001h,依次类推。内存中存储的是字符的二进制编码,比如A41h=01000001b

希望对LZ有用~

PS:2L说的是英特尔架构CPU的“小尾顺序”规则,其他一些CPU可能采用“大尾顺序”

比如定义一个字(WORD):myWordWORD1234h如果是小尾顺序,那低地址存34h,高地址存12h,如图中0000h的地方存34h,00001h的地方存12h。大尾顺序则相反~(汗。。。。但愿不显得太罗嗦)

Ⅳ 8086中字符串操作使用的变址寄存器是什么

SI,源变址,
DI,目的变址。

Ⅵ 8086/8088系统中,存储器为什么要分段,一个段的最大和最小各为多少字节

8086/8088系统中,存储器分段的主要目的是便于存储器的管理,使得可以用16位寄存器来寻址20位的内存空间。一个段最大为64KB,最小为16B。

存储器一般用来保存程序的中间结果,为随后的指令快速提供操作数,从而避免把中间结果存入内存,再读取内存的操作。

由于存储器的个数和容量都有限,不可能把所有中间结果都存储在存储器中,所以,要对存储器进行适当的调度。根据指令的要求,管理安排适当的寄存器,避免操作数过多的传送操作。

8086/8088CPU可直接寻址1MB的存储器空间,直接寻址需要20位地址码,而所有内部寄存器都是16位的,只能直接寻址6KB,因此采用分段技术来解决。将1MB的存储空间分成若干逻辑段,每段最长64KB,最短16B。这些逻辑段在整个存储空间中可浮动。

(6)8086中字符串存储扩展阅读:

8086/8088CPU内部设置了4个16位段寄存器,它们分别是代码段寄存器CS、数据段寄存器DS、堆栈段寄存器SS、附加段寄存器ES、由它们给出相应逻辑段的首地址,称为“段基址”。段基址与段内偏移地址组合形成20位物理地址,段内偏移地址可以存放在寄存器中,也可以存放在存储器中。

程序较小时,代码段、数据段、堆栈段可放在一个段内,即包含在64KB之内,而当程序或数据量较大时,超过了64KB,那么可以定义多个代码段或数据段、堆栈段、附加段。

Ⅶ 3、 8086CPU内的4个16位的段寄存器存放的是什么地址怎样才能寻址1MB的存储空间

给你详细的资料
1、 8086CPU和8088CPU内部结构基本相同,不同之处在于8088有8条外部数据总线,因此为准16位。8086有16条外部数据总线。两个CPU的软件完全兼容,程序的编制也完全相同。

2、 8086CPU从功能上分为两大部分:一是执行部件(EU),二是总线接口部件(BIU)。

执行部件是由以下虽部分组成:

(1)四个通用寄存器:AX BX CX DX

(2)四个专用寄存器:基数指针寄存器BP,堆栈指针寄存器SP,源变址寄存器SI,目的变址寄存器DI

(3)标志寄存器FR

(4)算术逻辑部件ALU

功能是负责执行所有的指令,向总线接口部件提供指令执行的结果数据和地址,并对通用寄存器和标志寄存器进行管理。

总线接口部件由以下部件组成:

(1)四个段寄存器:代码段寄存器,数据段寄存器,附加段寄存器,堆栈段寄存器。

(2)指令指针寄存器

(3)地址加法器

(4)指令队列

功能:执行外部总线周期,负责存储器与外部端口I|O传送数据。也就是负责CPU与存储器和外设之间的信息交换。

3、共有14个寄存器,分成3个部分:

(!)通用寄存器8个 :AX, BX , CX, DX , SP , BP ,SI ,DI.

AX , BX ,CX , DX为数据寄存器,用来保存运算中的中间结果和有效地址。4个寄存器既可以做16位寄存器,也可以做8位寄存器 AL, AH, BL, BH, CL, CH, DL, DH.。

在程序设计中,一般把AX用作累加器。BX 用作基址寄存器,CX用作计数器,DX用作数据寄存器。

SP:堆栈指针寄存器;装栈顶指针偏移量。

BP:基址指针寄存器:装栈段中一个数据区的基址偏移量。

SI:源变址寄存器;装源操作数地址的偏移量。

DI:目的变址寄存器;装目的操作数地址偏移量。

(2)段寄存器4个

CS;代码段寄存器;装代码段的起始地址;

DS;数据段寄存器;装数据段的起始地址;

SS; 堆栈段寄存器;装堆栈段的起始地址;

ES: 附加段寄存器;装附加段的起始地址。

(3)控制寄存器两个:IP,FR。

IP:指令指针寄存器;始终存放当前指令的下一第指令的起始存储单元的偏移地址。

FR:状态标志寄存器;用来存放运算结果和特征。16位寄存器,用39位。

标志位分为两大类:一类是状态标志,用来表示算术、逻辑运算的结果特征。(CF,PF,AF,ZF,SF,OF)。一类是控制标志;用来表示控制CPU的操作特征。(IF、DF、TF)

CF(FR0):CF=1为加、减运算结果的最高位有进位或有借位,否则CF=0。

PF(FR2):PF=1为操作结果“1”的个数为偶数,否则PF=0。

AF(FR4):AF=1为运算结果的低4位向高4位有进位或有借位,(用于10进制BCD码运算指令)否则A=0。

ZF(FR6):ZF=1运算结果为0,否则ZF=0。

SF(FR7):SF=1运算结果最高为0(E),否则SF=0。

OF(FR11):OF=1在算术运算时,带符号数的运算结果超出数的表示范围。否则OF=0。

TF(FR8):TF=1CPU进入单步工作方式。

IF(FR9):IF=1允许CPU响应可屏蔽外部中断请求。IF=0禁止中断。

DF(FR10):DF=1在字符串操作时使地址指针自动减量。DF=0自动增量。

4、 8086系统的物理地址是将段地址寄存器的内容左移4位(或乘16)加上偏移地址,即可得到20位的物理地址。

2000H左移4位为20000H,加上2100H为22100H,则物理地址为22100H。

5、8086/8088CPU把BIU完成一次访问存储器或外设操作所需的时间称为一个总线周期。一个总线周期最少包含4个时钟周期(T1~T4)。当访问存储器(读、写)或外设时,存储器或外设不能及时地配合CPU传送数据,存储器或外设通过“READY:信号在T3之前向CPU发一个“数据未准备好”信号,CPU在T3之后插入一个或多个等待时钟周期TW。当存储器外设准备好数据,通过“READY”发“准备好”信号,CPU接收到这个信号后,会自动脱离TW状态进入T4状态。因此插入多少个TW取决于“READY”信号。

1、 最小模式:就是在系统中只有8086/8088一个微处理器。在该系统中,所有的总线控制信号都直接由8086/8088产生,因此,系统中总线控制电路被减到最少。

最大模式:在系统中包含两个或多个微处理器,其中一个主处理器就是不是8088/8086,其它处理器为协处理器,是协助主处理器工作的。它用在中等规模或大型的8088/8086系统中。一般情况下和8088/8086配合的协处理器有两个,一个是数值运算协处理器8087,一个是输入/输出协处理器8089。将8088/8086CPU的第33脚接地时,系统处于最大模式,当第33脚接+5V时,系统为最小模式。

2、 地址锁存器就是一个暂存器,它根据控制信号的状态,将总线上的地址代码暂存起来。8088/8086的数据和地址总线采用分时复用不着操作方式,即用同一总线既传送地址又传送数据。当微处理器与存储器交换信号时,首先由CPU发送存储器的地址,同时发允许锁存信号ALE给锁存器,当锁存器接到该信号后将地址/数据总线上的地址锁存在锁存器中,随后才能传送数据。

3、 8086中的典型时序包括:

(1)存储器读与写周期。

(2)I/O设备的读与写周期。

(3)中断响应周期。

(4)系统复位。

(5)空转周期。

(6)CPU进入和退出保持状态的时序。

?? 8086CPU的字节寻址范围有多大?为什么?存储器为什么分段?20位物理地址的形成过程是怎样的?

答:8086CPU寻址范围1MB。因为8086CPU地址线为20条,2^20=1024KB,即1MB。8086系统中,指令仅给出16位地址,与寻址有关的寄存器也只有16位长,因此寻址范围只有64KB,为了寻址1MB,所以分成四个逻辑段。当CPU访问内存时,段寄存器的内容(段基址)自动左移4位(二进制),与段内16位地址偏移量相加,形成20位的物理地址。

采用分段结构的存储器中,任何一个逻辑地址都由段基址和偏移地址两部分构成,都是 16位二进制数。
物理地址:存储器的绝对地址,从00000H~FFFFFH,是CPU访问存储器的实际寻址地址(也称为绝对地址)
16位的段基址左移4位(相当于在段基址最低位后添4个“0”),然后与偏移地址相加获得物理地址,这相当于完成如下的地址运算:
物理地址=段基址×16+偏移地址


采用分段结构的存储器中,任何一个逻辑地址都由段基址和偏移地址两部分构成,都是 16位二进制数。
物理地址:存储器的绝对地址,从00000H~FFFFFH,是CPU访问存储器的实际寻址地址(也称为绝对地址)
16位的段基址左移4位(相当于在段基址最低位后添4个“0”),然后与偏移地址相加获得物理地址,这相当于完成如下的地址运算:
物理地址=段基址×16+偏移地址

Ⅷ 汇编语言中字符串变量是如何存储的啊

DOS中断21号
功能0AH

功能描述: 从标准输入设备上读入一个字节字符串,遇到“回车键”结束输入(输入的字符在标准的输出设备上有回显)。如果该输入操作被重定向,那么,将无法判断文件是否已到文件尾
入口参数: AH=0AH
DS:DX=存放输入字符的起始地址
接受输入字符串缓冲区的定义说明:
1、第一个字节为缓冲区的最大容量,可认为是入口参数;
2、第二个字节为实际输入的字符数(不包括回车键),可看作出口参数;
3、从第三个字节开始存放实际输入的字符串;
4、字符串以回车键结束,回车符是接受的最后一个字符;
5、若输入的字符数超过缓冲区的最大容量,则多出的部分被丢弃,系统并发出响铃,直到输入“回车”键才结束输入。
例如:
BUFF 80, ?, 80 DUP(?) ;最多接受80个字符

出口参数: 无
例子:
BUFF 80, ?, 80 DUP(?)
.
.
.
lea dx,buff
mov ah,0ah
int 21h
输入内容是12345678
那么指令执行结果buff的内存数据为:
50h 08h 31h 32h 33h 34h 35h 36h 37h 38h 0dh
你输入的字符串是31h到38h,0dh是结束标志。

使用串传送指令:
CX存放字符串的长度,DS:SI存放源字符串的地址,ES:DI存放目的字符串的地址,cld设置向高地址单元位移。
执行rep movsb

Ⅸ 8086为什么高位先存

这没有为什么!这是一种习惯出来的规则,你说的这就是INTEL规则,因它的芯片出来时方便这种高位在后,低位在前的用,这慢慢的就成了一种习惯,当然再在后的发展中因低层(汇编)全这用的它,所以高级平台慢慢也用它了这就成了INTEL系列的规则了,而MOTOROLA的芯片在使用中,哈!可就不是了,它可就高位在前,低位在后才好用的,哈!也可能就是楼上说的大端字节吧。
不只在这数的顺序上,在文件的规定中也是一样的,就如HEX文件这也是一种INTEL格式的文件。当然,这也可能和当初的市场竟争有原因,在刚出来的初期,都想把自己的规则变成通用标准而才好占领,打开自己的产品市场的嘛。

Ⅹ 汇编语言8086的一个问题,程序如下,为什么我执行程序后str1是从ds 0200h开始存储的

//注意下面的代码:
/*inc di后dl的值也+1了,dl是di的低8位,这个循环在你的程序中,一直到循环256次后 di=100000000b ,dl才会溢出再为0,此时di指向的位置是str1的偏移0x100+256(0x100)也就是0x200*/
circle1:
inc di
cmp dl,[ds:di] //此处你本意应是与0比较,现在比较的已经不是0了
jnz circle1

//具体我没有测试,你试着把这里的dl用寄存器al,bl之类代替,还有问题的话,你留言

热点内容
智能车算法 发布:2024-11-19 12:34:49 浏览:777
linuxredis启动脚本 发布:2024-11-19 12:31:35 浏览:955
刀片机电脑系统在服务器端 发布:2024-11-19 12:27:16 浏览:861
设备监控源码 发布:2024-11-19 12:26:21 浏览:922
服务器主板是什么样子 发布:2024-11-19 12:08:19 浏览:889
奥迪配置怎么比较 发布:2024-11-19 12:07:33 浏览:522
连接共享打印机无权限访问权限 发布:2024-11-19 12:04:01 浏览:294
大众速腾车载carplay安卓怎么连接 发布:2024-11-19 11:57:12 浏览:515
电脑软件用户密码是什么 发布:2024-11-19 11:51:25 浏览:913
java循环break 发布:2024-11-19 11:50:50 浏览:845