하나의 번호를 가져 와서 인쇄 한 어셈블리 프로그램을 만들려고했습니다. 하지만 1을 쓸 때 4171을 썼습니다. 왜, 어떻게 고칠 수 있습니까? 나는 64 비트 어셈블리를 사용하고 있는데, nasm -f macho64 scanf.asm
으로 어셈블하고, gcc -o scanf scanf.o -Wl,-no-pie
으로 연결했다. 그리고 스캔 매크로에서 숫자 주위에 대괄호 (대괄호 숫자에 대한 포인터)를 사용하려했지만 nasm mach-o는 그것을 허용하지 않으므로 그렇게하지 않았습니다.어셈블리 번호 변경 오류
; lib.asm
extern _printf
extern _scanf
%macro print 2
push rbp
mov rdi, %1
mov rsi, %2
xor rax, rax
call _printf
pop rbp
%endmacro
%macro scan 2
push rbp
mov rdi, %1
mov rsi, %2
mov rax, 0
call _scanf
pop rbp
%endmacro
; scanf.asm
%INCLUDE "lib.asm"
section .bss
number resd 1
section .text
global _main
_main:
print str_out, qst
scan int_in, number
print ans, number
exit:
mov rax, 0x2000001
xor rbx, rbx
syscall
section .data
str_out db '%s', 0xa, 0
int_in db '%d', 0
int_out db '%d', 0xa, 0
qst db 'Enter a number: ', 0
ans db 'You wrote: %d', 0xa, 0
'print ans, number'는 숫자 자체가 아닌'number'의 주소를 인쇄하고있는 것 같습니다. 'print ans, number'를'movsx rax, dword [number]''print ans, rax'로 대체하면 어떨까요? 이 경우'mov eax, [number]''print ans, rax'도 제대로 작동합니다. –
nasm은 "movsx rax, dword [number]"를 시도 할 때 "scanf.asm : 12 : error : Mach-O 64 비트 형식이 32 비트 절대 주소를 지원하지 않습니다"라는 메시지를 출력하고 "mov rax, 번호]". – SpilledMango
이렇게'mov rax, [rel number]'상대 RIP 주소 지정을 사용하도록하십시오. –