Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编语言寄存器_Assembly - Fatal编程技术网

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:P

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

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