小编use*_*118的帖子

阅读有关使用双数组的IA32汇编代码

这是一个确切的问题:

下面的代码转换了M x M数组的元素,其中M是#define定义的常量:

void transpose(Marray_t A) {
    int i, j;
    for (i = 0; i < M; i++)
        for (j = 0; j < i; j++) {
           int t = A[i][j];
           A[i][j] = A[j][i];
           A[j][i] = t;
       } 
}
Run Code Online (Sandbox Code Playgroud)

当使用优化级别-02进行编译时,GCC会为函数的内部循环生成以下代码:

1. .L3 
2. movl (%ebx),%eax 
3. movl (%esi,%ecx,4),%edx 
4. movl %eax, (%esi,%ecx,4) 
5. addl $1, %ecx 
6. movl %edx, (%ebx) 
7. addl $52,%ebx 
8. cmpl %edi,%ecx 
9. jl .L3
Run Code Online (Sandbox Code Playgroud)

A. M的价值是多少?

B.什么寄存器保存程序值i和j?

C.编写转置的C代码版本,该版本利用此循环中发生的优化.在代码中使用参数M而不是数字常量.

所以在我试图理解这一点时,我注意到它乘以4,这意味着它存储了4个字节的类型(可能是int或指针).然后,它增加我$ 52(我假设我),因为它是一个更大的值,因此进入下一个数组)和$ 52/4是13.所以我猜M = 13.错了吗?

对于B,我猜想%ebx包含i而%ecx包含i. …

x86 assembly

3
推荐指数
1
解决办法
6235
查看次数

标签 统计

assembly ×1

x86 ×1