2014-02-21 82 views
1

如果我在8位寄存器DH中保存一个值,比如10,然后在8位寄存器DL中存储另一个值15。这样做还是会互相推翻,因为它们都在32位EDX寄存器中?x86部分寄存器使用情况

mov $10, %DH 
mov $15, %DL 
cmp %DL, %DH 

jle done 

基本上我只是混淆了,当我使用8位寄存器将如何影响32位寄存器,反之亦然。 谢谢。

另外,你可以保存价值7在EDXDHDL仍然会有自己的价值,或者他们现在有7?

回答

6

DLDX的最低有效字节,而DHDX的最高有效字节。 DX又是EDX的最低有效字。

所以:

MOV EDX,0x12345678 
; Now EDX = 0x12345678, DX = 0x5678, DH = 0x56, DL = 0x78 

MOV DL,0x01 
; Now EDX = 0x12345601, DX = 0x5601, DH = 0x56, DL = 0x01 

MOV DH,0x99 
; Now EDX = 0x12349901, DX = 0x9901, DH = 0x99, DL = 0x01 

MOV DX,0x1020 
; Now EDX = 0x12341020, DX = 0x1020, DH = 0x10, DL = 0x20 

正如你所看到的,你可以写信给DLDH没有他们互相影响(但你仍然是影响DXEDX)。


而且,你能保存EDXDHDL值7仍然有自己的价值观或将他们现在有7?

正如你可以从上面我的例子推断,DH会得到值0,DL值7

2

如果解决DH和DL独立,那么值是单独访问,使用,只要保持因为您不会执行会影响注册表其他部分的操作。

例如

     EDX------ 
          DX -- 
          DH DL 
xor edx, edx ; edx = 0000 00 00 
mov 01h, dh ; edx = 0000 01 00 
mov 02h, dl ; edx = 0000 01 02 
sub dh, dl  ; edx = 0000 ff 01 <- Note that this doesn't 
       ; overflow to the high word, because you 
       ; are using only 8 bit registers 
mov 80000001, eax 
sub edx, eax ; edx = 8000 FF 03 <- Here you will affect 
       ; the whole register, because you address it with 32 bit.