关于初始化寄存器

时间:2019-11-24 11:25:25

标签: assembly x86-16 cpu-registers

我是汇编语言编程的新手,正在研究dosbox应用程序。

我的问题是,当我们用汇编语言编写任何程序时,是否需要在初始化C#编程中的变量时初始化通用寄存器?

我们可以将AL中的ax寄存器初始化为:

mov ax,0?

1 个答案:

答案 0 :(得分:2)

mov ax, 1234并不依赖于旧值,就像在C#中一样,您可以编写x = 1234赋值而不必先将其归零。

寄存器是永久存在的,它并不能像int foo = 1234那样精确地创建一个新的存储位置,但是考虑将寄存器的第一次写入初始化您正在使用的本地变量可能会有所帮助该注册持有。

每条指令对体系结构状态(寄存器和内存内容)的影响都是固定的,就像状态机一样。您如何到达当前状态并不重要。 mov ax, 1234的效果始终是 来覆盖ax的先前值,因此它保存1234,又名0x04d2,又称二进制位模式,代表两个数字。

如果您想对数组求和,则可以在使用mov ax, 0 / add ax, [si]的循环之前add si,2,因为这是实现与C {{1}相同的逻辑的一种方法}仅需要 初始化为零,因为我们要使用int sum=0; for(...) { sum += *p; p++;}之类的依赖于旧值 1 的指令。


脚注1:如果要优化代码大小,则可以使用addlodsw,因为add dx, ax会使lodsw增加2。当然,您可以d始终使用si而不是xor eax,eax来将AX归零:尽管有出现,CPU还是有一种特殊情况,即微体系结构的归零成语 not 对寄存器的旧值有输入依赖性。

mov ax,0并非如此;这样只会节省代码大小,但不会将整个寄存器清零,因此现代CPU不会对其进行特殊处理。但是,如果您要针对386之前的CPU进行编程,则无论如何都将使用xor ax,ax;它并不会执行无序的exec,而输入依赖关系也无关紧要:xor ax,ax始终为零,无论其值如何。


  

在初始化C#编程中的变量时,是否需要初始化通用寄存器?

几乎是;在asm中的寄存器只需要与高级语言中的变量一样多的初始化:在第一次读取之前至少要初始化一次,除非它们是传入函数args。

声明时,

C / C ++ / C#变量的首次使用将是仅写操作,不需要 进行初始化。 (尽管在现代C ++和C#风格中,您通常要等到第一次分配时才声明它们。)

您可以将寄存器视为一些局部变量的有限空间,和/或临时计算的临时空间。

正如Michael Petch所评论的,不要使用的注册可以保持不变。