1

我正在用汇编语言做一些练习,我发现了一个我无法弄清楚的关于优化的问题。任何人都可以帮助我吗

所以问题是优化以下汇编代码:

----------------------------------------示例1--------- ----

mov dx, 0 ---> this one I know-> xor dx,dx

----------------------------------------示例2--------- ---

cmp ax, 0
je label

----------------------------------------示例3--------- ----

mov ax, x
cwd
mov si, 16  
idiv si     

----> 在这个例子中我能想到的最多的是通过 idiv 16 替换最后 2 行,但我不确定

----------------------------------------示例4--------- ----

mov ax, x
mov bx, 7
mul bx
mov t, ax

----------------------------示例5--------- ------

mov si, offset array1
mov di, offset array2
; for i = 0; i < n; ++i
do:
   mov bx, [si]
   mov [di], bx
   add si, 2
   add di, 2
loop do
endforloop
4

2 回答 2

5

例如 2,您应该查看andortest操作码。与示例 1 类似,它们允许您消除对常量的需求。

例如 4,记住 that与 orx * 7相同x * (8 - 1),扩展 that, x * 8 - x。乘以八可以用移位指令完成。

例如 5,您会认为英特尔会提供一种更简单的方法来从 SI 转移到 DI,因为这就是它们存在的全部原因。也许像 REPetitive MOVe String Word 之类的东西 :-)

于 2012-04-06T03:41:19.997 回答
0

例如三,除以二的幂可以实现为右移。

请注意,在示例 5 中,当前代码无法根据需要初始化 CX(在优化版本中,您肯定也希望这样做)。

于 2012-04-06T04:37:33.277 回答