gpt4 book ai didi

c - 如何让 Watcom C 编译器(wcc)和 WASM 生成相同的 8086 机器码?

转载 作者:行者123 更新时间:2023-12-05 04:21:26 25 4
gpt4 key购买 nike

对于此 C 源代码:

int add(int a, int b) { return a + b; }

,用于 8086 的 Watcom C 编译器 (wcc -s -ms -os -0 prog.c) 生成以下机器码(十六进制):01 D0 C3 , 反汇编为add ax, dx (01 D0) + ret (C3).

对于这个程序集源代码:

PUBLIC  add_
EXTRN _small_code_:BYTE
_TEXT SEGMENT BYTE PUBLIC USE16 'CODE'
add_: add ax, dx
ret
_TEXT ENDS
END

,Watcom 汇编程序(WASM,wasm -ms -0 prog.wasm)生成以下机器码(十六进制):03 C2 C3,反汇编为添加 ax, dx (03 C2) + ret (C3).

因此,它们生成相同的 8086 汇编指令的不同二进制编码 add ax, dx

仅供引用,如果我在 Watcom C 内联汇编中实现该函数,那么机器代码输出将与 WASM 相同。

不同指令编码的集合:

  • 添加 ax, dx。 wcc: 01 D0; wasm:03 C2
  • mov bx, ax。 wcc: 89 C3; wasm:8B D8
  • 添加 ax,字节 9。 wcc: 05 09 00; wasm:83 C0 09

如何让 Watcom C 编译器(用于 C 代码)和 WASM 生成具有相同二进制编码的指令?是否有命令行标志或其他一些配置选项?我找不到任何内容。

我需要它的原因是我想通过仅编写 WASM 源来重现一个用 Watcom C 编写的可执行程序文件,并且我希望最终输出与原始输出完全相同。

最佳答案

这个答案的灵感来自@RaymondChen 的评论。

这里有一个繁琐的多步骤方法来更改 wcc 发出的机器代码以匹配 wasm 的输出:

  1. 照常将 C 源代码 witm wcc(OpenWatcom 的一部分)编译为 .obj 文件。

  2. 使用dmpobj(OpenWatcom 的一部分)提取_TEXT 段的机器代码字节。

  3. 使用 ndisasm(NASM 的一部分,ndisasm -b 16 file.obj)反汇编机器代码字节。

  4. 编写并运行自定义源文本过滤器以仅保留汇编指令并将其转换为 WASM 语法。

  5. 使用 wasm(OpenWatcom 的一部分)生成第二个 .obj 文件。

  6. 使用 dmpobj 提取第二个 .obj 文件的 _TEXT 段的机器码字节。

  7. 编写并运行一个自定义二进制过滤器,用从第二个 .obj 文件中提取的等效字节替换第一个 .obj 文件的 _TEXT 段中的机器代码字节,使用dmpobj 调用输出中的偏移量。

这些步骤避免使用 wdis -a(从 .obj 到程序集源的转换),因为这是有损的(它不包括 .obj 文件中的所有内容),这可能会产生不需要的更改,以后会引起问题。

关于c - 如何让 Watcom C 编译器(wcc)和 WASM 生成相同的 8086 机器码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74209302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com