2015-05-09 20 views
5

Próbuję dowiedzieć się, jak uzyskać liczbę elementów w stosie przez odjęcie rejestr sp z bp. Co ja robię źle? I dostać całkowicie błędne WynikNASM - Get liczbę elementów w stosie

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 

Jest to wyjście:

CB.

+0

Czy możesz opublikować dane wyjściowe? –

+0

@ 1.618 Dodałem wyjście –

+1

Sugestia: nie umieszczaj określonego numeru w SP. Prosisz o katastrofę. Jeśli to działa dla ciebie; wspaniały. Istnieje milion innych (znacznie bezpieczniejszych) sposobów, aby dowiedzieć się, gdzie właściwie jest stos. Ponownie, jeśli to działa dla ciebie; duh; w porządku. Widzę wiele zmartwień. –

Odpowiedz

5

Naprawdę mylące rzeczą jest to, że stos rośnie w dół.

porównaniu wyobrażenie większości ludzi stos, stos pracy z w montażu jest „do góry nogami”. "Spód" stosu ma najwyższy adres pamięci, a "wierzchołek" ma najniższy. Po naciśnięciu 2 bajty na stosie, 2 bajty są odejmowana od wskaźnika stosu, nie dodaje się do niej. (Jeśli myślisz o nim w kategoriach podziału pamięci, jest to bezpieczniejsze)

więc wynikiem SUB była -2, która jest „” w ascii. Nie można po prostu przełączać operandów, ponieważ wynik musi przejść do pierwszego operandu, więc powinien to być rejestr ogólnego przeznaczenia. Zamiast tego zmień operacje MOV przed SUB.

+0

Po prostu ciekawy: dlaczego wynik -2? Istnieją trzy PUSH i 2 TZO. Spodziewałem się -1. – boiler96

+1

Ponieważ za każdym razem przesuwasz/wychodzisz 2 bajty. Push jest zawsze tej samej wielkości, niezależnie od tego, jaką wartość naciskasz. –

+1

Metoda również zawiedzie, gdy ramka stosu> 9 bajtów. –