gpt4 book ai didi

c - 如何计算下面汇编中 C 宏表达式的定义?

转载 作者:行者123 更新时间:2023-11-30 15:41:10 25 4
gpt4 key购买 nike

我对布置给我的家庭作业问题感到非常困难。我有以下 C 代码和后续汇编:

int foo(int n, int A[X(n)][Y(n)], int j){
int i;
int result = 0;
for (i = 0; i < X(n); i++)
result += A[i][j];
return result;
}

movl 8(%ebp), %eax
leal (%eax,%eax), %edx
leal (%edx,%eax), %ecx
movl %edx, %ebx
leal 1(%edx), %eax
movl $0, %edx
testl %eax, %eax
jle .L3
leal 0(,%ecx,4), %esi
movl 16(%ebp), %edx
movl 12(%ebp), %ecx
leal (%ecx,%edx,4), %eax
movl $0, %edx
movl $1, %ecx
addl $2, %ebx
.L4:
addl (%eax), %edx
addl $1, %ecx
addl %esi, %eax
cmpl %ebx, %ecx
jne .L4
.L3:
movl %edx, %eax

我需要找出X和Y的定义。我相信n最初存储在eax中,然后2n存储在edx中,3n存储在<强>ecx。所以我认为 esi 等于 3n * 4。另外,因为 result 最初存储为 movl $0, %edx 并且以下行递增 1,我认为X 将等于#define X(n + 1)。另外,我相信 addl %esi, %eax 会是 Y。那么既然 esi = %ecx * 4 Y = 4n 吗?然而,这就是我开始感到严重困惑的地方。谢谢大家。

最佳答案

可爱的练习。

该声明似乎将A定义为C99可变长度数组。顺便说一句,它们的编译器支持非常差,并且在 C11 中是可选的。

内部 Y(n) 维度可以从循环迭代的数组步长中推断出来,其中 EAX 是指针,ESI 是音高,并且看起来是定义为n*3。至于X(n),我们可以从i = 0时的循环进入条件推断出来,它似乎展开为N*2+1。

#define X(n) ((n)*2+1) 
#define Y(n) ((n)*3)

带注释的程序集:

_foo:
;Prologue (assumed)
push ebp
mov ebp,esp

;Pre-scale N
mov eax,[ebp+8]
lea edx,[eax+eax]
lea ecx,[edx+eax] ;ECX = N*3
mov ebx,edx ;EBX = N*2

;Bail out earily if X(n) <= 0
lea eax,[edx+1] ;EAX = N*2+1
mov edx,0
test eax,eax ;(OF=0)
jle @@end ;Proceed if N*2+1 > 0

;Prepare loop counters
lea esi,[ecx*4] ;ESI = N*3*sizeof int, array stride
mov edx,[ebp+16] ;EDX = j
mov ecx,[ebp+12]
lea eax,[ecx+edx*4] ;EAX = &A[0][j]

mov edx,0 ;EDX = 0, accumulator
mov ecx,1 ;ECX = 1, loop counter
add ebx,2 ;EBX = N*2+2

;Step through the loop
@@loop:
add edx,[eax] ;EDX += A[i][j]
add ecx,1 ;Increment loop counter
add eax,esi ;++A
cmp ecx,ebx
jne @@loop ;[1..N*2+2) <=> [0..N*2+1)

@@end:
;Epilogue
mov eax,edx ;Return the sum
pop ebp
ret

关于c - 如何计算下面汇编中 C 宏表达式的定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20598918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com