汇编语言注册

问题描述:

我学习汇编语言编程,我遇到了与注册的一些问题。比如我碰到这样的:汇编语言注册

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 

该代码使得2个内存段从3000总和:200和3000:202,并把对3000结果:202,我不明白DS之间的连接因为我无法解释我们为什么要这样做,斧头?我一般不明白寄存器之间的连接......我知道他们主张,但...我不知道有些帮助将是非常有用的感谢

Ds在数据段寄存器。地址如您所述,通过组合ds寄存器和si寄存器组成。在旧八十六分之八千零八十八天,或许你仍然在这种情况下,计算出你的地址(DS < < 4)+ SI。 mov到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),您需要在指令/程序集中指定替代段以使用其他段中的一个。您如何指定备用段取决于汇编程序所期望的语法。

简而言之,

你不能直接给段寄存器赋值立即数。这就是为什么你使用通用注册表来为你工作。

mov ds, ax 

关于DS和SI,您有一些假设DS:SI正常工作的说明,但在此情况并非如此。 DS是您的默认数据段,因此它只是假设DS:offset; SI在你的情况下是你的抵消。您可以将SI更改为任何其他16位寄存器,例如CX,它可以同样工作。进行测试和反馈我:P

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才能得到真实的基地址。