Assembly를 사용하여 화면에 문자를 인쇄하는 방법에 대해 약간 혼란 스럽습니다. 아키텍처는 x86 (linux)입니다. C 함수 중 하나를 호출 할 수 있습니까? 아니면 더 간단한 방법이 있습니까? 출력하고자하는 문자는 레지스터에 저장됩니다.Assembly x86의 표준 출력에 문자 인쇄
감사합니다.
Assembly를 사용하여 화면에 문자를 인쇄하는 방법에 대해 약간 혼란 스럽습니다. 아키텍처는 x86 (linux)입니다. C 함수 중 하나를 호출 할 수 있습니까? 아니면 더 간단한 방법이 있습니까? 출력하고자하는 문자는 레지스터에 저장됩니다.Assembly x86의 표준 출력에 문자 인쇄
감사합니다.
물론 일반적인 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
가장 간단한 방법은 putchar(3)
입니다. char 값을 rdi
레지스터 (x86-64의 경우) 또는 edi
(x86의 경우)로 이동하고 putchar
으로 전화하십시오.
예. (x86-64에 대한) :
asm("movl $120, %rdi\n\t"
"call putchar\n\t");
가 표준 출력에 x
를 인쇄합니다.
잘못된 ABI! (x86-64 OS X, 추측에, 레지스터가 주어짐 - 당신은'% rdi'가 아니라'% edi '가 아니라고 생각하고 - 라이브러리 함수의 앞에'_'을 쓰고 싶습니다) –
당신은 맞습니다) 위의 게시물을 수정했습니다. –
코드에서 변경했지만 설명에 여전히 "the edi register"가 표시됩니다. – porglezomp
감사. 하지만 레지스터 ebx가 값 8을 보유하고 문자 '8'을 인쇄하려고합니다. 매개 변수로 ebx를 시도하면 작동하지 않습니다. 따라서이 문제를 해결할 방법이 있습니까? 건배 – user973758
은'printf ("% d", 8)와 동일 할 것입니다;'나는 그 것을 답에 추가했습니다 – Martin