标签:
节选自王爽《汇编语言》第三章内容
CPU中用16位寄存器来存储一个字,但内存单元是字节单元,一个单元存储一个字节,需要两个地址连接的内存单元来存放。字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。
CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086PC中,内存地址由段地址和偏移地址组成。
Mov 寄存器名称 [内存地址偏移量]
默认段地址存放在DS中。
8086CPU不支持直接将数据送入段寄存器的操作。所以一般是需要把数据送到通用寄存器ax,bx,然后再送入到DS,
问题:将al中的数据送入内存单元10000h
Mov bx,1000H;
Mov ds,bx;
Mov [0], al
写几条指令,累加数据段中前三个字型数据
Mov ax ,123bh
Mov ds,ax
Mov ax,0
Add ax,[0]
Add ax,[2]
Add ax[4]
一个字型数据占两个内存单元,所以偏移地址是0,2,4.
现今的CPU中都有栈的设计,有专门的指令访问栈空间,因此在基于8086CPU编程的时候,可以将一段内存当作 栈使用。
两个基本指令是PUSH(入栈)和出栈(POP)。
8086CPU的入栈和出栈都是以字为单位进行的。
栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。
8086CPU不保证我们对栈的操作不会超界,它只知道栈顶在何处,而不知道用户安排的栈空间有多大。(后来的CPU设计解决评这个问题了吗?)
PUSH POP指令在执行的时候只修改SP,所以栈顶的变化范围是0~FFFFH,栈空的时候,SP=0,一直压栈,直到栈满时SP=0,如果再次
压栈,栈顶将环绕,覆盖原来的内容,一个栈段最大的容量64KB.
标签:
原文地址:http://www.cnblogs.com/huaxiaoyao/p/4379813.html