assembly - NASM:循环变成无限循环

标签 assembly x86 nasm


我正在编写一个汇编代码来获取一个数字并打印一些文本与该数字相同的次数。

例如当输入为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/

相关文章:

arrays - 数组表达式语法错误

assembly - 如何使用 64 位绝对地址执行调用指令?

linux nasm程序集隔离字符串中的字符

linux - 识别汇编中的库调用

linux - 如何理解 "cmpl $0x0, -0x30(%rbp)"/"je ..."

c - 为什么要在函数序言/结语中使用 ebp?

assembly - jnz检查哪个寄存器

c - 严格别名是单向的吗?

c++ - 如何在 nasm 中创建静态库并与 gcc 链接?

assembly - ".bss"命令在 MSP430 汇编代码中起什么作用?例如, ".bss beep_cnt,2"对变量 beep_cnt2 有何作用?