Я пытаюсь изучить основы asm на Linux, и я не могу найти очень хорошая ссылка. Документы NASM, кажется, предполагают, что вы уже знаете masm ... Я не нашел примеров в документации cmp
(кроме справочника инструкций Intel).
Я написал программу, которая считывает один байт из стандартного ввода и записывает его в стандартный вывод. Ниже приведена моя модификация, чтобы попытаться обнаружить 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); }