Как читать и записывать байт из и в стандартный ввод / вывод с помощью 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
,