对于这个C源代码:
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)。
对于此程序集源代码:
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编写的可执行程序文件,并且我希望最终的输出与原来的完全相同。
发布于 2022-10-26 18:08:00
这个答案来自@RaymondChen的评论。
下面是一种繁琐的、多步骤的方法来更改wcc发出的机器代码,以匹配wasm的输出。
ndisasm -b 16 file.obj的一部分)来分解机器代码字节。。
。
使用dmpobj invocations.输出中的偏移量,编写并运行自定义二进制筛选器,从从第二个文件提取的等效字节替换第一个.obj文件的_TEXT段中的机器代码字节。
这些步骤避免使用wdis -a (从.obj到程序集源的转换),因为这是有损的(它不包括.obj文件中的所有内容),这可能导致不必要的更改,从而导致以后的问题。
https://stackoverflow.com/questions/74209302
复制相似问题