关于空栈时SP指向问题 汇编栈为空时 ss:sp 为什么要使sp指向最低成子单元-2...

作者&投稿:少梁 (若有异议请与网页底部的电邮联系)
题目不清。
概念弄混了。

想要问单片机的堆栈,却引用《汇编语言》第二版里面的理论。
51 单片机和 80x86 堆栈生长的方向,是相反的。
不能混在一起。

采纳答案说:
【假设SP是0XFF,你存一个AX进去SP就指向1,SP + 2;】
如果是用 80x86 来解释的,就是错误的。

如果是4字节应该是加4不是加3,所以应该是0X74,字节入栈,至少都会存一个字进去,我的C编译器里是入的四字节。就算是能存一个字节进去,也不应该是0X75,如果用0X74为栈顶的话,如果能存一个字节进去应该是0X73,入栈是SP减,出栈是SP加。

汇编中栈问题,ss:sp指向的问题~

ax中的数值就是3,你可在debug中试试。下面是完整的汇编测试程序:

CODE SEGMENT
ASSUME CS:CODE
ORG 100H
START:
PUSH CS
POP DS
PUSH CS
POP ES
MOV AX,1
PUSH AX
MOV AX,2
PUSH AX
MOV AX,3
PUSH AX
MOV BX,SP
POP AX
POP AX
POP AX
MOV SP,BX
POP AX
CALL DISPAX
MOV AH,4CH
INT 21H
DISPAX PROC NEAR
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DS
PUSH CS
POP DS
MOV BYTE PTR NZ,0
PUSH AX
LEA SI,DIVARR
MOV CX,5
@1:
POP AX
MOV DX,0
MOV BX,[SI]
DIV BX
PUSH DX
CMP AL,0
JNE @2
CMP BYTE PTR NZ,1
JE @2
CMP CX,1
JE @2
MOV DL,20H
JMP @3
@2:
ADD AL,30H
MOV DL,AL
MOV BYTE PTR NZ,1
@3:
MOV AH,2
INT 21H
INC SI
INC SI
LOOP @1
POP DX
POP DS
POP SI
POP DX
POP CX
POP BX
RET
DIVARR DW 10000,1000,100,10,1
NZ DB 0
DISPAX ENDP
CODE ENDS
END START

《汇编语言》第二版,书里的原话:
任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈定元素,所以SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2。
不知道你看懂了没
很好理解的

汇编栈为空时 ss:sp 为什么要使sp指向最低成子单元-2 在压入数据 sp+...
答:任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈定元素,所以SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2。不知道你看懂了没 很好理解的

关于空栈时SP指向问题
答:【假设SP是0XFF,你存一个AX进去SP就指向1,SP + 2;】如果是用 80x86 来解释的,就是错误的。

汇编指令执行sp的值如何变化
答:SS:SP始终指向指向栈顶元素。栈空时,SP指向栈底单元的后一个单元;PUSH入栈时,先执行SP=SP-2,再执行向当前指向单元送入数据;POP出栈时,先执行将SS:SP所指单元数据送入寄存器,再执行SP=SP+2

关于汇编堆栈的。
答:当栈是空的时候,栈顶指针SP指向栈底的下一个单元。栈底地址是FFFEH,下一个单元地址是FFFEH+2=0,所以,此时,SS=1000H,SP=0。若先计算物理地址再换算成偏移地址,则1FFFFH+1=20000H,段地址依然是SS=1000H,但因为SP最大只能容纳FFFFH,所以,此时SP产生一个进位,本身变为0。这是一个特例...

什么是栈空、栈满啊?
答:栈空和栈满:1.定义一段地址为一个栈,这段地址是10000~1FFFF,当栈满时,问题很简单,ss=1000,sp=0,使ss:sp指向栈顶元素,但是当栈空时,没有一个元素,sp等于多少呢?2.由此我们先来研究一个简单的问题,假设有一个只能放一个数据的栈,从10000到10001,只能放一个数据,当栈空时,要...

汇编的小问题 帮帮忙 解释一下就行
答:一个空栈的SS:SP是指向栈最低层的下一单元,你前面已经说了栈的大小是16个字节,也就是从10000H~1000FH 栈的最底层应该是1000FH 那它的下一单元就应该是10010H,16字节的空栈栈顶指针应该指向物理地址10010H 物理地址=段地址*16+偏移地址,所以SP=10H 如果不明白的话换一个简单的角度考虑 一...

汇编语言中 栈顶问题~~~ SP=?
答:首先 栈段最小为16字节 但是栈的作用只是动态的临时的存储数据,而不需要定义多么多么大空间。SP相当于IP作为偏移地址,只不过固定了,进栈一次SP=SP-2 一个栈有它的起始SP,SS:SP始终指向最顶元素 (1)栈为空,SP指向(0~F)10H(即F的下面一个空间)它作为起始的,当压栈一次时,先SP=SP-...

...堆栈指针SP指向哪里?当堆栈有数据时,SP指向哪里?
答:【答案】:堆栈的存取原则是后进先出(List In First Out,LIFO),即后存进堆栈的数据将先取出来。当堆栈中无任何数据时,SP所指定的位置称为栈底(Bottom),栈底地址就是SP的初值。当堆栈有数据时,SP将始终指向栈顶(Top),位于栈顶的数据是最后一个被推入堆栈的数据。

SP的堆栈指针
答:在80x86及其兼容机中,"SP"代表堆栈指针。堆栈指针是CPU中的一个特殊的寄存器。 堆栈其实是内存中一段连续的存储区,存储区大小受堆栈指针位数的限制。如:堆栈指针16位,则存储区最大是2^16=64KB。结构如下: 空 空 数据2 数据1 此时,堆栈指针指向“数据2”的位置。若把AX压入堆栈: ...

...操作规则及相关指令格式和使用,堆栈指针SP的变化情况
答:堆栈先入后出,每次入栈栈长度必须为一个字 当栈是空的时候,栈顶指针SP=0。当执行一个PUSH指令的时候,SP=SP-2, POP SP=SP+2