【发布时间】:2018-05-31 15:43:26
【问题描述】:
我有一个任务,除其他外,我需要查看 .asm 文件以找到特定指令并“逆向工程”(找出)C 代码的哪一部分导致它在汇编器上执行等级。 (文字下方示例)
最快(最简单)的方法是什么。或者更好地说,我应该/可以注意 .asm 文件中围绕它的其他哪些命令/指令/标签,这将引导我找到正确的 C 代码?
我对汇编代码的经验几乎为零,很难弄清楚 C 代码的哪些确切行会导致特定指令发生。
架构是 TriCore,如果这有什么不同的话。
示例: 通过跟踪变量的使用位置,我设法弄清楚是什么 C 代码导致在 asm 文件中插入
.L23:
movh.a a15,#@his(InsertStruct)
ld.bu d15,[a15]@los(InsertStruct)
or d15,#1
st.b [a15]@los(InsertStruct),d15
.L51:
ld.bu d15,[a15]@los(InsertStruct)
insert d15,d15,#0,#0,#1
st.b [a15]@los(InsertStruct),d15
.L17:
mov d15,#-1
这导致我得到以下 C 代码:
InsertStruct.SomeMember = 0x1u;
InsertStruct.SomeMember = 0x0u;
【问题讨论】:
-
这个想法是展示你对 C、编译器和汇编器的理解。有一些工具可以为您完成此操作,有时称为“反汇编程序”。然而,在大多数情况下,结果令人失望,而且有时对于经验丰富的汇编程序员来说,汇编代码的理解程度不如汇编代码。
-
你应该完成这个练习,而不是围绕它。它的目的是提高您(缺少的)组装技能以及理解和重新实现算法的不可或缺的能力。所以:你应该注意每一行,最快的方法是了解它。
-
“哪些 C 代码行会导致特定指令发生。” - 确切的整个源代码会导致整个程序集发生。至少在优化的代码中没有直接的线对线映射,有时优化器会显着改变算法,比如通过乘法执行
x / 15,或者通过直接计算结果来删除整个循环求和值等等......如果你愿意尝试从这样的程序集中重建 C 源代码,你会以完全不同的源代码结束(算法方面)。 -
感谢您的回答,但不幸的是,这并没有帮助,我知道这是一个非常普遍的问题。不幸的是,这不是练习,而是工作。我应该修补现有的指令集测试,它不会测试所有使用的指令。所以我需要查看一级代码的 asm 文件,找出是什么 C 代码导致指令发生,这样我就可以在我的补丁中使用它。 @ Lundin,是的,考虑到 Ped7g 所说的话,很难阅读。它经过优化,一行 C 代码并不意味着使用了某条指令。可以说“相互作用”是关键。
-
如果你想测试 ISA 中的所有指令,希望你能说服 C 编译器以某种方式生成它们是完全错误的方法。编译器的下一个版本,或在某处更改常量,可能会导致不同的代码生成。如果你需要特定的 asm,写在 asm 中。
标签: c assembly instructions instruction-set