2011-11-20 2 views
2

Assembly를 사용하여 화면에 문자를 인쇄하는 방법에 대해 약간 혼란 스럽습니다. 아키텍처는 x86 (linux)입니다. C 함수 중 하나를 호출 할 수 있습니까? 아니면 더 간단한 방법이 있습니까? 출력하고자하는 문자는 레지스터에 저장됩니다.Assembly x86의 표준 출력에 문자 인쇄

감사합니다.

답변

5

물론 일반적인 C 함수를 사용할 수 있습니다. 다음은 몇 가지 출력 인쇄 printf를 사용하는 NASM 예 : 당신은 단지 하나의 문자를 인쇄 할 경우

; 
; assemble and link with: 
; nasm -f elf test.asm && gcc -m32 -o test test.o 
; 
section .text 

extern printf ; If you need other functions, list them in a similar way 

global main 

main: 

    mov eax, 0x21 ; The '!' character 
    push eax 
    push message 
    call printf 
    add esp, 8  ; Restore stack - 4 bytes for eax, and 4 bytes for 'message' 
    ret 

message db 'The character is: %c', 10, 0 

을, 당신은 putchar을 사용할 수

push eax 
call putchar 

당신이 밖으로 인쇄하려면 숫자를 입력하면 다음과 같이 할 수 있습니다.

mov ebx, 8 
push ebx 
push message 
call printf 
...  
message db 'The number is: %d', 10, 0 
+0

감사. 하지만 레지스터 ebx가 값 8을 보유하고 문자 '8'을 인쇄하려고합니다. 매개 변수로 ebx를 시도하면 작동하지 않습니다. 따라서이 문제를 해결할 방법이 있습니까? 건배 – user973758

+0

은'printf ("% d", 8)와 동일 할 것입니다;'나는 그 것을 답에 추가했습니다 – Martin

1

가장 간단한 방법은 putchar(3)입니다. char 값을 rdi 레지스터 (x86-64의 경우) 또는 edi (x86의 경우)로 이동하고 putchar으로 전화하십시오.

예. (x86-64에 대한) :

asm("movl $120, %rdi\n\t" 
    "call putchar\n\t"); 

가 표준 출력에 x를 인쇄합니다.

+0

잘못된 ABI! (x86-64 OS X, 추측에, 레지스터가 주어짐 - 당신은'% rdi'가 아니라'% edi '가 아니라고 생각하고 - 라이브러리 함수의 앞에'_'을 쓰고 싶습니다) –

+0

당신은 맞습니다) 위의 게시물을 수정했습니다. –

+0

코드에서 변경했지만 설명에 여전히 "the edi register"가 표시됩니다. – porglezomp