![]() | 第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 |