x86-64 汇编循环
x86-64 Assembly Loop
这个问题是朋友问我的,我不知道怎么解决。
loop:
leal (%rdi, %rdi, 4), %eax
leal (%rsi, %rax, 2), %eax
leal 0(, %rax, 4), %edx
cmpl %edx, %esi
jge .L1
leal (%rdi, %rdi, 2), %edx
.L3:
addl %edx, %eax
cmpl $-2, %esi
jl .L3
.L1:
rep ret
并且应该映射到 C 中的这个循环,
int loop(int a, int b){
int x, y;
y = ____;
for (____; ____; ____){
____;
}
return ____;
}
我尝试将程序集转换为 C,
y = 5a;
y = b + 2y;
x = 4y;
if (x < b){
x = 3a;
do{
y += x;
} while (b <= -2);
}
return y;
我假设 %eax = y,因为要填充的代码中的 'y' 是第一个被赋值的变量。
'x' 跟在 %edx 之后,因为它是另一个赋值,所以应该至少是 for 循环的 "Initialisation" 的一部分。
然而,这似乎并没有解决所提供的空白,所以我真的被卡住了。
我想我已经找到了一个非常接近但不是完美的解决方案:
/* rdi = a, rsi = b */
/* rax = y, rdx = x */
/*
loop:
leal (%rdi, %rdi, 4), %eax
leal (%rsi, %rax, 2), %eax
leal 0(, %rax, 4), %edx
cmpl %edx, %esi
jge .L1
leal (%rdi, %rdi, 2), %edx
.L3:
addl %edx, %eax
cmpl $-2, %esi
jl .L3
.L1:
rep ret
*/
int loop(int a, int b){
int x, y;
y = b + (a * 5) * 2;
for (x = y * 4; x > b;){
do y += (x = a * 3); while(b < -2);
break;
}
return y;
}
不确定 break;
是否有问题,但我找不到更好的方法。
这个问题是朋友问我的,我不知道怎么解决。
loop:
leal (%rdi, %rdi, 4), %eax
leal (%rsi, %rax, 2), %eax
leal 0(, %rax, 4), %edx
cmpl %edx, %esi
jge .L1
leal (%rdi, %rdi, 2), %edx
.L3:
addl %edx, %eax
cmpl $-2, %esi
jl .L3
.L1:
rep ret
并且应该映射到 C 中的这个循环,
int loop(int a, int b){
int x, y;
y = ____;
for (____; ____; ____){
____;
}
return ____;
}
我尝试将程序集转换为 C,
y = 5a;
y = b + 2y;
x = 4y;
if (x < b){
x = 3a;
do{
y += x;
} while (b <= -2);
}
return y;
我假设 %eax = y,因为要填充的代码中的 'y' 是第一个被赋值的变量。 'x' 跟在 %edx 之后,因为它是另一个赋值,所以应该至少是 for 循环的 "Initialisation" 的一部分。 然而,这似乎并没有解决所提供的空白,所以我真的被卡住了。
我想我已经找到了一个非常接近但不是完美的解决方案:
/* rdi = a, rsi = b */
/* rax = y, rdx = x */
/*
loop:
leal (%rdi, %rdi, 4), %eax
leal (%rsi, %rax, 2), %eax
leal 0(, %rax, 4), %edx
cmpl %edx, %esi
jge .L1
leal (%rdi, %rdi, 2), %edx
.L3:
addl %edx, %eax
cmpl $-2, %esi
jl .L3
.L1:
rep ret
*/
int loop(int a, int b){
int x, y;
y = b + (a * 5) * 2;
for (x = y * 4; x > b;){
do y += (x = a * 3); while(b < -2);
break;
}
return y;
}
不确定 break;
是否有问题,但我找不到更好的方法。