我开始掌握asm编程但我觉得我遗漏了一些关于使用寄存器来存储变量的东西.我遇到的问题是,由于内部原因,某些指令会修改其他寄存器.在某些情况下,我使用这些寄存器来存储应用程序逻辑.如何使用寄存器有什么黄金法则吗?
例如:以下代码更改dx寄存器并清除当前变量.
mov ax, 04h mov bx, 02h mul bx
我不想也不说我希望dx寄存器被清除掉.这里发生了什么?
Welcome to assembly language programming. The short answer is pick the values that are manipulated most often. This is the rule compilers use for register allocation. They score usages numerically with heuristic values, then put the best scores in registers until there are no more.
在8086汇编程序中,您只有很少的寄存器,其中许多都有特殊用途.你发现了一个:mul和div隐含地使用ax和dx.只要把mul指令想象成mul dx:ax, operand,你就会看到发生了什么.这使你的生活更加艰难,但是装配水平,建筑设计师并不在意.他正试图让硬件实现小而快.
研究具有32位操作数的x86程序集将使您在这方面的生活更轻松,因为许多特殊用法消失了.例如,有2个操作数mul指令,它们就像目标寄存器和源一样add.
经验法则:
将变量放在循环体中的寄存器中.对于嵌套循环,它是最里面的,然后向外工作.
对于需要特殊用途的计算用法:乘法和除法(隐式使用ax和dx作为操作数),变量移位计数(需要cx),地址计算(需要bx,si或di)等,尝试安排所需的在上一次计算期间,数字必须在必要的寄存器中,而不是添加额外的mov.这称为寄存器定位.
看一下好的编译器为新的思维方式生成的汇编.许多人年的专家虽然参与了他们使用的策略.你可以向他们学习.
| 归档时间: |
|
| 查看次数: |
2011 次 |
| 最近记录: |