目录 上一页 下一页 下一章

第2章 开始设计程序 -21-

执 行:PUSH指令使"堆栈"中存入了寄存器或存储单元中数据的副本,POP指令会使"堆栈"中最顶端的数据出栈并进入给出的寄存器或存储单元中
  "堆栈"是内存中一段连续的存储单元,它主要用于临时存放数据。堆栈在内存中的位置可以是任何一段空闲存储单元,它的段地址由SS寄存器指示,而数据存放的位置由堆栈指针SP寄存器指示。那么堆栈段在应用上与一段存储段有何差别呢?
① 堆栈中保存的数据都是16位的,我们把16位的数据称为"字(WORD)"。8位数据无法用PUSH指令放入堆栈;
② 其次,和程序不一样,堆栈的起始于内存"高地址"位置,这可以通过R命令观察到。进入DEBUG之后使用R命令查看各个寄存器的值,可以看到指令指针IP寄存器指向偏移0100H,而"堆栈指针"SP寄存器则指向0FFEEH。
③ PUSH进栈的数据总是从高地址向低地址方向排列,每执行一次PUSH指令,SP寄存器就会自动减2,同时数据存入SP指向的位置。也就是说,只要不人为修改SP寄存器,那么SP将永远指向最后一个进入堆栈的数据;
④ 和PUSH指令相反,POP指令会把SP寄存器指向的数据取到指定寄存器中,同时SP会自动加2。所以,POP指令总是取出堆栈最后一个数据,即堆栈具有"后进先出"的性质。

图2-6 DEBUG状态下的堆栈设置
PROG1-B
0B1D:0100 MOV CX,0800
0B1D:0103 PUSH CX
0B1D:0104 IN AL,61
0B1D:0106 XOR AL,02
0B1D:0108 OUT 61,AL
0B1D:010A MOV CX,0500
0B1D:010D LOOP 010D
0B1D:010F POP CX
0B1D:0110 LOOP 0103
0B1D:0112
  图2-6表示了进入DEBUG后代码和堆栈的位置。为了更好地说明堆栈的特性,我们用DEBUG编一小段程序:
C:\ASM\>DEBUG[Enter]
-a100[Enter]
0B01:0100 mov ax,1234
0B01:0103 mov bx,abcd
0B01:0106 push ax
0B01:0107 push bx
0B01:0108 pop ax
0B01:0109 pop bx
0B01:010A [Enter]
;← 输入这些内容

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章