子程序不从标准输入读取

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.