【问题标题】:Array transpose and corresponding assembly code [closed]数组转置和相应的汇编代码[关闭]
【发布时间】: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 返回的确切内容。

问题:

  1. 哪个寄存器保存指向数组元素A[i][j]的指针?

  2. 哪个寄存器保存指向数组元素A[j][i]的指针?

  3. M 的值是多少?

我的想法:

  1. rdxrdx 总是上升 8,所以它贯穿整行。

  2. rsi也许??? rsi 设置为保存返回值,我认为返回值是元素A[j][i]

  3. 120 / 8 = 15

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

【问题讨论】:

  • 这不是一个引人注目的问题,但我看不出它有多宽泛,是关于特定程序集片段的分析。

标签: c arrays assembly reverse-engineering x86-64


【解决方案1】:

元素是longs(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] 和 @987654334 之间的距离@)。

【讨论】:

  • 我现在明白了。我失去了对内部循环的关注,并在外面思考。
猜你喜欢
  • 2011-05-04
  • 1970-01-01
  • 2016-12-22
  • 2010-10-01
  • 2014-06-21
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多