【发布时间】:2016-06-02 15:58:10
【问题描述】:
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的值是多少?
我的想法:
rdx。rdx总是上升 8,所以它贯穿整行。rsi也许???rsi设置为保存返回值,我认为返回值是元素A[j][i]120 / 8 = 15
任何对我的回答或拒绝的确认将不胜感激。
【问题讨论】:
-
这不是一个引人注目的问题,但我看不出它有多宽泛,是关于特定程序集片段的分析。
标签: c arrays assembly reverse-engineering x86-64