如何使用带有NASM汇编程序的x86中的Syscall读取和写入stdin / stdout的字节?

时间:2015-04-15 01:20:17

标签: io x86 nasm system-calls cdecl

我正在尝试从stdin读取一个字符串并使用x86,NASM和Syscalls将其打印出来。读取一个字节将是一个函数,写出一个字节将是一个函数。我正在从stdin读取字符串并将每个char放入一个数组中。这是我最初的想法:

;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一起使用,我不认为我做得正确。我也意识到我并没有将这些字符放入arr。

1 个答案:

答案 0 :(得分:0)

对于初学者,您错过了int 0x80readin中的writeout

而且,正如您可以看到heresys_readsys_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