2016-04-07 8 views
0
section .data 
msg db 'enter number ',10,0 
output db '%hd',0 

section .bss 
val resw 1 

section .text 
global main 

extern printf 
extern scanf 

main : 
    push msg 
    call printf 
    add esp,4 
    push val 
    push output 
    call scanf 
    add esp,8 
    ;movzx eax,word[val] 
    ;push eax 
    push word[val] 
    push output 
    call printf 
    add esp,8 
ret 
+0

Bitte bearbeiten Sie Ihre Frage. Wählen Sie den Code aus und klicken Sie auf die Schaltfläche "{}", um ihn als Code zu formatieren. Dann fügen Sie eine detaillierte Erklärung hinzu, was Sie versucht haben und was das Problem ist. –

+3

Während Sie eine Frage in Ihrem Titel haben, hat Ihr Code absolut keine Erklärung damit. Was lässt Sie glauben, dass Sie nicht in der Lage sind, etwas auf den Stapel zu schieben? Fällt dein Code irgendwie aus? Was ist dein erwartetes Ergebnis? Gibt es Assemblerfehler? Was sind Sie? Abstimmung zum Schließen als unklar. –

+1

Die Aufrufkonvention schreibt vor, dass Argumente mit Vielfachen von 32 Bits ausgegeben werden. Wenn Sie wirklich wollen, können Sie 'esp' um' 2' anpassen, bevor Sie den 'push' machen, und das wird funktionieren, wird aber nicht empfohlen. – Jester

Antwort

2
push word[val] 

Dies drückt nur ein Wort und Sie brauchen einen dword auf dem Stapel haben.
Sie können es tun:

xor ax,ax 
push ax   ;Gives a high word of zero, much like your MOVZX did. 
push word[val] 

Ihre Segmentierungsfehler kommt von der Tatsache, dass Sie insgesamt 6 Bytes geschoben, aber insgesamt 8 Bytes durch add esp,8 entfernt.

+0

ich änderte nur add esp, 8 um esp, 6 hinzuzufügen. und ich bekomme korrekte Ausgabe. Ist es eine gute Übung, ob ich die oben erwähnte Methode von xor ax ...... machen soll? – matheromqq

+2

@matheromqq Das Ausrichten des Stapels auf eine nicht durch 4 teilbare Grenze vor einem Funktionsaufruf ist ** nicht ** eine gute Vorgehensweise im 32-Bit-Code und gegen das [System V 32-Bit-ABI] (http: // www. sco.com/developers/devspecs/abi386-4.pdf). In diesem Dokument bezieht sich _WORD_ auf 4 Bytes (32-Bit-Wert). Es heißt, dass _Argument-Wörter in umgekehrter Reihenfolge auf den Stapel geschoben werden (dh das rechteste Argument in C-Aufrufsyntax hat die höchste Adresse), ** wobei die Wortausrichtung des Stapels von beibehalten wird **. Alle eingehenden Argumente erscheinen auf dem Stack und befinden sich im Stack-Frame des Aufrufers. –

+3

@matheromqq: Sie könnten auch "push word 0" drücken, um '66 6a 00' zu generieren, ein 16bit' push imm '. Oder drücken Sie "ax", ohne es auf Null zu stellen, da der ABI nicht erfordert, dass die Auffüllung Null ist, IIRC. Aber ich würde 'movzx' /' push' empfehlen, weil 'push [mem]' bereits eine 2-Uop-Anweisung ist. Sie sind im Begriff, eine Funktion aufzurufen, die alle Register, in denen Anrufe geklopft werden, überlisten, so dass es keinen Registerdruck geben kann. –

Verwandte Themen