【问题标题】:what is this assembly code in C?这个 C 中的汇编代码是什么?
【发布时间】:2017-11-09 14:14:22
【问题描述】:

下面有一些我不太明白的汇编代码。我的想法是它毫无意义。不幸的是,我无法提供更多说明信息。 C 中的输出是什么?

0x1000: iretd   
0x1001: cli 
0x1002: in  eax, dx
0x1003: inc byte ptr [rdi]
0x1005: add byte ptr [rax], al
0x1007: add dword ptr [rbx], eax
0x1009: add byte ptr [rax], al
0x100b: add byte ptr [rdx], 0
0x100e: add byte ptr [rax], al

谢谢

【问题讨论】:

  • 对我来说像家庭作业?...
  • 你试过运行它吗?那应该会给出答案。
  • @klutt 如何运行它给出准确的答案?
  • 看起来毫无意义,可能是内存中的一些随机字节。甚至不是所有的都可以翻译成 C。
  • 第一条指令是“从ISR返回”。 “功能”到此结束。

标签: c assembly x86-64 mach-o


【解决方案1】:

前四个字节(如果我正确重构它们的话)形成 32 位值 0xFEEDFACF

将其输入谷歌导致我:

https://gist.github.com/softboysxp/1084476#file-gistfile1-asm-L15

%define MH_MAGIC_64                 0xfeedfacf

你不是不小心将 Mac OS X 中的 Mach-o x64 可执行文件作为原始机器代码反汇编,而不是正确读取文件的元数据,并且只反汇编代码部分吗?

附:在这样的问题中,还包括源机器代码数据,所以有经验的人可以通过针对不同的平台来检查反汇编,比如 32b x86 或 16b 实模式代码,或者完全不同的 CPU,这可能有助于防止您误认为机器目标平台反汇编错误的代码。我必须先组装你的反汇编才能看到原始字节。

【讨论】:

  • 有趣的是,二进制可能毕竟是纯 C/C++ 源代码的产物(即使是简单的“hello world”示例也可能是源代码)......但是特定的字节你的反汇编不能由源代码中的 C 语言构造创建(除了将它们定义为 const uint8_t* data { 0xCF, 0xFA, ...};),这些是由目标平台、链接器和可执行二进制规范定义的固定元数据,在 C 语言源范围之外。
  • 这个 SO 答案有关于魔术头本身的详细信息。 stackoverflow.com/questions/27669766/…
【解决方案2】:

iretd 是“从中断返回”,cli 是“清除中断标志”,表示禁用所有可屏蔽中断。 C 语言不理解中断的概念,因此不太可能是从 C 编译而来。事实上,这不是一个完整的代码片段。

另外,add byte ptr [rdx], 0 正在将 0 添加到一个对我来说没有意义的值,除非它是未优化编译的结果或反汇编非代码的结果。

【讨论】:

猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 2019-09-09
  • 2015-01-14
  • 2021-07-18
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多