在 8086 asm 编程中使用寄存器和变量
Using registers and variables in 8086 asm programming
我开始掌握 asm 编程,但我觉得我遗漏了一些关于使用寄存器存储变量的内容。
我遇到的问题是某些指令会出于内部原因修改其他寄存器。在某些情况下,我使用这些寄存器来存储应用程序逻辑。
有没有关于如何使用寄存器的黄金法则?
例如:以下代码更改 DX
寄存器并清除我的当前变量(也在 DX
中)。
mov ax, 04h
mov bx, 02h
mul bx
我不想也不想说我希望 DX
寄存器被清除。这是怎么回事?
像 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
欢迎使用汇编语言编程。简短的回答是选择最常被操纵的值。这是编译器用于寄存器分配的规则。他们使用启发式值对使用情况进行数字评分,然后将最好的分数存入寄存器,直到没有更多为止。
在8086汇编器中,你的寄存器数量非常少,而且很多都是有特殊用途的。您发现了一个:mul
和 div
隐式使用 ax
和 dx
。只需将 mul
指令想象成 mul dx:ax, operand
,您就会明白发生了什么。这会让你的生活更艰难,但架构设计师并不在意。她主要尝试使硬件实现变得小而快。
学习使用 32 位操作数的 x86 汇编将使您在这方面的生活更轻松,因为许多特殊用法都消失了。例如,有 2 个操作数的 mul
指令,它们采用目标寄存器和源寄存器,就像 add
.
经验法则:
将循环体内使用的变量放入寄存器中。对于嵌套循环,从最里面开始向外工作。
对于需要特殊用途的计算:乘法和除法(隐式使用 ax 和 dx 作为操作数)、可变移位计数(需要 cx)、地址计算(需要 bx、si 或 di)等,尽量在前面的计算中把需要的数安排在必要的寄存器中,而不是多加一个mov。这称为注册目标。
查看由优秀编译器生成的程序集以获得新的思维方式。许多人多年的专家思想进入了他们使用的策略。你可以向他们学习。
我开始掌握 asm 编程,但我觉得我遗漏了一些关于使用寄存器存储变量的内容。
我遇到的问题是某些指令会出于内部原因修改其他寄存器。在某些情况下,我使用这些寄存器来存储应用程序逻辑。
有没有关于如何使用寄存器的黄金法则?
例如:以下代码更改 DX
寄存器并清除我的当前变量(也在 DX
中)。
mov ax, 04h mov bx, 02h mul bx
我不想也不想说我希望 DX
寄存器被清除。这是怎么回事?
像 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
欢迎使用汇编语言编程。简短的回答是选择最常被操纵的值。这是编译器用于寄存器分配的规则。他们使用启发式值对使用情况进行数字评分,然后将最好的分数存入寄存器,直到没有更多为止。
在8086汇编器中,你的寄存器数量非常少,而且很多都是有特殊用途的。您发现了一个:mul
和 div
隐式使用 ax
和 dx
。只需将 mul
指令想象成 mul dx:ax, operand
,您就会明白发生了什么。这会让你的生活更艰难,但架构设计师并不在意。她主要尝试使硬件实现变得小而快。
学习使用 32 位操作数的 x86 汇编将使您在这方面的生活更轻松,因为许多特殊用法都消失了。例如,有 2 个操作数的 mul
指令,它们采用目标寄存器和源寄存器,就像 add
.
经验法则:
将循环体内使用的变量放入寄存器中。对于嵌套循环,从最里面开始向外工作。
对于需要特殊用途的计算:乘法和除法(隐式使用 ax 和 dx 作为操作数)、可变移位计数(需要 cx)、地址计算(需要 bx、si 或 di)等,尽量在前面的计算中把需要的数安排在必要的寄存器中,而不是多加一个mov。这称为注册目标。
查看由优秀编译器生成的程序集以获得新的思维方式。许多人多年的专家思想进入了他们使用的策略。你可以向他们学习。