汇编语言寄存器

时间:2012-01-03 01:08:43

标签: assembly

我正在学习汇编编程,我遇到了一些注册表问题。例如,我遇到了这个:

mov ax, 3000
mov ds, ax
mov si, 200
mov ax, [si]
add si, 2
add ax, [si]
add si, 2
mov [si], ax
mov ax, 4c00
int 21

这段代码从3000:200和3000:202得到2个内存段的总和,并将结果放在3000:202上,我不明白ds和si之间的连接,因为我无法解释为什么我们做mov ds,斧头?我一般不理解寄存器之间的联系......我知道它们代表什么但是...我不知道一些帮助会非常有用,谢谢

2 个答案:

答案 0 :(得分:3)

DS是数据段寄存器 - 与所有段寄存器一样,其值乘以16表示64K块存储器的基址。

执行指令时,通过获取段寄存器表示的基址(默认情况下,DS寄存器用于数据)并添加由常量或寄存器指定的偏移值来计算存储器地址。

因此,mov ax, [si]相当于mov ax, [ds:si],其中(带有您的注册值)代表mov ax, [3000:200]。在内部,处理器将计算(3000 * 16)+200的绝对存储器地址,并将该存储器位置的数据复制到ax。添加和保存结果时,内存访问使用类似的过程。

你不能做mov ds, 3000的原因仅仅是因为英特尔决定不支持将常数值移动到段寄存器中 - 没有可编码的指令。相反,您必须通过另一个寄存器传输该值(在您的代码ax中使用)。

您的(原始)描述不太正确 - 代码确实在[3000:200]和[3000:202]添加了值,但结果将存储到[3000:204](不是[3000: 202])。

不要忘记:存储在段寄存器中的值(如DS(和CS,ES,FS和GS))不直接指定基址 - 它们必须始终乘以16才能得到实际的基址。

答案 1 :(得分:1)

Ds是数据段寄存器。正如您所提到的那样,地址是由ds寄存器和si寄存器组合而成的。在旧的8088/86天中,在这种情mov to ax然后ds是因为可能会限制你可以/不能立即执行移动。也许你不能做一个mov ds,3000,在任何一种情况下,ax都被用作这个的中间寄存器,根本就没有连接只能将3000送入ds寄存器。

因此,如果ds = 3000且si = 200,则假设地址为(3000 <4)+200。

隐含了ds和si之间的连接。查看来自intel的程序员参考手册,当使用SI或DI时,DS段是默认的。 CS:ES:SS是SI的替代(但不是DI),您需要在指令/程序集中指定备用段以使用其他段之一。如何指定备用段取决于汇编程序所需的语法。