x86部分寄存器用法

时间:2014-02-21 06:33:34

标签: assembly x86

如果我保存一个值,那么就说8位寄存器DH中的10,然后是8位寄存器DL中的另一个值15。这是否有效,或者它们是否会互相覆盖,因为它们都在32位EDX寄存器中?

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

jle done

基本上我只是在使用8位寄存器时会感到困惑,它会如何影响32位寄存器,反之亦然。 谢谢。

另外,您可以在EDXDH中保存值7,而DL仍会有自己的值,或者它们现在有7吗?

2 个答案:

答案 0 :(得分:7)

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)。


  

另外,您可以在EDXDH保存值7吗?DL仍然有自己的值,或者它们现在有7个?

正如您可以从上面的示例中推断出的那样,DH将获得值0,DL将获得值7.

答案 1 :(得分: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.