【发布时间】:2025-12-26 14:25:07
【问题描述】:
当我输入 ld -m elf_i386 -o loop loop.asm 时,我得到标题中所述的错误,知道是什么原因造成的吗?对不起,如果代码看起来很糟糕,对汇编来说还很新。
cr equ 13
lf equ 10
section .bss
numA resb 1
section .text
global _start:
mov [numA],byte 0
call loop1
jmp endend
loop1:
xor cx,cx
mov al, $numA
cmp cx, 0x0A
jle else
inc al
jmp end
else:
dec al
jmp end
end:
mov [$numA], al
inc cx
cmp cx,20
jle loop1
endend:
mov dl,$numA
mov ah,2
int 21h
【问题讨论】:
-
您确定将
.asm文件输入到ld中吗?我认为这行不通,您是说.o吗?然后还显示nasm命令,如何将.asm组装成.o。您可能正在将 asm 编译为 64b 目标文件。为了获得我在 *buntu 上使用的完整 32b nasm->ld->二进制链:nasm -w+all test.asm -l test.lst -f elf32ld -m elf_i386 test.o -o test(对于test.asm)(如果是这种情况,这是许多“如何编译器”之一的副本64b linux 中的 32b asm”问题) -
错字,意思是loop.o,nasm命令:nasm -f elf -F dwarf -g loop.asm
-
我试图编译你的源代码,它有实际的语义/语法问题,有些东西在 x86-32 汇编中没有多大意义。我将尝试猜测您想要实现的目标,并发布固定来源。 ...我有点特别困惑
$numA的意思,为什么那里有美元符号?我还没有在 NASM 源代码中看到,独立美元是指令的当前地址,所以像$-numA这样的东西对我来说意味着什么,但$numA对我来说是未知的。 -
“标识符也可以以 $ 为前缀,表示它旨在作为标识符而不是保留字来读取” 来自docs ...可惜我会忘记这一点,因为我从不使用保留字作为标识符,整洁的功能。
-
我在网上找到了一些关于如何获取循环等的代码,试图学习汇编。程序只是运行一个循环,如果循环 10 时减少它。