Как читать и записывать байт из и в стандартный ввод / вывод с помощью Syscall в x86 с ассемблером NASM?

Я пытаюсь прочитать строку из stdin и распечатать ее обратно, используя x86, NASM и Syscalls. Чтение в байте будет функцией, а запись байта будет функцией. Я читаю строку из стандартного ввода и помещаю каждый символ в массив. Вот моя первоначальная идея:

;read_writer.asm
section .data
    arr times 100 db 0   ; array of 100 elements initialzed to 0
    ptr dd 0

section .text
global _start
_start:
    push ebp   ; setup stack
    mov ebp, esp   ; setup stack
    push, 0x10   ; allocate space for potential local variables
    call readin: ;call read in func
    push eax  ;return char from readin will be in eax, push it for writeout 
    call writeout:
    leave 
    mov eax, 1 ;exit
    mov ebx, 0
    int 0x80

readin:
   push ebp
   mov ebp, esp ; setup stack

   mov eax, 3 ;read
   mov ebx, 1 ;stdin
              ; i feel like i am missing code here bit not sure what

   leave  ;reset stack
   ret ;return eax

writeout:
   push ebp
   mov ebp, esp ; setup stack
   push eax   ;push eax since it was pushed earlier
   mov eax, 4 ;write
   mov ebx, 1 ;stdout
              ; i feel like i am missing code here bit not sure what

   leave  ;reset stack
   ret ;return eax

Пример ввода:

Hello World

Образец вывода:

Hello World

Функции должны использоваться с cdecl, что я не думаю, что я делаю правильно. Я также понял, что я не помещаю символы в обр.

1 ответ

Для начала, вам не хватает int 0x80 в обоих readin а также writeout,

И, как вы можете видеть здесь, оба sys_read а также sys_write ожидать (const) char* в ecx, Этот адрес должен указывать на буфер, в котором хранятся байты для записи / должны быть сохранены прочитанные байты.
Значение edx должно быть установлено количество байтов для чтения / записи.

Так что в readin Например, вы хотите что-то вроде:

mov eax, 3    ;read
mov ebx, 0    ;stdin. NOTE: stdin is 0, not 1
sub esp,4     ; Allocate some space on the stack
mov ecx,esp   ; Read characters to the stack
mov edx,1
int 0x80
movzx eax,byte [esp]  ; Place the character in eax, which is used for function return values
add esp,4

И аналогично для writeout,

Другие вопросы по тегам