汇编中的三种“段”

来源:互联网 发布:淘宝客服聊天记录查看 编辑:程序博客网 时间:2024/06/09 21:51

代码段

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指示),不知道程序安排的栈空间有多大。我们在编程的时候要自己操心栈顶超界的问题 ,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;防止出栈时栈空了仍然继续出栈而导致的超界

0 0