Ich habe versucht, ein Assembly-Programm, das eine Nummer nahm, und dann gedruckt. Aber als ich 1 schrieb, schrieb es 4171. Warum und wie kann ich es reparieren? Ich verwende 64-Bit-Assembly, ich habe es mit nasm -f macho64 scanf.asm
zusammengebaut, und ich habe es mit gcc -o scanf scanf.o -Wl,-no-pie
verbunden. Und ich habe versucht, eckige Klammern um die Zahl im Scan-Makro zu verwenden (für einen Zeiger auf die Variable), aber nasm mach-o hat es nicht erlaubt, also habe ich das nicht gemacht.Assembly Nummer Änderung Fehler
Hier ist mein Code:
; 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
Ihr 'print ans, number' scheint die Adresse von' number' auszudrucken, nicht die Nummer selbst. Was passiert, wenn Sie 'print ans, number' durch' movsx rax, dword [number] '' print ans, rax' ersetzen. In diesem Fall sollte 'mov eax, [number]' 'print ans, rax' auch funktionieren. –
Nasm druckt "scanf.asm: 12: Fehler: Mach-O 64-Bit-Format unterstützt keine absoluten 32-Bit-Adressen", wenn ich versuche "movsx rax, dword [Nummer]", und wenn ich versuche "mov rax, [ Nummer]". – SpilledMango
Okay, versuchen Sie es auf diese Weise, dann 'mov rax, [rel number]' zwingt es, relative RIP-Adressierung zu verwenden –