2017-12-05 8 views
0

Kann jemand bitte erklären, was ist mit diesem Code? Ich dachte, ich hätte das verstanden, aber anscheinend nicht.Kann keine Schleife in ASSEMBLY x64 Nasm

global main 
    extern printf 
    extern scanf 

section .data 

numberFormat: db '%d', 10, 0 

section .text 

    main: 

    push rbp   
    mov r8, 2  

    loop: 

    add r8, 1 
    mov rdi, numberFormat 
    mov rsi, r8 
    mov rax, 0 
    call printf 

    cmp r8, 15 
    jl loop 

    mov rax, 0  ; normal exit 
    ret 

meine Frage ist, warum ist dieser Druck aus nur Nummer 3 anstelle aller Zahlen zwischen 3 und 15

+0

Wenn Sie es zusammenbauen und ausführen, sollte die Ausgabe Ihnen eine gute Idee geben, was der Code tut. Dinge, die wichtig zu wissen sind: Linux x86-64 Aufrufkonvention für variadic Funktionen wie printf und Verständnis, wie die _C_ Bibliothek printf funktioniert Auch fehlt diesem Code ein 'pop rbp' vor dem' ret', so dass Sie wahrscheinlich einen Absturz haben –

+0

Was ist deine Frage speziell? Was ist daran falsch? Kann die Verbindung zur Laufzeit nicht hergestellt werden oder fehlschlagen? –

+0

Beachten Sie, dass das Schreiben von konformer nativer x64-Assembly für Windows eine Herausforderung darstellt, da Sie bestimmte Ausrichtungsregeln für das Ausrollen der Ausnahme einhalten müssen. Siehe [MSDN] (https://docs.microsoft.com/en-us/cpp/build/unwind-helpers-for-masm) –

Antwort

2

Da r8 ein flüchtiges Register (Anrufer gespeichert) ist und es von printf überschrieben wird. Sie könnten RBX, RBP, R12-R15 verwenden, die bei einem Funktionsaufruf erhalten bleiben. - Michael Petch