欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

汇编语言学习【1】-寄存器

程序员文章站 2022-06-07 08:48:49
...

寄存器:CPU内能够存储数据的器件

AX,BX,CX,DX,为什么要分高字节和低字节?因为8086要向上向上兼容80386,80386是 8 位机。

程序运行

CS:CPU要运行的程序的段地址

IP:CPU要运行的程序的偏移地址

CS:IP共同指向程序的首地址

数据的内存空间

           DS                  : 保存要操作的数据的段地址

【address】内存单元:要操作的内存的偏移地址

jmp指令和DS寄存器

jmp指令可以同时修改CS、IP的内容,可用指令“jmp 段地址:偏移地址”,使CPU从指定地址读取命令

如 jmp 2AE3:3 执行后:CS = 2AE3H, IP = 0003H, CPU将从2AE33H处地区指令

若仅想修改IP的内容,可用指令“jmp 某一合法寄存器”完成

eg:

jmp ax , 将ax的内容赋值给IP寄存器,用寄存器的值修改IP值

DS

通常用来存放要访问数据的段地址

读取某一内存单元数据的方式

访问1000:0地址的数据

mov bx, 1000H   //DS不支持mov ds 1000H,所以只能用寄存器传值的方式将1000H传入DS
mov ds, bx      //DS支持寄存器传值
mov al, [0]     //[……]表明一个内存单元,[0]表明该内存单元的偏移地址为0.

上面3步执行完就可以将1000:0的数据传到AL寄存器中

MOV在DOS下的操作数的传输方向

 

汇编语言学习【1】-寄存器

小结

1、字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节放在低地址单元中,高位字节存放在高地址单元中。

2、用 mov 指令要访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中

3、[address] 表示一个偏移地址为 address 的内存单元。

4、在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低 8 位寄存器相对应。

5、mov 、add 、sub 是具有两个操作对象的指令。jmp 是具有一个操作对象的指令。

SS :提供栈顶的段地址

SP :提供栈顶的偏移地址

SS:SP:指向栈顶的地址

  • push命令的的执行过程

第一步:SP = SP - 2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶

第二步:将数据送入 SS:SP 指向的内存单元处, SS:SP 此时指向新栈顶

任意时刻,SS:SP 指向栈顶元素。当栈为空时,SS:SP指向栈最底部内存单元偏移地址+0001H的内存单元

8086 没有对栈顶上限和栈底进行监控,所以发生栈顶超界问题无法报警或者提示。

PUSH 和 POP

        可操作的对象有寄存器、段寄存器、内存单元【以字单元为单位】

         POP 的操作结果是将栈顶的字传给操作的对象,不一定将原来的数传给寄存器,如下所示

mov ax,1000
mov bx,2000
push ax
push bx
pop ax  //此时栈顶的数值是2000,因为是后来压入的
pop bx  

小结:

1、出栈、入栈指令根据 SS:SP 指示的地址,按照栈的方式访问单元

2、push指令的执行步骤:1)SP = SP - 2;  2) 向 SS:SP 指向的字单元中送入数据。

3、pop 指令的执行步骤: 1)从 SS:SP 指向的字单元中读取数据; 2) SP = SP + 2

4、任意时刻,SS:SP 指向栈顶元素

5、8086 CPU 只记录栈顶,栈空间的大小我们要自己管理

6、push、pop 实质上是一种内存传送指令,注意他们的灵活应用

段的综述【清楚明了,比大学老师讲的清楚一万倍】

汇编语言学习【1】-寄存器