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
暫時發兩題剩下的過幾天補上