我正在编写一个汇编代码来获取一个数字并打印一些文本与该数字相同的次数。
例如当输入为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
但我得到了无限的“你好!”
最佳答案
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:
关于assembly - NASM:循环变成无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53792296/