推入全栈 8086 组件
PUSH To a FULL Stack 8086 Assembly
PUSH 到 FULL 堆栈的物理结果是什么
令人惊讶的是,当只为堆栈分配 2 个字节 [1 个字] 并 PUSH 三个字然后将它们弹出到不同的寄存器时,它没有任何错误地完成
当 PUSHing 第二个项目时,关于堆栈内容我能说些什么
堆栈段定义如下:
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
您在程序中声明的堆栈与 CPU 看到的堆栈不同。
在 8086 上,CPU 将起始于线性地址 SS*16 的 64KB 内存块视为堆栈。
当您声明只有 2 个字节的堆栈时,第一个 push
到达您预期的位置,但此后堆栈指针 SP 为 0。因此下一个 push
减去 2(给出 0xFFFE)并将其操作数存储在内存中。第三个 push
同样如此。由于没有内存冲突,一切看起来都很好...
PUSH 到 FULL 堆栈的物理结果是什么 令人惊讶的是,当只为堆栈分配 2 个字节 [1 个字] 并 PUSH 三个字然后将它们弹出到不同的寄存器时,它没有任何错误地完成 当 PUSHing 第二个项目时,关于堆栈内容我能说些什么
堆栈段定义如下:
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
您在程序中声明的堆栈与 CPU 看到的堆栈不同。
在 8086 上,CPU 将起始于线性地址 SS*16 的 64KB 内存块视为堆栈。
当您声明只有 2 个字节的堆栈时,第一个 push
到达您预期的位置,但此后堆栈指针 SP 为 0。因此下一个 push
减去 2(给出 0xFFFE)并将其操作数存储在内存中。第三个 push
同样如此。由于没有内存冲突,一切看起来都很好...