将装配转换为C

周五,我的教授在讲座中向我们提出了一个“挑战”问题。 他给了我们一个C程序的程序集,然后从C代码中移除了两个常量。 大会:

sum_element:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%eax
movl 12(%ebp),%ecx
sall $2,%ecx
leal 0(,%eax,8),%edx
subl %eax,%edx
leal (%eax,%eax,4),%eax
movl mat2(%ecx,%eax,4),%eax
addl mat1(%ecx,%edx,4),%eax
movl %ebp,%esp
popl %ebp
ret

然后C代码:

#define M  ____
#define N  ____
int mat1[M][N];
int mat2[N][M];
int sum_element(int i, int j)
{
return mat1[i][j] + mat2[i][j];
}

然后他问我们M和N的值是多少。

到目前为止我所做的:

movl %esp,%ebp (这将esp寄存器移动到ebp寄存器中)

movl 8(%ebp),%eax (将ebp寄存器的8位内容移入eax寄存器)

movl 12(%ebp),%ecx (将ebp寄存器的12位内容移入ecx寄存器)

sall $2,%ecx (这是将存储在ecx中的数字左移2位,所以除以4)

leal 0(,%eax,8),%edx (我不确定表达式前的0是在做什么,否则它将eax * 8加载到edx中)

subl %eax,%edx (edx = edx - eax)

leal (%eax,%eax,4),%eax (eax = eax ^ 2 * 4)

movl mat2(%ecx,%eax,4),%eax (eax =无论mat2(ecx,eax,4)是)

addl mat1(%ecx,%edx,4),%eax (eax = eax +无论mat1(ecx,edx,4)是)

我不明白的部分是mat1,mat2和前面带有0的leal。

谢谢!

编辑:总结我到目前为止:

ecx=ecx/4
edx=eax*8-eax
eax=eax*4+eax

我认为在知道了mat1和mat2之后,我能够计算出M和N的值,但是我要么忽略了明显的要素,要么还有更多要做的事情。 任何方向都会很棒。

ecx是j和eax是我吗?

再次感谢!


mat1mat2只是存储器位置的命名地址,与C代码中的地址相同。

movl mat2(%ecx,%eax,4),%eax -> load *(ecx + mat2 + (eax * 4)) into eax
addl mat1(%ecx,%edx,4),%eax -> add *(ecx + mat1 + (edx * 4) to eax

其中mat2mat1是汇编器已知的表示某些地址的常数数值。

leal指令只是“整数加法/乘法”操作的一个奇特名称,通常用于地址计算:

leal 0(,%eax,8),%edx -> load eax * 8 + 0 into edx

mat1mat2是变量的地址。 一旦它们不在堆栈中,它们就具有固定值......(它们被声明为静态变量)......所以它们只是表示mat1mat2的内存地址

  • ecx = j
  • eax = i
  • 在功能的开始......但后来

  • ecx = j
  • eaxedx (第10和11行)都执行来自i的数组偏移量。 发生这种情况是因为矩阵在第一个索引处具有不同的大小。 一个是M ,另一个是N
  • 关于leal 0(,%eax,8),%edx ,这意味着edx = 8 * eax它用于计算来自i的偏移量,但是由于subl %eax,%edxedx = edx - eax = edx - i = i * 8 - i = 7 * i with,所以最终的edx = 7 * i ... M = 7

    同样的方式:在线10 %eax = i * N = i + 4 * i = 5 * i ,因此N = 5i + 4 * i来自leal (%eax,%eax,4),%eax

    mat1[i][j] > mat1 + ( M + i ) * 4 + j * 4 > mat2(%ecx,%eax,4),%eax
    mat2[i][j] > mat2 + ( N + i ) * 4 + j * 4 > mat1(%ecx,%edx,4),%eax
    

    顺便一提:

  • leal (%eax,%eax,4),%eax = eax += eax + eax * 4而不是eax = eax^2*4
  • sall $2,%ecx = ecx *= 4而不是ecx = ecx/4
  • 链接地址: http://www.djcxy.com/p/86809.html

    上一篇: Converting Assembly to C

    下一篇: Assembly: 32 bit registers not recognized?