推到一个完整的堆栈8086组装

时间:2016-01-02 07:17:11

标签: assembly stack push x86-16 pop

PUSH对FULL堆栈的物理后果是什么 令人惊讶的是,当只为堆栈分配2个字节[1个字]并按下三个字然后将它们弹出到不同的寄存器中时,它完成没有任何错误 在推送第二项

时,我能说些什么关于堆栈内容

这里是堆栈段定义:

Stack_segment_name segment para stack
db 2 dup(0) ;define your stack segment
Stack_segment_name ends

以下是代码:

Code_segment_name segment
Main_prog PROC FAR

assume     SS:Stack_segment_name,CS:Code_segment_name,DS:Data_segment_name,ES:Data_segment_name

MOV AX,Data_segment_name ; load the starting address of the data
MOV DS,AX ; segment into DS reg.

MOV AX,1715H
MOV BX,1518H
MOV CX,2944H
PUSH AX
PUSH BX
PUSH CX
POP SI 
POP DI  
POP DX



MOV AH,4CH
INT 21H


Main_prog endp
Code_segment_name ends
    end Main_prog

执行代码后:

SI=2944H
DI=1518H
DX=1715H

1 个答案:

答案 0 :(得分:4)

您在程序中声明的堆栈与CPU看到堆栈的方式不同。

在8086上,CPU处理一个64KB的内存块,它以堆栈的线性地址SS * 16开始。

当你声明一个只有2个字节的堆栈时,第一个push落在你预期的位置,但此后堆栈指针SP为0.下一个push因此减去2(给出0xFFFE)并存储它的操作数在内存中。同样适用于第3 push。由于没有记忆冲突似乎都很好......