首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x86-64程序集循环

x86-64程序集循环
EN

Stack Overflow用户
提问于 2020-01-14 06:22:14
回答 1查看 189关注 0票数 2

这个问题是一个朋友向我提出的,我不知道如何解决它。

代码语言:javascript
复制
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中的这个循环,

代码语言:javascript
复制
int loop(int a, int b){
    int x, y;
    y = ____;
    for (____; ____; ____){
        ____;
    }
    return ____;
}

我尝试将程序集转换为C语言,

代码语言:javascript
复制
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循环“初始化”的一部分。然而,这似乎没有修复提供的空白,所以我真的卡住了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-14 08:37:02

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

代码语言:javascript
复制
/* 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;是不是有问题,但我找不到更好的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59725027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档