分解IA32 32位AT&;C语言中函数的T汇编代码

分解IA32 32位AT&;C语言中函数的T汇编代码,c,32-bit,disassembly,C,32 Bit,Disassembly,[已编辑] 有人能给我解释一下,在这个问题中,我们是如何通过相应的汇编代码的每一行得到M和N的值的吗 我总是被电影里的情节难倒 M和N是使用#define定义的常数 您需要检查部件的其他零件。例如,如果将M和N都定义为8,则会在程序集中找到以下内容 array1: .zero 256 array2: .zero 256 因为在我的机器上,int是4字节,8乘以8等于64。64*4=256。可以找到示例组件。好了,伙计们,经过大量研究,我终于找到了解决方案。如果我错了,请

[已编辑] 有人能给我解释一下,在这个问题中,我们是如何通过相应的汇编代码的每一行得到M和N的值的吗

我总是被电影里的情节难倒

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


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

array1:
    .zero   256
array2:
    .zero   256

因为在我的机器上,int是4字节,8乘以8等于64。64*4=256。可以找到示例组件。

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

因此,请一步一步地完成以下装配:(为方便起见,添加了行号)

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

  • %ebp
    推入堆栈

  • %ebp
    指向
    %esp

  • %ebx
    推入堆栈

  • %ecx
    等于
    int i
    (数组访问索引)

  • %ebx
    等于
    int j
    (数组访问索引)

  • %edx
    等于
    8*%ecx+%ecx
    9i

  • %edx
    等于
    36i
    左二进制移位
    2

  • %eax
    等于%ebx或
    j

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

  • %eax
    等于
    %eax-%ebx=16j-j=15j

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

  • %eax
    等于具有索引的array2元素
    [4%ecx+%ebx]或[4i+60j]

  • 数组1的索引为
    [4%ebx+%edx]或[4j+36i]
    的元素等于
    %eax
    [4i+60j]

  • 在12和13中使用%eax作为交换来交换两个数组元素 中间人登记册

  • %ebx
    弹出

  • %esp
    的旧值已恢复

  • %ebp
    弹出

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

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

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


    所以我们得到的结果相等,M=15和N=9。

    你真的希望我们输入所有这些吗?不要发布代码的图片!请修正你的问题。为什么代码是图像???你说“我们得到M和N的值”是什么意思?你是说
    i
    j
    #定义M=>不会编译#define指令不能包含在编译过程中,我认为因为我们天生不知道它们的值,汇编代码可能对它们的值有提示。我认为有一种方法可以找到答案,而不必假设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
    
    array1:
        .zero   256
    array2:
        .zero   256
    
    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