Программирование на ассемблере Я не могу дать регистр al в качестве аргумента _printf - PullRequest
1 голос
/ 12 апреля 2020

У меня ограниченные знания в программировании на ассемблере. В этом простом коде я возился с 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 правильно?

1 Ответ

2 голосов
/ 12 апреля 2020

Даже если вас интересует только AL, вы можете вывести обычное целое число от EAX. Он будет иметь небольшое числовое значение.

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
movzx eax, al  ; -> EAX=52
push eax
push msg
call _printf
add  esp, 8
xor eax, eax
ret           
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...