testpushl ebpmovl esp ebppushl ebxsubl $16 espmovl $6 -12ebpmovl $0 -20ebpmovl $0 -16ebpmovl $0 -8ebpmovl $1 -20ebpmovl $2 -16ebpjmp L2cfi_offset 3 -12L6cmpl $15 -16ebpjg L3movl-16ebp eaxsubl $15 eaxj
该汇编代码是一个双重循环,用于计算两个二维数组的某些值的和,并将结果存储在第二个数组中。具体流程如下:
- 在栈上分配空间,保存当前函数的上一级函数的堆栈帧指针和调用者保存的寄存器。
- 将6存储在第二个数组的(-12)位置,将0分别存储在第二个数组的(-16)、(-20)、(-8)位置,将1存储在第二个数组的(-20)位置,将2存储在第二个数组的(-16)位置。
- 跳转到.L2处,开始双重循环。首先比较(-20)位置上的值是否大于15,如果是,则跳转到.L3处,否则继续执行。
- 从第二个数组的(-16)位置取出值,减去15,存储在寄存器eax中,然后跳转到.L4处。
- 将寄存器eax中的值存储在第二个数组的(-8)位置上。
- 从第二个数组的(-20)位置取出值,作为第一维数组的下标,计算出对应的地址,并将其存储在寄存器eax中。然后从第一维数组中取出对应的值,存储在寄存器ecx中。
- 从第二个数组的(-8)位置取出值,作为第二维数组的下标,计算出对应的地址,并将其存储在寄存器eax中。然后从第二维数组中取出对应的值,存储在寄存器ebx中。
- 计算表达式2*array2[-8]+array1[array2[-20]*23+array2[-16]]-array2[-8],结果存储在寄存器eax中。
- 将寄存器eax中的值乘以2,加上寄存器ecx中的值,结果存储在寄存器eax中。
- 将寄存器eax中的值加上寄存器edx中的值,结果存储在寄存器eax中。
- 将寄存器eax中的值存储在第二维数组中对应的位置上。
- 将(-16)和(-20)位置上的值分别加1。
- 判断(-20)位置上的值是否大于15或(-16)位置上的值是否小于等于22,如果是,则跳转到.L5处,否则继续执行。
- 从栈上取出保存的寄存器和堆栈帧指针,并返回到调用者。
对应的C语言程序可能是:
int array1[15][23];
int array2[15][23];
void foo() {
int i, j;
array2[0][0] = 6;
for (i = 0; i < 15; i++) {
for (j = 0; j < 23; j++) {
if (i > 0 && j == 0) {
array2[i][j] = 2 * array2[i-1][j] + array1[array2[i-1][j+2]*23+array2[i-1][j+1]] - array2[i-1][j];
} else {
array2[i][j] = 0;
}
}
}
}
``
原文地址: https://www.cveoy.top/t/topic/gSl0 著作权归作者所有。请勿转载和采集!