王爽老師書上說, CPU 內部主要就是寄存器.
現在我們在 32 位的系統下工作, 當然主要使用的是 32 位寄存器; 那它和 8 位、 16 位的寄存器又有什麼關系呢?
從網上找到一個簡潔明了的圖片:
EAX 是 32 位的, 也就是 4 個字節大小; 它的低兩位就是 AX;
AX 是 16 位的, 又分 2 個字節; 它的高字節是 AH、低字節是 AL;
AH 與 AL 是 8 位的.
這樣就兼容了以前的 16 位與 8 位.
同理,
EBX 就包含著 BX BH BL;
ECX 就包含著 CX CH CL;
EDX 就包含著 DX DH DL;
好啊, 一下子認識了那麼多寄存器!
按照這個道理, 如果給 EAX 賦了值, 那麼 AX AH AL 也就都有了值;
如果給 AL 賦了值, 那麼 AX EAX 也就有了值.
//測試1var
i: integer; {4 字節、32 位}
w: word; {2 字節、16 位}
b1,b2: byte; {1 字節、 4 位}
begin
i := maxint;
w := 0;
b1 := 0;
b2 := 0;
asm
mov ecx, i
mov w, cx
mov b1, ch
mov b2, cl
end;
ShowMessage(Format('w=%d; b1=%d; b2=%d',[w,b1,b2]));
{結果顯示: w=65535; b1=255; b2=255
果然沒錯, 給 ecx 賦值後, cx ch cl 都有值了!
}
end;
//測試2var
i: integer; {4 字節、32 位}
w: word; {2 字節、16 位}
b: byte; {1 字節、 4 位}
begin
b := 255;
i := 0;
w := 0;
asm
mov cl, b
mov w, cx
mov i, ecx
end;
ShowMessage(Format('i=%d; w=%d',[i,w]));
{結果顯示: i=255; w=255
這好像是沒有問題的, 我用 al ax eax 三個寄存器測試也是如此;
但用 dl dx edx 測試, 就會有意外的結果, 奇怪呀!
}
end;