繁体   English   中英

给定汇编,转换为C

[英]Given Assembly, translate to C

我最初得到的是函数原型:

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

这些评论没有提供给我,因为我认为这是他们正在做的问题,但是不确定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;

如果没有给我函数原型,我怎么知道使用哪种类型的返回类型?

恭喜,您一切正常:)

您可以使用任何寄存器,但是需要保留一些寄存器,也就是说,应在使用前保存它们,然后再进行恢复。 在典型的调用约定中,可以使用eaxecxedx ,其余部分需要保留。 您显示的程序集不包含执行此操作的代码,但大概在这里。

至于返回类型,这很难推论。 简单类型在eax寄存器中返回,并且总是有东西存在。 我们无法确定这是要作为返回值,还是仅保留局部变量。 也就是说,如果您的函数return tx; 它可能是相同的汇编代码。 另外,我们也不知道eax的类型,它可以是适合该类型的任何东西,并且根据调用约定可以在其中返回。

让我们专注于一组更简单的说明。

第一:

movl 8(%ebp), %edi

会将位于存储器中的4个字节的内容加载到EDI寄存器中,超出EBP寄存器中设置的地址8个字节。 这种特殊的EBP用法是编译器代码生成器遵循的约定,即每个函数将堆栈指针ESP保存到EBP寄存器中,然后为函数局部变量创建一个堆栈帧。

现在,在EDI寄存器中,我们有第一个参数传递给该函数,即指向整数的指针,因此EDI现在包含该整数的地址,但不包含整数本身。

movl (%edi), %eax

将获得EDI寄存器指向的4个字节,并将它们加载到EAX寄存器中。

现在在EAX中,我们在第一个参数中具有xp指向的整数值。

接着:

movl %eax, (%edx)

会将这个整数值保存到由EDX寄存器的内容指向的内存中,而EDX寄存器的内容又是从传递给函数的第二个参数EBP + 12加载的。

那么,您的第一个问题是,此汇编代码是否与此等效?

int tx = *xp;
int ty = *yp;
int tz = *zp;
*yp = tx;
*zp = ty;
*xp = tz;

是, 是的 ,但是请注意,没有创建tx,ty,tz局部变量,只有处理器寄存器。

和你的第二个问题,是 ,你不能告诉回报的类型,这是再次对寄存器的使用,你不能仅仅通过查看生成的汇编代码推断的约定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM