scanf 및 printf를 사용하는 일부 어셈블리 코드가 있는데 몇 가지 문제가 있습니다. 이 두 함수가 동일한 코드에서 사용될 때 레지스터의 값은 손실 된 것 같습니다. 프로그램은 기본적으로 숫자를로드하고 인쇄합니다.어셈블리에서의 호출 규칙 (64 비트) - scanf
extern printf
extern scanf
section .data
a db "set: ", 0
b db "not set: ", 0
reading db "Please enter a number: ", 0
message db "\n", 0
printsent db "%s", 10, 0
printint db "%d", 10, 0
printchar db "%c", 10, 0
readInt db "%d", 0
input db "%d", 0
section .text
global main
main:
hatta:
push rbp,
mov rbp, rsp,
push rbx,
xor rax, rax,
mov rdi, printsent,
mov rsi, reading
call printf,
pop rbx,
xor rax, rax,
mov rdi, readInt,
call scanf,
mov rbx, rdi
push rbx,
xor rax, rax,
mov rdi, printint,
mov rsi, rbx,
call printf,
pop rbx,
pop rbp,
ret
이상한 점은 라인 mov rdi, printint,
이 제거되면, 우리는 정확한 값을 얻을 수 있다는 것입니다 : 우리는
여기에 우리의 코드의 리눅스에
nasm -f elf64 file.asm && gcc -o file file.o && ./file
를 사용하여 실행합니다. 그러나 우리가 printsentence와 같은 일을한다면, 우리는 segmentation fault를 얻는다. 아무도 우리에게이 이유를 말할 수 있습니까?
감사합니다.
호출 규칙이 다양하기 때문에 어떤 OS를 사용하고 있는지 말할 필요가 있습니다. 호출 규칙은 일반 함수와 가변 함수 (예 : printf)간에 차이가 있으므로 읽는 정보를 신중히 선택하십시오. – ams
저는 이것이 어셈블러에서 이런 것들을 코딩하는 것이 요즘 의미가 있다고 생각하지 않기 때문에 이것이 운동이라고 생각합니다. 그것을 수행하는 방법을 찾는 가장 쉬운 방법은 해당 C 프로그램을 작성하고, 좋아하는 컴파일러를 가져 와서'-S' 또는 이와 동등한 것으로 컴파일하여 어셈블러에 넣는 것입니다. –