我写了这个汇编代码。
%use masm
global _start
section .data
realarray dq 0x1
dq 0x2
dq 0x3
dq 0x4
section .text
_start:
mov rsi, 0x5
mov rdi, realarray
mov rax, 0x0
mov rcx, 0x1
loop:
cmp rcx, rsi
jg end
add rax, qword ptr [rdi+8*rcx]
add rcx, 0x1
jmp loop
end:
nop
nop
所以,我编译了代码。
nasm -felf64 -O0 code.asm
ld code.o
但是,它变成了一个意外的可执行文件。下面,卸载exe文件
$objdump -d -M intel a.out
a.out: file format elf64-x86-64
Disassembly of section .text:
0000000000401000 <_start>:
401000: 48 be 05 00 00 00 00 movabs rsi,0x5
401007: 00 00 00
40100a: 48 bf 00 20 40 00 00 movabs rdi,0x402000
401011: 00 00 00
401014: 48 b8 00 00 00 00 00 movabs rax,0x0
40101b: 00 00 00
40101e: 48 b9 01 00 00 00 00 movabs rcx,0x1
401025: 00 00 00
0000000000401028 <loop>:
401028: 48 39 f1 cmp rcx,rsi
000000000040102b <jg>:
40102b: 48 03 04 cf add rax,QWORD PTR [rdi+rcx*8]
40102f: 48 81 c1 01 00 00 00 add rcx,0x1
401036: e9 ed ff ff ff jmp 401028 <loop>
40103b: 90 nop
40103c: 90 nop
为什么jg end
指令被识别为标签
还有,为什么跳转指令的行为很奇怪?
请说明您需要什么进一步的信息。
-
根据MASM兼容性支持文档(NASM版本2.15.05(:
END
指令被忽略。由于NASM是开源的,您可以很容易地验证这一点:
end
是一个伪宏。因此线路jg end
实际上是正确地简单地声明标签CCD_ 4。
-
由于预处理器(在扩展
end
宏时(发出规范化LOC,因此不会触发孤立标签警告。如果你打电话给nasm ‑E code.asm
(意思只是预处理(你会看到a。m.线路扩展到
jg : %line 17+0 code.asm %line 18+1 code.asm
如果标签没有尾部冒号,则会触发孤立标签警告。
-
快速而肮脏的解决方案是简单地
%unimacro end 0+
在CCD_ 6之后并且在
end
的第一次出现之前。 -
就像彼得·科德斯一样,我不知道是什么意思
[…]跳转指令异常[…]
-O0
的文档清楚地表明‑O0
:没有优化。如果未指定短形式,则除条件跳转外,所有操作数都采用长形式。因此应该使用长编码。