2016-08-31 6 views
1

이 코드 스 니펫이 무한 루프가되는 이유를 누구나 설명 할 수 있습니까?printf 함수로 어셈블리 무한 루프

나는 printf 함수와 관련이 있다고 가정합니다.

q1: .asciz "Hello World\n" 

.global main 

main: 

    movq %rsp, %rbp 

    movq $3, %rcx 
    jmp  bottom 

loop: 
    movq $0, %rax 
    movq $q1, %rdi 
    call printf 

bottom: 
    decq %rcx 
    cmpq $0, %rcx 
    jne  loop 

end: 
    movq $0, %rdi 
    call exit 
+0

당신이 사용하고있는 어셈블러는 무엇입니까? 나는 당신이 내 생각에 어떤 호출 규칙을 사용하고 있는지 확실하지 않습니다. 당신은 printf를 확장하는 libc의 ABI를 오용하고 있습니다. 무한 루프 – DrPrItay

+0

hello.s -o hello.o로 컴파일 중입니다. gcc -o power power.o –

+0

RCX가 https://en.wikipedia.org/wiki/X86_calling_conventions 및 https ://에 따라 삭제되었습니다. /ideone.com/fork/LKBgUL. RCX를 눌러 보존하고 나중에 팝하면 복원 할 수 있습니다. –

답변

0

호출 기능을 보존 할 필요가있는 유일한 레지스터는 다음과 같습니다 RBP, RBX, R12, R13, R14, R15. 다른 모든 것은 호출 된 함수에 의해 변경 될 수 있습니다.

따라서 가능성은 printf와는 RCX 레지스터를 수정하는 것입니다, 그래서 당신이 RCX 밀어 나중에 팝업 경우는 결코 수정되지 않도록 것이라고, 0

에 간다.

printf에 대한 args를 푸시하고있는 것처럼 보이지 않습니다. printf는 2 개의 인수를 취한다고 생각합니다.

+0

'printf'는 최소한 하나의 인수 만 요구합니다 : 형식 문자열. – owacoder

+0

'movq $ q1, % rdi'는 형식 문자열을 전달합니다. x86-64 SysV는 rdi, rsi, rdx, rcx, r8, r9, IIRC에서 args를 전달했습니다. –