深入理解計算機系統(第三版) csapp 第三章部分答案


3.63

(gdb) x/6gx 0x4006f8
//相鄰地址相差8字節
0x4006f8: 0x00000000004005a1  //對應n=0
0x400700: 0x00000000004005c3  //對應n=1
0x400708: 0x00000000004005a1  //對應n=2 如此類推
0x400710: 0x00000000004005aa  
0x400718: 0x00000000004005b2
0x400720:  0x00000000004005bf
//因此當n=0或者n=2時候對應0x4005a1

 

 1 <switch_prob>:
 2     400590: 48 83 ee 3c    sub $0x3c, %rsi  //減去60 n=n-60
 3     400594: 48 83 fe 05    cmp $0x5, %rsi  
 4     400598: 77 29          ja  4005c3 <switch_prob+0x33>
 5     //判斷n是否大於5 如果大於5則跳轉到4005c3 處
 6     40059a: ff 24 f5 f8 06 40 00   jmpq *0x4006f8(,%rsi,8)
 7     // 跳到跳轉表對應的位置,假設跳轉表對應數組a[x],那么分別跳到a[0x4006f8+8*n]處
 8     4005a1: 48 8d 04 fd 00 00 00   lea  0x0(,%rdi,8),%rax
 9     //當n為0或者2時跳轉到此處
10     4005a8: 00
11     400593: c3             retq
12     4005aa: 48 89 f8       mov %rdi, %rax//當n為3時跳轉到此處
13     4005ad: 48 c1 f8 03    sar $0x3, %rax
14     4005b1: c3             retq
15     4005b2: 48 89 f8       mov %rdi, %rax//當n=4時跳轉到此處
16     4005b5: 48 c1 e0 04    shl $0x4, %rax
17     4005b9: 48 29 f8       sub %rdi, %rax
18     4005bc: 48 89 c7       mov %rax, %rdi
19     4005bf: 48 0f af ff    imul %rdi, %rdi //當n=5會跳到此處
20     4005c3: 48 8d 47 4b    lea 0x4b(%rdi), %rax//其他情況跳轉到這里
21     4005c7: c3             retq     

最后C語言代碼:

long switch_prob(long x, long n){
    long result = x;
    switch(n):{
        case 60:
        case 62:
            result = x * 8;
            break;
        case 63:
            result = result >> 3;
            break;
        case 64:
            result = (result << 4) - x;
            x = result;
        case 65:
            x = x * x; 
        default:  //61在默認情況中
            result = x + 0x4b;
    }
}

 

 

3.64

對於三維數組A[i][j][k],我一直以為i,j,k是行,列,層,其實應該是層,行,列。高維度應該寫在前面

所以對於一個數組A[3][2][2]  

第一層為:

A[0][0][0] 

A[0][0][1]

A[0][1][0] 

A[0][1][1]

第二層為:

A[1][0][0] 

A[1][0][1]

A[1][1][0] 

A[1][1][1]

第三層為:

A[2][0][0] 

A[2][0][1]

A[2][1][0] 

A[2][1][1]

所以根據數組首地址求的最后一個元素的地址=首地址+(目標元素的那一層下面的所有元素個數+加目標元素所在層除了目標元素外的所有行的所有元素+目標元素所在行除自己外的所有元素)*單個元素大小

A.

  所以公式 &A[i][j][k] = Xa +8*(i*S*T+j*T+k)  

B.

  根據匯編得 &A[i][j][k] = Xa +8*(65i+13j+k)  

  S*T =65

  T=13

  size(A) = 3640 =R*S*T

所以R=7,S=5,T=13

 

暫時發兩題剩下的過幾天補上


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM