gpt4 book ai didi

将程序集转换为 C

转载 作者:行者123 更新时间:2023-12-05 00:03:24 32 4
gpt4 key购买 nike

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

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 (这将 8 的内容从 ebp 寄存器移入 eax 寄存器)
movl 12(%ebp),%ecx (这将 12 的内容从 ebp 寄存器移入 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 是 i 吗?

再次感谢!

最佳答案

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

关于将程序集转换为 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23332004/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com