У меня ограниченные знания в программировании на ассемблере. В этом простом коде я возился с al
и ah
и пытался напечатать значение al
, используя _printf
Я взял пролог, эпилог и _printf
коды, связанные со случайными местами. У меня нет полной команды над ними. Я просто пытаюсь увидеть результат моей работы.
section .data
msg db "Answer: %c", 0x0a, 0x00 ;What do the 0x0a and 0x00 mean?
; Considering that al 1 byte long, so I've chosen the %c (char) inside _printf
section .text ;
global _main ;
extern _printf, _exit ;
_main: ;
push ebp ;
mov ebp, esp ;
sub esp, 5 ;
mov al, 2 ; Here are my test lines
shl al, 1 ;
mov ah, al ;
shl al, 2 ;
add ah, al ;
shl al, 1 ;
add al, ah ; The end result is stored in al
mov byte[esp+4], al ; al as argument to msg
mov dword[esp], msg ;
call _printf ;
xor eax, eax ;
mov esp, ebp ;
pop ebp ;
ret ;
; Build (macOS, 32bit)
; nasm -f macho shift.asm -o shift.o
; ld -macosx_version_min 10.8 -no_pie -arch i386 -o shift shift.o -lc
Компилируется и связывается нормально, но выдает ошибку Segmentation fault: 11
.
Как упорядочить ее так, чтобы она печатала значение al
правильно?