2015-05-09 26 views
5

Sto cercando di capire come ottenere il numero di elementi nello stack sottraendo il registro sp con bp. Che cosa sto facendo di sbagliato? Ottengo risultato del tutto sbagliatoNASM: Ottieni il numero di elementi nello stack

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 

Questa è l'uscita:

CB.

+0

Puoi pubblicare l'output? –

+0

@ 1.618 Ho aggiunto l'uscita –

+1

Suggerimento: non inserire un numero specifico in SP. Stai chiedendo un disastro. Se questo funziona per te; grande. Esistono altri milioni di modi (più sicuri) per scoprire dove si trova effettivamente lo stack. Di nuovo, se questo funziona per te; duh; va bene. Vedo molte preoccupazioni. –

risposta

5

Una cosa davvero confusa sullo stack è che si riduce.

Rispetto all'immagine mentale della maggior parte delle persone di uno stack, lo stack con cui si lavora in assemblea è "capovolto". Il "fondo" della pila ha il più alto indirizzo di memoria, e il "top" ha il più basso. Quando si inviano 2 byte nello stack, 2 byte sono sottratti dal puntatore dello stack, non aggiunti ad esso. (Se ci pensi in termini di partizionamento della memoria, questo è in realtà più sicuro)

Quindi il risultato del tuo SUB era -2, che è '.' in ascii. Non puoi semplicemente commutare gli operandi in giro, perché il risultato deve entrare nel primo operando, quindi dovrebbe essere un registro generale. Invece, modificare le operazioni MOV prima del SUB.

+0

Solo curioso: perché il risultato -2? Ci sono tre PUSH e 2 POP. Mi aspettavo -1. – boiler96

+1

Perché stai premendo/scoppiando 2 byte ogni volta. Una spinta ha sempre le stesse dimensioni, indipendentemente dal valore che stai spingendo. –

+1

Anche il metodo fallisce quando stack frame> 9 byte. –