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
Antwort
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.
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
@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. –
@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. –
- 1. Warum ist es nicht möglich, ein Byte auf einen Stapel auf Pentium IA-32 zu schieben?
- 2. XMM-Register zum Stapel schieben
- 3. Ich kann nicht auf Git schieben?
- 4. Wie kann ich eine Tabbar zeigen, wenn eine UIViewController auf den Stapel Navigation schieben
- 5. Wie kann ich auf ein Gitbündel schieben
- 6. kann nicht schieben Dateien auf Remote-Host
- 7. % Benutzername% Variable im Stapel
- 8. Kann ich Seitendaten in marketo manuell schieben
- 9. Mein androidstudio kann nicht nach github schieben
- 10. Stapel nicht leer aber leerer Stapel Ausnahmefehler
- 11. Variable auf gleiche Inhalte von div setzen
- 12. Warum kann ich eine Variable eines Aufzählungstyps nicht inkrementieren?
- 13. Warum kann ich erfolgreich ohne __init__.py importieren?
- 14. Warum kann ich keine neue Zeichenfolge im Debugger verwenden? erfolgreich
- 15. lokale Variablen schieben
- 16. Wie kann ich einen HTML-Link in UIWebView verwenden, um eine Ansicht auf den Stapel zu schieben?
- 17. Wie kann ich Inhalte speichern?
- 18. Warum kann ich diesen Bereich nicht als Variable übergeben?
- 19. GitLab: Kann Code nicht zum Server schieben?
- 20. Verhindern, dass relativ positionierte div Inhalte nach unten schieben
- 21. warum kann ich nicht auf facebook einloggen
- 22. Warum kann ich nicht auf IPackageFragmentRoot zugreifen?
- 23. iPhone SDK: ASIFormDataRequest nicht erfolgreich, warum?
- 24. Schieben Sie eine Variable auf ein Array eine ThreadSafe-Operation?
- 25. Warum "Get-Content" Inhalte nicht live aktualisiert?
- 26. Warum Zeiger auf Stapel löschen ist ein Fehler?
- 27. Kann Commits nicht zu GitHub schieben
- 28. Kann ich nicht über Android Studio zum Git schieben?
- 29. Wie kann ich auf eine Navigatorcontent in einem View-Stapel
- 30. Kollisionserkennung nicht schieben zurück
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. –
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. –
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