繁体   English   中英

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 循环“初始化”的一部分。 然而,这似乎并没有解决提供的空白,所以我真的被卡住了。

我想我有一个非常接近的,如果不是完美的解决方案:

/* 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; 是一个问题,但我找不到更好的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM