一段汇编代码翻译成c语言的练习
2010-11-01 00:03
1331 查看
题目是这样的:
有一个函数原型为
void decode1(int *xp,int *yp,int * zp);
函数的编译成汇编代码后如下:
1 movl 8(%ebp),%edi
2 movl 12(%ebp),%ebx
3 movl 16(%ebp),%esi
4 movl (%edi),%eax
5 movl (%ebx),%edx
6 movl (%esi),%ecx
7 movl %eax,(%ebx)
8 movl %edx,(%esi)
9 movl %ecx,(%edi)
要求写出等效的C代码。
分析过程:(中间伪代码)
edi = xp
ebx = yp
esi = zp
eax = *xp
edx = *yp
ecx = *zp
最后函数内的代码推测为:
*yp = *xp
*zp = *yp
*xp = *zp
用反汇编工具验证:
首先编写代码decode.c:
gcc编译:gcc -O2 -c decode.c
反汇编:objdump -d decode.o
反汇编代码如下:
翻译机器的反汇编代码为:
*yp = *xp
*zp = *xp
*xp = *xp
原本的函数代码:
*yp = *xp
*zp = *yp
*xp = *zp
貌似有点差距,但仔细一看,其实是一模一样的,看来计算机还是能看透事物的本质啊!!(其实这段函数功能就是三个值都等于*xp啊)
有一个函数原型为
void decode1(int *xp,int *yp,int * zp);
函数的编译成汇编代码后如下:
1 movl 8(%ebp),%edi
2 movl 12(%ebp),%ebx
3 movl 16(%ebp),%esi
4 movl (%edi),%eax
5 movl (%ebx),%edx
6 movl (%esi),%ecx
7 movl %eax,(%ebx)
8 movl %edx,(%esi)
9 movl %ecx,(%edi)
要求写出等效的C代码。
分析过程:(中间伪代码)
edi = xp
ebx = yp
esi = zp
eax = *xp
edx = *yp
ecx = *zp
最后函数内的代码推测为:
*yp = *xp
*zp = *yp
*xp = *zp
用反汇编工具验证:
首先编写代码decode.c:
void decode(int *xp,int *yp,int *zp) { *yp = *xp; *zp = *yp; *xp = *zp; }
gcc编译:gcc -O2 -c decode.c
反汇编:objdump -d decode.o
反汇编代码如下:
00000000 <_decode>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 8b 4d 08 mov 0x8(%ebp),%ecx 6: 8b 11 mov (%ecx),%edx 8: 8b 45 0c mov 0xc(%ebp),%eax b: 89 10 mov %edx,(%eax) d: 8b 45 10 mov 0x10(%ebp),%eax 10: 89 10 mov %edx,(%eax) 12: 89 11 mov %edx,(%ecx) 14: 5d pop %ebp 15: c3 ret 16: 90 nop 17: 90 nop
翻译机器的反汇编代码为:
*yp = *xp
*zp = *xp
*xp = *xp
原本的函数代码:
*yp = *xp
*zp = *yp
*xp = *zp
貌似有点差距,但仔细一看,其实是一模一样的,看来计算机还是能看透事物的本质啊!!(其实这段函数功能就是三个值都等于*xp啊)
相关文章推荐
- C语言中嵌入汇编代码
- 一段C语言和汇编的对应分析,揭示函数调用的本质
- 一段女生写的C语言代码(搞笑)
- C语言中if 语句的汇编代码
- 汇编写启动代码之设置栈和调用C语言1
- 史上最牛的一段汇编代码
- 由一段代码来深入理解C语言宏
- c语言与汇编的混合编程代码
- 汇编写启动代码之设置栈和调用C语言
- JavaScript 练习 生成文字 【每日一段代码36】
- C语言写的一段溢出代码
- 颜色变换 JavaScript 练习【每日一段代码1】
- 一段C++练习代码小评(1)
- JavaScript 练习 生成文字 【每日一段代码37】
- 使用VC将C语言代码转为汇编
- 高级语言的一段汇编代码分析
- 汇编代码调用C语言及四种类型的栈
- 从逻辑上删除一段c语言代码
- 如何将C语言代码转换为对应的汇编代码?
- 从U-Boot源码看C语言对汇编代码中的符号引用