c - 从程序集(x64)翻译成 C

标签 c assembly x86-64

<分区>

我有一个函数,它 panic 。 崩溃显示以下汇编代码。 谁能解释一下如何将它翻译成 C,这将帮助我理解问题。

push   %rbp

mov    %rsp,%rbp

sub    $0x40,%rsp

mov    0xbca741(%rip),%rax 

mov    %r15,-0x8(%rbp)

mov    %rbx,-0x28(%rbp)

mov    %rdi,%r15

mov    %r12,-0x20(%rbp)

mov    %r13,-0x18(%rbp)

mov    %r14,-0x10(%rbp)

cmpl   $0x3b,0x4(%rax) --> panicked here.

该函数只接受一个参数。

最佳答案

翻译成 C 语言是不可能的。

但这是正在发生的事情:

  1. mov 0xbca741(%rip),%rax 行将静态/全局变量读入 %rax
  2. cmpl $0x3b,0x4(%rax) 将此值视为指针,并尝试访问其上的偏移量 4,并与 0x3b(十进制 59)进行比较。
  3. 读入 %rax 的指针显然无效,因此尝试访问它导致了崩溃。

关键问题是它是哪个全局/静态变量。但如果没有 C 源代码(或使用调试信息的反汇编),则无法找到此信息。

关于c - 从程序集(x64)翻译成 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18481120/

相关文章:

使用 C 在文本编辑器中创建文本

assembly - 为什么 clang 的结尾使用 `add $N, %rsp` 而不是 `mov %rbp, %rsp` 来恢复 `%rsp` ?

在/proc下创建文件并使用它

c - 如何在 mac 上编写自定义内核?

c - 编译器如何解释 float 和 double 并最终在内存中表示?

c - 阅读 x86 汇编代码

assembly - x86在x86-x64中不同或已完全删除的32位操作码

gcc - 在 x64 模式下为 _mm_movemask_epi8 内部生成不必要的指令

c - 对 `pthread_create' 的 undefined reference -pthread 不工作

c - 无需在 C 中使用 goto 即可优雅地退出函数的优雅方式