【问题标题】:Using registers and variables in 8086 asm programming在 8086 asm 编程中使用寄存器和变量
【发布时间】:2015-11-09 05:28:52
【问题描述】:

我开始掌握 asm 编程,但我觉得我在使用寄存器存储变量方面缺少一些东西。
我遇到的问题是某些指令会出于内部原因修改其他寄存器。在某些情况下,我使用这些寄存器来存储应用程序逻辑。
寄存器的使用有什么黄金法则吗?

例如:以下代码更改了DX 寄存器并清除了我当前的变量(也在DX 中)。

移动斧头,04h mov bx, 02h mul bx

我不想也不想声明我希望DX 寄存器被清除。这是怎么回事?

【问题讨论】:

  • 就是这样。您必须了解所有指令(或您打算使用的指令)的作用,并在编写代码时将其考虑在内。在您展示的情况下,32 位产品ax*bx 的最高有效字将存储在dx 中,这在Intel's manual (MUL r/m16 Unsigned multiply (DX:AX ← AX ∗ r/m16).) 中说明
  • 如果您不想要完整的结果,请使用imul ax, bx。但是这种形式的 imul 是新的 386 (ulukai.org/ecm/insref.htm#insIMUL)

标签: assembly x86-16 cpu-registers instruction-set


【解决方案1】:

像 mul 这样计算函数的指令需要一个寄存器来存储函数的结果。 DX 主要用于此。

您将无法将所有变量存储在寄存器中。您还需要使用堆和堆栈来存储变量。

堆栈对于临时存储变量特别有用。您的代码通常如下所示:

// some variable is in ax
// needing the register for something else now, pushing current variable to the stack

push ax

// put some new value into ax
// ... do some computations with it ...
// now we need the old value back in ax

pop ax

【讨论】:

    【解决方案2】:

    欢迎来到汇编语言编程。简短的回答是选择最常被操纵的值。这是编译器用于寄存器分配的规则。他们使用启发式值对使用情况进行数字评分,然后将最好的分数放入寄存器中,直到没有更多分数为止。

    在 8086 汇编器中,寄存器的数量非常少,其中很多都有特殊用途。您已经发现了一个:muldiv 隐式使用 axdx。只需将mul 指令想象为mul dx:ax, operand,您就会看到发生了什么。这会让你的生活更加艰难,但架构设计师并不在意。她主要尝试使硬件实现更小、更快速。

    学习带有 32 位操作数的 x86 汇编将使您在这方面的工作更轻松,因为许多特殊用法都已消失。例如,有 2 个操作数 mul 指令采用目标寄存器和源,就像 add

    经验法则:

    • 将循环体中使用的变量放入寄存器中。对于嵌套循环,从最里面开始向外工作。

    • 对于需要特殊用途的计算:乘除(隐式使用ax和dx作为操作数)、可变移位计数(需要cx)、地址计算(需要bx、si或di)等,尽量安排在先前的计算期间将所需的数字放在必要的寄存器中,而不是添加额外的 mov。这称为寄存器定位。

    • 查看由优秀编译器生成的程序集,了解新的思维方式。许多人多年的专家思想进入了他们使用的策略。你可以向他们学习。

    【讨论】:

    • 我一直在使用堆栈来存储(推送/弹出),但我觉得这是错误的操作,因为这是一种浪费的操作。了解这是规划代码时的一个基本问题对我有帮助;因为这不是我做错的事情。都来了
    • 在那些较旧的 x86 16 位和 32 位 CPU 到 Intel Pentium 3 / AMD Athlon XP 上,push 和 pop 指令的组合比 mov 和 mov 的组合执行慢一些已知内存位置上的指令,例如数据段中的指令,并且总是更容易独立于堆栈指针获取内容。
    • "...架构设计师不太在意。正在尝试..." 为什么从 He 转变为 她?我自己不是以英语为母语的人,所以英语语言发生了一些变化,还是现在认为这在政治上更正确?
    • @SepRoland:是的,故意使用“she”来指代假设/未知的人,尤其是在刻板印象男性的工作中,是一种标准的表达方式,而不使用单数“他们”或传统的“他” “ 假设。如今,通常更鼓励在这种情况下使用“他们”。 “他们”更具包容性(性别可以是非二进制的),并且通常读起来更自然(尤其是在实践中这个人很可能是男性时)。 “自然阅读”的一部分来自单数“他们”,即使是对某些特定的人,而不仅仅是不认识的人。
    • 是的。我年纪大了,在我的生活中写了太多的东西。我在工作中整天都使用“他们”。我知道这是目前的做法以及所有原因。我同意他们的看法。但是当打算使用单数代词时使用“他们”仍然会像黑板上的指甲一样刺痛。所以我不时地恢复到旧的风格。无意冒犯。
    猜你喜欢
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    相关资源
    最近更新 更多