【发布时间】:2014-02-15 22:04:21
【问题描述】:
测试平台为 Linux 32 位。
所以基本上我正在尝试使用 c 模拟/翻译汇编代码,
目前我的代码可以处理带有系统调用的小汇编代码(int 80) 等等..
但是当我想翻译 libc 函数调用部分时, 我很困惑..
这是一个例子:
section .data
.LC0:
message db "this is a test %d %d %f ", 10
section .text
movl $1, 32(%esp)
movl $1, 36(%esp)
movl $1, 40(%esp)
movl $1, 44(%esp)
movl 44(%esp), %eax
movl %eax, 16(%esp)
movl 40(%esp), %eax
movl %eax, 12(%esp)
movl 36(%esp), %eax
movl %eax, 8(%esp)
movl 32(%esp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
我对如何翻译成这样的东西感到困惑:
unsigned int v_ebp[100000];
unsigned int v_esp = v_ebp + 9999;
........
printf(.LC0, (unsigned int)(v_esp - 4), (unsigned int)(v_esp - 8), (unsigned int)(v_esp - 12));
我在想一个比较“傻”的方式就是模拟printf分析的方式 第一个参数,找出它被要求使用多少变量(通常应该等于 %xx 的数量),并获得它们 一个一个在模拟栈上
看来这种方式是可行的,但如果我选择这种方式, 我必须为 汇编代码中几乎所有的 libc 函数...... 这太乏味了……
所以我的问题是我是否走在正确的道路上..? 这个问题有没有更好的解决方案?
谁能给我一些帮助..?谢谢!
【问题讨论】:
-
为什么必须区别对待 libc 函数与任何其他函数?
-
@n.m.对不起,我犯了一个错误......我只能处理没有参数的函数调用......
-
为什么需要知道参数是什么?汇编语言不关心参数。它只知道一堆寄存器和一堆存储单元。 “参数”是你所说的一些寄存器和单元格。 CPU 不在乎。只需执行程序员手册中关于每条指令的内容即可。
-
祝你好运,使用优化编译器,它可能会优化掉许多操作,以在嵌套函数调用或相互紧随的调用的上下文中保持堆栈“正常”。我非常怀疑在这样的环境中猜测每个函数的参数数量是可能的。
-
@n.m.他可能希望他的模拟器在遇到“调用某事”指令时从堆栈中拉出参数,调用“真正的”libc 函数,然后返回到模拟器。
标签: c assembly compiler-construction compilation