PUSH对FULL堆栈的物理结果是什么惊人的当为堆栈分配2个字节[1个字]并且PUSH三个字然后将它们弹出到不同的寄存器中时,它完成没有任何错误当推送时我能说什么关于堆栈内容第二项
这是堆栈段定义:
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 回答
您在程序中声明的堆栈与CPU看到堆栈的堆栈不同 .
在8086,CPU处理64KB的内存块,该内存块以线性地址SS * 16开始作为堆栈 .
当你声明一个只有2个字节的堆栈时,第一个
push
落在你预期的位置,但此后堆栈指针SP为0.下一个push
因此减去2(给出0xFFFE)并将其操作数存储在内存中 . 同样对于第3个push
. 由于没有记忆冲突似乎都很好......