2015-05-09 64 views
5

我想弄清楚如何通過用bp減去sp寄存器來獲取堆棧中的項數。我究竟做錯了什麼?我得到完全錯誤的結果NASM - 獲取堆棧中的項數

MOV bp, 0x7E00 
MOV sp, bp 

PUSH 'A' 
PUSH 'B' 
PUSH 'C' 

POP bx 
MOV al, bl 
CALL _printchar 

POP bx 
MOV al, bl 
CALL _printchar 

MOV bx, sp 
SUB bx, bp 
ADD bx, 48 ;To get ascii number 
MOV al, bl 
CALL _printchar 

這是輸出:

CB。

+0

你可以發佈輸出嗎? –

+0

@ 1.618我加了輸出 –

+1

建議:不要在SP中放一個具體的號碼。你在問災難。如果這對你有效;大。有一百萬其他(更安全)的方式來找出棧的實際位置。再次,如果這對你有用;咄;好的。我看到很多擔心。 –

回答

5

關於堆棧的一個非常令人困惑的事情是它增長下來。

與大多數人的心理意象相比,您在彙編中使用的堆棧是「顛倒的」。堆棧的「底部」具有最高的內存地址,「頂部」具有最低的地址。當您將2個字節推入堆棧時,2個字節是從堆棧指針中減去,未添加到堆棧指針。 (如果考慮內存分區,這實際上更安全)

所以你的SUB的結果是-2,這是'。'在ascii中。您不能只是切換操作數,因爲結果需要進入第一個操作數,所以它應該是通用寄存器。相反,在SUB之前改變MOV操作。

+0

只是好奇:爲什麼是結果-2?有三個PUSHes和兩個POP。我期望-1。 – boiler96

+1

因爲您每次都按下/彈出2個字節。無論您推動什麼價值,推動總是相同的大小。 –

+1

堆棧幀> 9個字節時,方法也會失敗。 –