【发布时间】:2015-11-12 17:59:43
【问题描述】:
原来给我的是函数原型:
void decode1(int *xp, int *yp, int *zp)
现在我被告知将以下程序集转换为 C 代码:
movl 8(%ebp), %edi //line 1 ;; gets xp
movl 12(%ebp), %edx //line 2 ;; gets yp
movl 16(%ebp),%ecx //line 3 ;; gets zp
movl (%edx), %ebx //line 4 ;; gets y
movl (%ecx), %esi //line 5 ;; gets z
movl (%edi), %eax //line 6 ;; gets x
movl %eax, (%edx) //line 7 ;; stores x into yp
movl %ebx, (%ecx) //line 8 ;; stores y into zp
movl %esi, (%edi) //line 9 ;; stores z into xp
这些 cmets 不是在问题中给我的,这是我相信他们正在做的事情,但我不是 100% 确定。
我的问题是,对于第 4-6 行,我可以假设命令
movl (%edx), %ebx
movl (%ecx), %esi
movl (%edi), %eax
只是为 y,z,x 创建一个局部变量?
另外,每个变量存储在其中的寄存器(即(edi、edx、ecx)是否重要,或者我可以按任何顺序使用任何寄存器将指针从堆栈中取出?
C 代码:
int tx = *xp;
int ty = *yp;
int tz = *zp;
*yp = tx;
*zp = ty;
*xp = tz;
如果没有给我函数原型,我怎么知道使用的是什么类型的返回类型?
【问题讨论】:
-
你需要熟悉函数调用约定的概念,编译后的代码调用其他编译后的代码的步骤。 For x86, you can read about them here.。汇编程序中没有真正的局部变量;只有从内存读取到寄存器,在寄存器中进行操作,以及从寄存器到内存写入。但是,代码可以通过修改
%esp在堆栈上保留空间,并随意使用该空间(包括存储所谓的局部变量)。 -
好的,我会调查一下,这只是很难管理我应该在学校学习的内容以及在现实世界中实际实用的内容哈哈@IwillnotexistIdonotexist