我正在尝试从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。
答案 0 :(得分:0)
对于初学者,您错过了int 0x80
和readin
中的writeout
。
而且,正如您可以看到here,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
。