汇编语言寄存器代码段

mov ax,0000    (B8  00  00)
add ax,0123H   (05 23 O1)
mov bx,ax      (8B D8)
jmp bx         (FF E3)

这段长度为10个字节的指令,存放在123BOH-123B9H的一组内存单元中,我们就可以认为,123BOH-123B9H这段内存是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10个字节。
如何使得代码段中的指令被执行呢?将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就自动地将我们定义的代码段中的指令当作指令来执行。CPU只认被CS:IP指向的内存单元中的内容为指令。所以,要让CPU执行我们放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。对于上面的例子,我们将一段代码存放在123BOH}123B9H内存单元中,将其定义为代码
段,如果要让这段代码得到执行,可设CS=123BH, IP=0000H
段小结
(1)段地址在8086CPU的段寄存器中存放。当8086CPU要访问内存时,由段寄存器提供内存单元的
段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址。
(2) CS存放指令的段地址,IP存放指令的偏移地址。
8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。
(3) 8086CPU的工作过程:
①从CS: IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
②IP指向下一条指令;
③执行指令。(转到步骤①,重复这个过程。)
(4) 8086CPU提供转移指令修改CS. IP的内容。
检测点2.3
下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP中的值是多少?

mov  ax,bx
sub  ax,ax
jmp  ax

段扩展阅读

汇编语言中,程序分段(代码段,数据段附加段)
这些段只是逻辑上对数据和代码进行一些划分。

无论数据还是代bai码,本质都是2进du数zhi;当把2进dao数zhuan放入数据段时,计算机才把shu这些zhi2进制数当作数据处理:dao同理,当把2进制数放入代码段时,计算机就把这些2进制数当作代码处理。用DS表示数据段,用CS表示代码段。
代码段
CS,IP与代码段

CS:代码段寄存器
IP:指令指针寄存器
CS:IP:CPU将内存地址CS:IP指向的内容作为当前指令执行

8086PC读取和执行指令过程:
(1)从CS:IP指向的内存单元读取指令,到指令缓冲器
(2)IP=IP+所读指令长度,从而指向下一条指令
(3)执行指令,转到步骤(1),重复该过程

修改CS,IP的指令:
通过改变CS,IP的内容,可以控制CPU要执行的目标指令
方法1:
通过debug中的r命令对寄存器内容修改–rcs,rip
注意:debug是调试手段,不是程序方式
方法2:
转移指令jmp
(1)同时修改CS,IP:
jmp 段地址:偏移地址
jmp 2AE3:3 即将CS改为2AE3,IP改为0003
(2)仅修改IP的内容:
jmp 某一合法寄存器
jmp ax 即将IP内容修改为ax寄存器的内容

数据段
对于8086PC机,可以根据需要将一组内存单元定义为一个段。物理地址=段地址×16+偏移地址
将一组长度为N(N≤64K)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。

8086CPU内存中字的存储:
对8086CPU,16位作为一个字。
(1)16位的字存储在一个16位的寄存器中,高8位放高字节,低8位放低字节。
如对于存放在ax寄存器中的AB12H来说,ah=AB,al=12。
(2)16位的字在内存中需要2个连续字节存储, 低位字节存在低地址单元,高位字节存在高地址单元。
(3)一个字单元由两个连续的内存单元组成,存放一个字型数据。注意区分字型数据和字节型数据

字的传送:
(1)8086CPU可以一次性传送一个字(16位)
(2)CPU从内存中读取数据,通过DS:[address](段地址:偏移地址)找到该内存单元,不写DS时可使用当前默认的DS内容
如:mov ax,[2]表示将默认DS偏移0002后的内存单元的内容送到ax寄存器中
注意:8086CPU不支持将数据直接送入段寄存器,所以修改DS内容时要先将数据送入一般寄存器,再送入段寄存器

栈段
栈结构:栈是一种只能在一端进行插入或删除操作的数据结构
*8086CPU中,有两个与栈相关的寄存器:
栈段寄存器SS - 存放栈顶的段地址
栈顶指针寄存器SP - 存放栈顶的偏移地址
——任意时刻,SS:SP指向栈顶元素*

栈的两个基本的操作:
入栈:将一个新的元素放到栈顶
push ax
(1)SP=SP–2;
(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶
出栈:从栈顶取出一个元素
pop ax
(1)将SS:SP指向的内存单元处的数据送入ax中;
(2)SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
注意:
(1)8086CPU不保证对栈的操作不会超界。
(2)8086CPU 只知道栈顶在何处(由SS:SP指示),不知道程序安排的栈空间有多大。我们在编程的时候要自己操心栈顶超界的问题 ,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;防止出栈时栈空了仍然继续出栈而导致的超界


发布日期:

所属分类: 易语言 标签: