指令被识别为具有 NASM %use masm 功能的标签



我写了这个汇编代码。

%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:没有优化。如果未指定短形式,则除条件跳转外,所有操作数都采用长形式。

    因此应该使用长编码。

最新更新