printf를 호출하는 몇 가지 서브 루틴을 정의하려고합니다. 다음 아주 사소한 예이다 : 여기서어셈블리 서브 루틴은 메인에서 호출조차하지 않고 두 번 호출됩니다.
extern printf
LINUX equ 80H
EXIT equ 60
section .data
intfmt: db "%ld", 10, 0
segment .text
global main
main:
call os_return ; return to operating system
os_return:
mov rax, EXIT ; Linux system call 60 i.e. exit()
mov rdi, 0 ; Error code 0 i.e. no errors
int LINUX ; Interrupt Linux kernel
test:
push rdi
push rsi
mov rsi, 10
mov rdi, intfmt
xor rax, rax
call printf
pop rdi
pop rsi
ret
테스트는 화면에 출력 번호 10의 printf 호출을 갖는다. 내가 전화를받지 않아도 전화가 걸릴 것으로 기대하지는 않는다.
그러나 컴파일하고 실행하는 경우 :nasm -f elf64 test.asm
gcc -m64 -o test test.o
내가 출력을 얻을 :
10
10
을 나는 완전히 당황 누군가가 이런 일이 이유를 설명 할 수 있다면 궁금 해요?
감사합니다 : 64 비트 시스템 호출에 대한
는 대신syscall
명령을 사용! printf를 호출하는 것과 마찬가지로 rax 대신 rdi에 값 60 (EXIT)을 넣습니까? –아니요,'rax'에 syscall 번호를 넣고'rdi'에 첫 번째 인자를 넣는 것이 정확합니다. 커널 syscall ABI의 일부 문서 및 사용자 수준 호출 규칙과의 차이점은 http://www.x86-64.org/documentation/abi.pdf (특히 부록 A)를 참조하십시오. –
계속해서 미안하지만, "int LINUX"라는 줄을 변경하여 syscall을 호출하고 extern syscall을 맨 위에 추가하고 여전히 10 개를 얻습니다. 당신이 저의 전화하는 방법에 대한 간단한 예를 보여줄 수 있습니까? 고마워요 :) –