我正在尝试学习Linux上汇编语言的基础知识,但是我找不到一个很好的参考资料。NASM文档似乎假定你已经知道MASM...文档中没有cmp
(除了英特尔指令参考)的示例。
我写了一个从stdin读取单个字节并将其写入stdout的程序。下面是我的修改,以尝试检测stdin上的EOF并在到达EOF时退出。问题是它永远不会退出。它只是一直打印从stdin读取的最后一个字符。我认为问题要么在于我的EOF检测(cmp ecx, EOF
),要么在于跳转到的代码(je _exit
)。
我做错了什么?
%define EOF -1
section .bss
char: resb 1
section .text
global _start
_exit:
mov eax, 1 ; exit
mov ebx, 0 ; exit status
int 80h
_start:
mov eax, 3 ; sys_read
mov ebx, 0 ; stdin
mov ecx, char ; buffer
cmp ecx, EOF ; EOF?
je _exit
mov edx, 1 ; read byte count
int 80h
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, char ; buffer
mov edx, 1 ; write byte count
int 80h
jmp _start
为了方便起见,我用以下C代码验证EOF是否为-1:
#include <stdio.h>
int main() { printf("%d\n", EOF); }