首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使Watcom C编译器(wcc)和WASM生成相同的8086机器代码?

如何使Watcom C编译器(wcc)和WASM生成相同的8086机器代码?
EN

Stack Overflow用户
提问于 2022-10-26 14:16:52
回答 1查看 77关注 0票数 3

对于这个C源代码:

代码语言:javascript
复制
int add(int a, int b) { return a + b; }

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

对于此程序集源代码:

代码语言:javascript
复制
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,反汇编为add ax, dx (03 C2) + ret (C3)。

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

如果我在Watcom内联程序集中实现该函数,那么机器代码输出将与WASM相同。

不同指令编码的集合:

  • add ax, dx.wcc:01 D0;wasm:01 D0wcc:89 C3;wasm:89 C3wcc:05 09 00;wasm:05 09 00

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

我之所以需要它,是因为我只想通过编写WASM源代码来复制一个用Watcom C编写的可执行程序文件,并且我希望最终的输出与原来的完全相同。

EN

回答 1

Stack Overflow用户

发布于 2022-10-26 18:08:00

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

下面是一种繁琐的、多步骤的方法来更改wcc发出的机器代码,以匹配wasm的输出。

  1. 像往常一样将C源代码wcc (OpenWatcom的一部分)编译成.obj文件。

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

  1. 使用ndisasm ( NASM,ndisasm -b 16 file.obj的一部分)来分解机器代码字节。

  1. 编写并运行自定义源文本筛选器,以保留程序集指令并将其转换为WASM语法。

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

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74209302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档