加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C转换为汇编语言

发布时间:2020-12-16 09:49:08 所属栏目:百科 来源:网络整理
导读:这是我的任务. 我已经为这个程序集完成了我的代码,但有没有办法让转换速度更快? 提前感谢任何帮助; D. //Convert this nested for loop to assembly instructions for (a = 0; a y; a++) for (b = 0; b y; b++) for (c = 0; c y; c++) if ((a + 2 * b - 8 *
这是我的任务.
我已经为这个程序集完成了我的代码,但有没有办法让转换速度更快?
提前感谢任何帮助; D.

//Convert this nested for loop to assembly instructions
    for (a = 0; a < y; a++)
        for (b = 0; b < y; b++)
            for (c = 0; c < y; c++)
                if ((a + 2 * b - 8 * c) == y)
                    count++;

convert
    _asm {
                mov ecx,0
                mov ax,0
                mov bx,0
                mov cx,0

                Back:
                push cx
                push bx
                push ax
                add bx,bx
                mov dx,8
                mul dx
                add cx,bx
                sub cx,ax
                pop ax
                pop bx
                cmp cx,y
                jne increase
                inc count
                increase : pop cx
                          inc ax
                           cmp ax,y
                           jl Back

                           inc bx
                           mov ax,0
                           cmp bx,y
                           jl Back

                           inc cx
                           mov ax,0
                           mov bx,0
                           cmp cx,y
                           jl Back

        }

解决方法

一些通用技巧:

>使循环计数器倒计数而不是向上计数.你用这种方式消除了比较.
>了解LEA的神奇之处,计算包含2个特定幂的加法和缩放的表达式.在任何地方都不需要MUL.
>在内循环外提升循环不变的工作.对于c循环的每次迭代,a 2 * b是常数.
>使用SI,DI保存值.这应该可以帮助您避免所有那些推送和弹出指令.
>如果您的值适合8位,请使用AH,AL等来更有效地使用寄存器.

哦,在inc cx之后你不需要那个mov ax,因为AX已经是0了.

特定于此算法:如果y为奇数,则跳过a为偶数的迭代,反之亦然.将近2倍的加速等待……(如果你想知道为什么,请用铅笔和纸做.)提示:你也不需要测试每次迭代.如果你足够聪明的话,你可以简单地逐步走2点.

或者更好的是,制作一个封闭的表格,让您直接计算答案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读