Assembly 汇编语言寄存器
我在学习汇编编程,遇到了一些注册表问题。例如,我遇到了这样一个问题:Assembly 汇编语言寄存器,assembly,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中的两个内存段相加,并将结果放在3000:202上,我不理解ds和si之间的关系,因为我无法解释为什么要使用mov ds,ax?我通常不理解寄存器之间的联
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中的两个内存段相加,并将结果放在3000:202上,我不理解ds和si之间的关系,因为我无法解释为什么要使用mov ds,ax?我通常不理解寄存器之间的联系。。。我知道他们代表什么,但是。。。我不知道有什么帮助会很有用,谢谢Ds是数据段寄存器。地址如您所述,由ds寄存器和si寄存器组合而成。在旧的8088/86天中,您可能仍然计算您的地址(dsds是数据段寄存器。该地址如您所述由ds寄存器和si寄存器组合而成。在旧的8088/86天中,您可能仍然计算您的地址(ds简而言之 您不能直接将立即数赋值给段寄存器。这就是为什么该行使用通用寄存器为您完成这项工作的原因
mov-ds,ax
关于DS和SI,您有一些指令假设DS:SI正常工作,但这里不是这样。DS是您的默认数据段,所以它只是假设DS:offset
;SI是您的情况下的偏移量。您可以将SI更改为任何其他16位寄存器,例如,CX,它也会正常工作。进行测试并反馈我:简而言之
您不能直接将立即数赋值给段寄存器。这就是为什么该行使用通用寄存器为您完成这项工作的原因
mov-ds,ax
关于DS和SI,您有一些指令假设DS:SI正常工作,但这里不是这样。DS是您的默认数据段,所以它只是假设
DS:offset
;SI是您的情况下的偏移量。您可以将SI更改为任何其他16位寄存器,例如,CX,它也会正常工作。进行测试并反馈me:PDS是数据段寄存器-与所有段寄存器一样,其值乘以16表示64K内存块的基址
执行指令时,内存地址的计算方法是:取段寄存器表示的基址(默认情况下,DS寄存器用于数据)并加上常数或寄存器指定的偏移值 因此,mov-ax,[si]
相当于mov-ax,[ds:si]
,它(用寄存器值)表示mov-ax,[3000:200]
。在内部,处理器将计算(3000*16)的绝对内存地址+200并将数据从该内存位置复制到ax
。添加和保存结果时,内存访问使用类似的过程
您不能执行mov ds,3000的原因很简单,因为Intel决定不支持将常量值移动到段寄存器中-没有可编码的指令。相反,您必须通过另一个寄存器传输值(在您的代码中使用ax)
您的(原始)描述不太正确-代码确实添加了[3000:200]和[3000:202]处的值,但结果将存储到[3000:204](而不是[3000:202])
不要忘记:存储在段寄存器(如DS(以及CS、ES、FS和GS)中的值不会直接指定基址-它们必须始终乘以16才能得到真实的基址。DS是数据段寄存器-与所有段寄存器一样,其值乘以16表示64K内存块的基址 执行指令时,内存地址的计算方法是:取段寄存器表示的基址(默认情况下,DS寄存器用于数据)并加上常数或寄存器指定的偏移值 因此,
mov-ax,[si]
相当于mov-ax,[ds:si]
,它(用寄存器值)表示mov-ax,[3000:200]
。在内部,处理器将计算(3000*16)的绝对内存地址+200并将数据从该内存位置复制到ax
。添加和保存结果时,内存访问使用类似的过程
您不能执行mov ds,3000的原因很简单,因为Intel决定不支持将常量值移动到段寄存器中-没有可编码的指令。相反,您必须通过另一个寄存器传输值(在您的代码中使用ax)
您的(原始)描述不太正确-代码确实添加了[3000:200]和[3000:202]处的值,但结果将存储到[3000:204](而不是[3000:202])
别忘了:存储在段寄存器(如DS(和CS、ES、FS和GS)中的值不会直接指定基址——它们必须始终乘以16才能得到真正的基址