子程序不从标准输入读取
subroutine not reading from stdin
代码如下
getstr:
; get a LF terminated string from stdin
; in: EAX = dest buffer
; out: ax = bytes read
; EAX NOT preserved, all other registers preserved
;op mod opr1 opr2 comment
;--------------------------------------------------------
push ebx
push ecx
push edx
sub esp, 2 ; allocate memory
mov word [esp], 0x0000 ; zero memory
mov ecx, eax ; set the correct buffer
mov ebx, 0 ; stdin = 0
mov edx, 1 ; 1 byte reads
mov eax, 3 ; syscall read
.loop:
int 0x80 ; do read
test byte [ecx], 0xA
je .done
inc ecx
add word [esp], 1 ; increment the count
jmp .loop
.done:
mov byte [ecx],0x0
pop ax
pop edx
pop ecx
pop ebx
ret
gdb 转储显示已读取 0 个字节
(gdb) info registers
eax 0x0 0
有人知道这是怎么回事吗?
两个错误(假设您使用 NASM):
首先,int 80h / eax=3
改变eax
。因此,对该函数的下一次调用没有希望的 eax
,而是退出代码 1。将标签 .loop
移动到 mov eax, 3 ; syscall read
.
之前
其次,test byte [ecx], 0xA
不比较值。它执行 AND
并相应地设置标志。零标志表示 AND
的结果为零。将行更改为 cmp byte [ecx], 0xA
.
代码如下
getstr:
; get a LF terminated string from stdin
; in: EAX = dest buffer
; out: ax = bytes read
; EAX NOT preserved, all other registers preserved
;op mod opr1 opr2 comment
;--------------------------------------------------------
push ebx
push ecx
push edx
sub esp, 2 ; allocate memory
mov word [esp], 0x0000 ; zero memory
mov ecx, eax ; set the correct buffer
mov ebx, 0 ; stdin = 0
mov edx, 1 ; 1 byte reads
mov eax, 3 ; syscall read
.loop:
int 0x80 ; do read
test byte [ecx], 0xA
je .done
inc ecx
add word [esp], 1 ; increment the count
jmp .loop
.done:
mov byte [ecx],0x0
pop ax
pop edx
pop ecx
pop ebx
ret
gdb 转储显示已读取 0 个字节
(gdb) info registers
eax 0x0 0
有人知道这是怎么回事吗?
两个错误(假设您使用 NASM):
首先,int 80h / eax=3
改变eax
。因此,对该函数的下一次调用没有希望的 eax
,而是退出代码 1。将标签 .loop
移动到 mov eax, 3 ; syscall read
.
其次,test byte [ecx], 0xA
不比较值。它执行 AND
并相应地设置标志。零标志表示 AND
的结果为零。将行更改为 cmp byte [ecx], 0xA
.