繁体   English   中英

如何将汇编代码段转换为二进制机器代码段?

[英]How to translate assembly code snippet into binary machine code snippet?

是否可以自动将x86汇编代码段(不是完整程序)转换为相应的二进制机器代码段?

例如:

xor eax, eax
mov [ebx + 12], eax

成:

31 c0
89 43 0c

我真的只需要相应的字节集。 通常我会查看一些指令集引用并手动翻译它,但我很确定有一些程序会自动执行它。

如果你知道这样的工具,请告诉我它的名字或分享链接。

我为我的问题做了一个解决方法。 它适用于Windows平台,并使用与Visual Studio一起使用的ML64汇编程序。 我用这个模板创建了一个template.asm文件:

    .code

main proc
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop

; -------------------------------------------
; enter assembly code here
; -------------------------------------------

    mov [ebx + 12], eax
    xor eax, eax

; -------------------------------------------

    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
main endp

end

然后我编译它:

ml64 /c template.asm

知道nop指令被转换为0x90我可以编写一个程序,在两个10 x 0x90字节的块之间搜索字节。

我知道两个主要的装配工: NASMMASM

汇编程序有几种符号变体,据我所知,MASM与VS语法更兼容。

这些从程序集生成机器代码。 如果要查看十六进制字节,请使用首选的十六进制编辑器。

到目前为止我只在Windows下使用NASM,所以我无法告诉你有关VS集成的任何信息,但通常汇编程序应该是你正在使用的工具。

我有类似的情况。 不过,我的解决方案只适用于gcc工具链。

假设你在code.s中有你的程序集,那么下面的代码就可以了:

$ gcc -c code.s && ld -o output.bin code.o --oformat=binary -Ttext=0 2>/dev/null && rm code.o

在output.bin中,您将获得组装的指令。 如果您希望它们采用十六进制格式,则可以执行以下操作(仅适用于Linux或使用xxd的系统):

$ xxd -p output.bin

你可以使用fasm 它可以将汇编代码的自包含片段编译成二进制文件。 非常有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM