Печать символа на стандартный вывод в сборке x86 - PullRequest
4 голосов
/ 20 ноября 2011

Я немного озадачен тем, как напечатать символ на экране, используя Assembly Архитектура x86 (Linux). Можно ли вызвать одну из функций C или есть более простой способ? Символ, который я хочу вывести, сохраняется в регистре.

Спасибо!

Ответы [ 3 ]

5 голосов
/ 20 ноября 2011

Конечно, вы можете использовать любую обычную функцию C.Вот пример NASM, который использует printf для печати некоторого вывода:

;
; assemble and link with:
; nasm -f elf test.asm && gcc -m32 -o test test.o
;
section .text

extern printf   ; If you need other functions, list them in a similar way

global main

main:

    mov eax, 0x21  ; The '!' character
    push eax
    push message
    call printf
    add esp, 8     ; Restore stack - 4 bytes for eax, and 4 bytes for 'message'
    ret

message db 'The character is: %c', 10, 0

Если вы хотите напечатать только один символ, вы можете использовать putchar :

push eax
call putchar

Если вы хотите распечатать номер, вы можете сделать это следующим образом:

mov ebx, 8
push ebx
push message
call printf
...    
message db 'The number is: %d', 10, 0
3 голосов
/ 20 июня 2018

В целях полноты, вот как это сделать без C.

Использование прерываний DOS

AH = 02h - ЗАПИСАТЬ ХАРАКТЕР ДЛЯ СТАНДАРТНОГО ВЫХОДА

Записывает символ в DL.Я не проверял это сам.в синтаксисе NASM что-то вроде

mov ah, 02h
int 21h

x86-32 Linux write syscall

write требует адрес вашей строки.Самый простой способ, который я знаю, это поместить вашего персонажа в стек.

push    $0x21       # '!'
mov     $4, %eax    # sys_write call number 
mov     $1, %ebx    # write to stdout (fd=1)
mov     %esp, %ecx  # use char on stack
mov     $1, %edx    # write 1 char
int     $0x80   
add     $4, %esp    # restore sp 

Информация о порядке регистрации

x86-64 Linux write syscall

Как и выше, но номер вызова теперь равен 1, syscall вместо int $0x80, а регистры соглашения о вызовах отличаются.

push    $0x21       # '!'
mov     $1, %rax    # sys_write call number 
mov     $1, %rdi    # write to stdout (fd=1)
mov     %rsp, %rsi  # use char on stack
mov     $1, %rdx    # write 1 char
syscall   
add     $8, %rsp    # restore sp 
0 голосов
/ 20 ноября 2011

Вызов putchar(3) - самый простой способ. Просто переместите значение char в регистр rdi (для x86-64 или edi для x86) и вызовите putchar.

например. (для x86-64):

asm("movl $120, %rdi\n\t"
    "call putchar\n\t");

выведет x на стандартный вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...