我正在编写一个汇编代码来获取一个数字,并打印一些与该数字相同的文本。
例如,当输入为4时,我要写“ Hello!”。 4次。
我的代码:
section .data
msg db 'Hello!',0xA
len equ $-msg
section .bss
n resb 1
section .text
global _start
_start:
mov edx, 1
mov ecx, n
mov ebx, 0
mov eax, 3
int 0x80
mov ecx, n
loop1:
push ecx
mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80
pop ecx
loop loop1
mov eax, 1
int 0x80
我在终端中使用此代码运行它
nasm -f elf32 test.asm
ld -m elf_i386 -o test test.o
./test
但是我得到一个无限的“你好!”
答案 0 :(得分:3)
mov ecx, n
在NASM中,类似这样的指令将变量的地址加载到ECX
中。
(MASM会抱怨该变量不是双字!)
您知道这一点是因为您将其正确地用于输入单个字符。
但是,初始化循环计数器的指令应已取消引用以获得实际输入。您需要为此使用方括号。
仅凭现在这还不够!您得到的输入代表一个数字字符,您需要该数字的实际值。
例如如果输入字符“ 4”,则变量 n 将保留52。
movzx ecx, byte [n] ; Load 1 byte and store in dword register
sub cl, '0' ; Convert from character "4" to value 4 (e.g.)
loop1: