章三
寄存器(内存访问)
- 内存单元是字节单位,而一个字要2个字节,则其高位放在高字节,地位放在低字节。
如:
mov bx,6655
mov [1],bx
地址 | 内存单元中的值 |
---|---|
0 | … |
1 | 55 |
2 | 66 |
3 | … |
附注:内存和寄存器之间传送字型数据时,高位对高位,低位对地位
- 栈是FILO(First in Last out)。
CPU不认识栈空间,只能靠SS:SP始终指向栈顶,故谨防栈越界!
①mov ax,1122; push ax;
#ax入栈。注:分号非合法符号,只是为了方便理解分隔。
②mov bx,6677 ; push bx; #bx入栈
如图:
地址 | 内存单元中的值 |
---|---|
0 | 77 |
1 | 66② |
2 | 22 |
3 | 11① |
附注:栈把数据从高往低放
- push入栈详解:
语法:push 某寄存器、段寄存器、内存单元
push指令执行步骤:
- pop出栈详解:
语法:pop 某寄存器、段寄存器、内存单元
pop执行顺序:
总结:push、pop实质上是一种内存传送指令。
注意:8086一个栈段的容量最大是64KB。因为push和pop等指令在执行的时候只修改SP,(而在8086中SP寄存器就16位),所以栈顶的变化范围是0~FFFF。栈空时,则SP为0,一直压栈,直到栈满SP=0;若此时再次压栈,栈顶将会环绕,覆盖原来的内容。
故而:
- 若将 10000H~100F0H视为一段栈空间,
则:
须将SS设为1000;SP设为F1(起始地址F0+1,或者也可以理解成起始字地址EF+2) - Debug的T命令在执行修改寄存器SS的指令时,下一条指令也会紧接着被执行。
d 2000:0 f #显示0~f的内容