2017-12-05 44 views
0

누군가이 코드를 어떻게 설명 할 수 있습니까? 나는 이것을 이해할 줄 알았지 만 분명히 나는 ​​이해하지 못한다.Cant가 어셈블리 어셈블리에서 작동합니다. 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 

제 질문은, 왜 않습니다이 밖으로 인쇄에만 3 번 대신 모든 숫자 3과 15

+0

어셈블하고 실행하면 결과물에서 코드의 역할을 이해할 수 있습니다. 중요한 사항 : Linux x86-64 printf와 같은 가변 함수 호출 규칙 및 _C_ 라이브러리 printf 작동 방법 이해이 코드는'ret' 전에'pop rbp'가 누락되어 있으므로 충돌이 발생할 가능성이 있습니다 –

+0

구체적으로 당신의 질문은 무엇입니까? 그게 뭐가 잘못 되었 니? 런타임에 링크가 실패하거나 실패하지 않습니까? –

+0

Windows 용 적합 x64 네이티브 어셈블리를 작성하는 것은 예외 해제를위한 특정 정렬 규칙을 따라야하기 때문에 어렵습니다. [MSDN] (https://docs.microsoft.com/en-us/cpp/build/unwind-helpers-for-masm)을 참조하십시오. –

답변

2

R8은 휘발성 레지스터 (발신자 저장은)이며이 printf와 덮어 쓸 수 있기 때문에. 함수 호출을 통해 보존되는 RBX, RBP, R12-R15를 사용할 수 있습니다. - Michael Petch