Closed. This question needs to be more focused。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
                        
                        3年前关闭。
                                                                                            
                
        
C代码:

void transpose (long A[M][M]) {
    long i, j;
    for (i = 0; i < M; i ++)
        for (j = 0; j < i; j ++) {
            long t = A[i][j];
            A[i][j] = A[j][i];
            A[j][i] = t;
        }
}


基于-O1优化的INNER循环的相应汇编代码:

.L6:
    movq   (%rdx), %rcx  //
    movq   (%rax), %rsi
    movq   %rsi, (%rdx)
    movq   %rcx, (%rax)
    addq   $8, %rdx
    addq   $120, %rax
    cmpq   %rdi, %rax
    jne    .L6


我对汇编代码的理解:

1.  movq (%rdx), %rcx
      int *rdx = ?
      int rcx = *rdx

2.  movq (%rax), %rsi
      int *rax = ?
      int rsi = *rax

3.  movq %rsi, (%rdx)
      *rdx = rsi = *rax

4.  movq %rcx, (%rax)
      *rax = rcx = *rdi

5.  addq $8, %rdx
      rdx +=8

6.  addq $120, %rax
      rax += 120

7.  cmpq %rdi, %rax
    jne .L6
      int rdi = ?
      if (rdi != rax) jump to L6


外卖店:


rdx递增8。
rdx类似于C代码中的j
每一行的长度为120个字节。
for循环外部的rdx可能已在0初始化。
我仍然不完全了解rax返回的内容。


问题:


哪个寄存器保存指向数组元素A[i][j]的指针?
哪个寄存器保存指向数组元素A[j][i]的指针?
M的值是什么?


我的想法:


rdxrdx总是上升8,因此它遍历了整行。
rsi也许??? rsi设置为保留返回值,我认为返回值是元素A[j][i]
120 / 8 = 15


任何对我的回答或拒绝的确认将不胜感激。

最佳答案

元素是long(8个字节长),您正在检查内部循环(在j上),因此:

rdx +=8


表示rdx明确指向A[i][j]

rax += 120


表示rax指向A[j][i]

M等于15,因为一行的长度为120个字节(在A[j][i]A[j+1][i]之间的字节距离),每个long的长度为8个字节(在A[i][j]A[i][j+1]之间的距离)。

09-25 21:11