2014-09-11 4 views
0

음 .. 몇 가지 시도를했지만 작동하지 않습니다.어셈블리에서 printf를 호출하는 중 - 작동하지 않습니다.

_hello의 주소를 printf() 기능에 맞게 올바르게 푸시하려면 어떻게해야합니까? 나는이 프로그램은 단순히 충돌하는 것을 의미한다 " 작동하지 않음"으로

.intel_syntax noprefix 

.extern printf 

.global printf2 

_hello: .ascii "Hello World!\0" 

printf2: 
    push ebp 
    mov ebp, esp 

    push _hello 
    call _printf 

    pop ebp 
    ret 

.

+1

'_printf '를 호출 한 후'add esp, 4'가 누락되지 않았습니까? – Michael

+0

@ 마이클 : 그렇습니다.하지만 핵심 문제는 아닙니다. –

+0

'_printf'를 호출 한 후 스택을 올바르게 정리하지 않았습니다. 따라서'pop ebp'는 유효하지 않은 값을'ebp '로 이동시킵니다. –

답변

2

사용중인 OS를 식별 할 수 없습니다.

이 Windows 용는 MinGW 가스에 대한 올바른 :

.intel_syntax noprefix 

.extern _printf 
.global _printf2 

_hello: .ascii "Hello World!\0" 

_printf2: 
    push ebp 
    mov ebp, esp 

    push OFFSET _hello 
    call _printf 
    add esp, 4 

    pop ebp 
    ret 

그리고이 하나의 리눅스-GAS를위한 것입니다

.intel_syntax noprefix 

.extern printf 
.global printf2 

_hello: .ascii "Hello World!\0" 

printf2: 
    push ebp 
    mov ebp, esp 

    push OFFSET _hello 
    call printf 
    add esp, 4 

    pop ebp 
    ret 

은 밑줄의 다양한 사용을 고려!

+0

이 시점에서 컴퓨터 과학을 공부하는 데 수년 동안 많은 시간을 보냈는데 고마워요.하지만 실종 된 'OFFSET'교육이었습니다! – displayname

+0

MinGW-GAS에 대한 유용한 참고 자료는 어디에서 찾을 수 있습니까? – displayname

+0

@StefanFalk : 아직'.intel_syntax'에 대한 유용한 참조를 찾지 못했습니다. 의심 스럽지만 나는 MASM-Syntax를 시도해 본다. – rkhb

관련 문제