2015-05-09 16 views
5

Sp kayıtlarını bp ile çıkararak yığındaki öğelerin sayısını nasıl elde edeceğimi anlamaya çalışıyorum. Neyi yanlış yapıyorum?NASM - yığın içinde öğe sayısını alın

CB: Bu çıkış olduğunu

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 

tamamen yanlış bir sonuç almak.

+0

Çıkışı gönderir misiniz? –

+0

@ 1.618 –

+1

çıkışını ekledim Öneri: SP'ye belirli bir sayı koymayın. Felaket istiyorsun. Bu sizin için çalışıyorsa; harika. Yığının gerçekte nerede olduğunu bulmak için bir milyon daha (daha güvenli) yollar vardır. Yine, bu sizin için çalışıyorsa; yaa; Tamam. Birçok endişe gördüm. –

cevap

5

Yığın hakkında gerçekten kafa karıştırıcı bir şey aşağı büyür.

Çoğu insanın bir yığının zihinsel görüntüsüyle karşılaştırıldığında, montajda çalıştığınız yığın "baş aşağı" olur. Yığının "alt kısmı" en yüksek bellek adresine sahiptir ve "üst" en düşük değere sahiptir. Yığın üzerine 2 bayt bastığınızda, 2 bayt çıkarıldı, yığın işaretçiden eklenir. (Bellek bölümleme açısından düşünürseniz, bu gerçekten daha güvenlidir)

SUB'nızın sonucu -2 idi, bu da '.' ascii içinde. İşlenenleri değiştiremezsiniz çünkü sonuç ilk işlenene girmelidir, bu yüzden genel amaçlı bir kayıt olmalıdır. Bunun yerine, SUB'tan önceki MOV işlemlerini değiştirin.

+0

Sadece meraklı: neden sonuç -2? Üç PUSH ve 2 POP var. -1 bekleniyor. – boiler96

+1

Çünkü her seferinde 2 baytlık itiyorsunuz. Bir itme, hangi değeri zorladığınızdan bağımsız olarak daima aynı boyuttadır. –

+1

Yöntem, yığın çerçevesi> 9 bayt olduğunda da başarısız olur. –

İlgili konular