【问题标题】:My assembler doesn't seem to output 32-bit code我的汇编器似乎没有输出 32 位代码
【发布时间】:2017-07-03 01:44:23
【问题描述】:

这是我遇到的行为示例。

当汇编以下程序时:

[BITS 32]

mov eax, 0x1234

使用:

nasm -f bin in.asm -o out.bin

我得到以下二进制输出:

B8 34 12 00 00

B8 是 'move into eax' 的操作码,它应该采用 32 位值并将其放入其中(即应该只是 B8 34 12)。而是添加一个额外的00 00,就好像它是一个 64 位值一样。

我不知道这是否是 NASM 特有的问题,因为我没有尝试过其他汇编程序。

【问题讨论】:

    标签: assembly nasm


    【解决方案1】:

    你很困惑。你有 4 个字节。 4 个字节是 32 位。不是 64 位。那将是 8 个字节。

    一对十六进制数字是一个字节,这就是反汇编输出将事物分组为一对十六进制数字的原因。

    考虑一下,作为一个反例,

    [BITS 64]
    
    mov rax, 0xCAFEBABEDEADBEEF
    

    可以组装(然后转储为十六进制)来生产

    0000000 b848 beef dead babe cafe               
    000000a
    

    【讨论】:

    • 另请注意,如果您不制作平面二进制文件,则需要使用-felf64 或其他任何东西,这会使[bits 64] 多余。 [bits 32] 可以让您将 32 位机器代码组装成 64 位目标文件,但这通常没有用。
    • @PeterCordes 一定是在您最近几秒钟之前删除了我不相关的评论。肯定错过了NOT
    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2016-01-02
    • 2020-02-15
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多