汇编中的三种“段”

    xiaoxiao2021-03-25  61

    代码段

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

    转载请注明原文地址: https://ju.6miu.com/read-37562.html

    最新回复(0)