当我输入 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
Run Code Online (Sandbox Code Playgroud)
在 NASM 中,$numA与numA. 前导$阻止汇编程序将其视为寄存器名称。因此,你可以写mov eax, [$eax]加载eax从一个叫做符号寄存器eax。(因此您可以与使用的 C 链接int eax = 123;)
所以mov [$numA], al看起来很奇怪,但这真的只是mov [numA], al错误的根源,而不是错误的根源。
您收到了地址低字节mov dl,$numAa的错误mov dl, imm8。
链接器警告您,因为 的地址numA不适合 1 个字节,因此r_386_8重定位将不得不截断地址。
在_8告诉你它是询问连接器,填补了8位(1个字节)作为绝对地址的搬迁。(8 位相对分支位移具有不同的重定位类型,尽管通常您会使用 32 位位移来跳转到另一个文件中的符号。)
该r_386告诉你这是在i386搬迁,而不是某种类型的r_x86_64迁移(可能是绝对或RIP相对),或MIPS跳跃目标重新定位(这将需要右移了2偏移)。可能相关:System V gABI 中的重定位(通用 ABI,i386 SysV psABI 是“处理器补充”)。