1つの番号をとり、それを印刷したアセンブリプログラムを作成しようとしました。しかし、私が1を書いたとき、それは4171を書きました。なぜ、どうすればいいですか?私は、64ビットアセンブリを使用しています、私はnasm -f macho64 scanf.asm
とそれを組み立て、gcc -o scanf scanf.o -Wl,-no-pie
でリンクしました。そして、私はスキャンマクロ(varible番号へのポインタのために)の周りに角括弧を使用しようとしましたが、マスマッハーは許可しませんでしたので、私はそれをしませんでした。アセンブリ番号変更エラー
; 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'もうまくいくはずです。 –
"movs rax、dword [number]"を試してみると、 "movf razを試してみると、scanf.asm:12:エラー:Mach-O 64ビットフォーマットが32ビット絶対アドレスをサポートしていません"数]"。 – SpilledMango
これで 'mov rax、[rel number]'が相対RIPアドレッシングを使用するようにしてください。 –