【问题标题】:Disassembling IA32 32 bit AT&T assembly code of a function in C在 C 中反汇编函数的 IA32 32 位 AT&T 汇编代码
【发布时间】:2017-10-16 19:53:25
【问题描述】:

[已编辑] 有人可以向我解释我们如何在这个问题中获得 M 和 N 的值,遍历相应汇编代码的每一行吗?

我总是对 movl array2 部分感到困惑。

M 和 N 是使用#define 定义的常量

#define M <some value>
#define N <some value>

int array1[M][N]; 
int array2[N][M];
int copy(int i, int j)
{
array1[i][j] = array2[j][i];
}

如果上面的代码生成如下汇编代码:我们如何推导出常量 M 和 N 的值?

  copy:
    pushl %ebp
    movl %esp, %ebp 
    pushl %ebx
    movl 8(%ebp), %ecx 
    movl 12(%ebp), %ebx
    leal (%ecx, %ecx, 8), %edx
    sall $2, %edx 
    movl %ebx, %eax 
    sall $4, %eax 
    subl %ebx, %eax 
    sall $2, %eax
    movl array2(%eax, %ecx, 4), %eax
    movl %eax, array1(%edx, %ebx, 4)
    popl %ebx
    movl %ebp,%esp 
    popl %ebp
    ret

【问题讨论】:

  • 您真的希望我们输入所有内容吗?不要发布代码图像!请解决您的问题。
  • 为什么代码是图片???
  • 你说“我们得到了 M 和 N 的值”是什么意思?你的意思是i 和j?
  • #define M; => 这不会编译
  • 我认为#define指令不能包含在编译过程中,因为我们天生不知道它们的值,而汇编代码可能对它们的值有提示。

标签: c 32-bit disassembly


【解决方案1】:

您需要检查组件的其他部分。例如,如果您将 M 和 N 都定义为 8,您将在程序集中找到以下内容

array1:
    .zero   256
array2:
    .zero   256

因为在我的机器上,int 是 4 个字节,8 乘以 8 是 64。而 64 * 4 = 256。示例程序集可以在 here 找到。

【讨论】:

  • 我认为有一种方法可以找到答案,而不必假设 M 和 N 的值,但我认为我们不需要知道程序集的其他部分。
【解决方案2】:

好的,伙计们,经过大量研究,我找到了解决方案。如果我错了,请纠正我。

所以逐步完成以下组装:(为方便起见添加了行号)

M 和 N 是使用#define 定义的常量

int array1[M][N]; 
int array2[N][M];
int copy(int i, int j)
{
array1[i][j] = array2[j][i];
}

copy:
   1  pushl %ebp 
   2  movl %esp, %ebp 
   3  pushl %ebx
   4  movl 8(%ebp), %ecx 
   5  movl 12(%ebp), %ebx
   6  leal (%ecx, %ecx, 8), %edx
   7  sall $2, %edx 
   8  movl %ebx, %eax 
   9  sall $4, %eax 
  10  subl %ebx, %eax 
  11  sall $2, %eax
  12  movl array2(%eax, %ecx, 4), %eax
  13  movl %eax, array1(%edx, %ebx, 4)
  14  popl %ebx
  15  movl %ebp,%esp 
  16  popl %ebp
      ret
  1. 将%ebp 推入堆栈

  2. %ebp 指向%esp

  3. 将%ebx 推入堆栈

  4. %ecx 等于 int i(数组访问的索引)

  5. %ebx 等于 int j(数组访问的索引)

  6. %edx 等于 8 * %ecx + %ecx 或 9i

  7. %edx 在2 左二进制移位后等于36i

  8. %eax 等于 %ebx 或 j

  9. %eax 等于16j 左二进制移位4

  10. %eax 等于 %eax - %ebx = 16j - j = 15j

  11. %eax 等于60j 左二进制移位2

  12. %eax 等于索引为[4%ecx + %ebx] or [4i + 60j] 的array2 元素

  13. array1 的索引为[ 4%ebx + %edx ] or [ 4j + 36i ] 的元素等于%eax 或[4i + 60j]

使用 %eax 作为在 12 和 13 中完成的两个数组元素的交换 中介登记册。

  1. %ebx 弹出

  2. %esp 的旧值已恢复

  3. %ebp 弹出

现在我们假设array1[i][j]的元素访问等于4Ni + 4j

并且array2[j][i] 的元素访问权限等于4Mj + 4i。

(每个索引项中的 4 作为 int 是 4 个字节,i, j 是从起始数组位置开始的单独偏移量) 这是真的,因为 C 以行主要形式存储数组。

因此,我们得到 M = 15 和 N = 9。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    相关资源
    最近更新 更多