2016-02-21 25 views
-2

的C代碼:基於-O1優化內環陣列轉置和對應的彙編代碼

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; 
     } 
} 

對應彙編代碼:

.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正在返回。

問題:

  1. 哪個寄存器保存一個指針數組元素A[i][j]

  2. 哪個寄存器包含指向數組元素A[j][i]的指針?

  3. M的值是多少?

我的想法:

  1. rdxrdx總是增加8,所以它貫穿整行。

  2. rsi也許??? rsi設定爲保持返回值,我想返回值是元素A[j][i]

  3. 120/8 = 15

我的答案或拒絕的任何確認,將不勝感激。

+0

這不是一個非常壯觀的問題,但我不明白它是如何過於寬泛的,是關於特定裝配片段的分析。 –

回答

1

元素是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]之間距離)。

+0

我現在明白了。我失去了對內部循環的重視,並在外面思考。 – sam