我想学习Linux上的基本asm,我找不到很好的参考。 NASM文档似乎假设您已经知道masm ...我没有在cmp
(英特尔指令参考之外)的文档中找到示例。Linux NASM检测EOF
我写了一个程序,它从标准输入读取一个字节并将其写入标准输出。下面是我尝试在stdin上检测EOF并在EOF达到时退出的修改。问题是它永远不会退出。我只是一直打印从标准输入读取的最后一个字符。问题是在我的EOF检测(cmp ecx, EOF
)和/或我跳转到_exit
标签(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
对于理智的缘故,我验证EOF是-1,这个C:
#include <stdio.h>
int main() { printf("%d\n", EOF); }
我对NASM并不熟悉,但'char'是指向单个字符的指针吗?看起来你可能会比较字符的指针地址和EOF值。如果是这种情况,则需要取消引用指针然后进行比较。 'read'和'write'系统调用将指针指向缓冲区作为参数,而不是单个字符。另外,我会将'char'重命名为非基本C类名称。 – 2012-02-23 16:53:25