譬如 EAX AX AH AL 四個儲存器, 真實存在的其實只有一個 EAX, AX AH AL 不過是不同的訪問方式.
11111111 11111111 11111111 11111111 : EAX
11111111 11111111 11111111 11111111 : AX
11111111 11111111 11111111 11111111 : AH
11111111 11111111 11111111 11111111 : AL
//譬如 AX 是一個16位2字節儲存器, 它能接受的最大整數是 65535
{下面函數會返回 65535}function Fun: Integer;
{下面函數會出錯}
asm
mov ax, 65535 {給 AX 賦值就是給 EAX 賦值}
end;function Fun: Integer;
//同樣給 AL AH 賦值不能超過 255
asm
mov ax, 65536 {超出了 AX 的容量}
end;
{下面函數會返回 255}function Fun: Integer;
{下面函數會返回 65280}
asm
mov al, 255
end;function Fun: Integer;
{為什麼不是 255? 因為給 AH 賦值 255 後, EAX 中的值是 00000000 00000000 11111111 000000002}
asm
mov ah, 255
end;
//上面演示的是通過立即數(常量)賦值, 通過變量也是如此; 但在其他運算中會不會溢出是 CPU 之前不會知道的, 譬如:
{下面的函數不會出錯, 但返回的是 0 }function Fun: Integer;
//如果 AX 溢出, EAX 會不會接著?
asm
mov eax, 4294967295 {這是 eax 所能接受的最大整數}
add eax, 1 {再 +1 就放不下了}
end;
{因為結果會是: 1 00000000 00000000 00000000 000000002; EAX 只能放下32位, 前面的一位就被忽略了.}{下面的函數也會返回 0 , 看來不會進位到 EAX; AX 雖然是 EAX 的一部分, 但使用時也是相對獨立的}
//AH AL 也是如此
function Fun: Integer;
asm
mov ax, 65535
add ax, 1
end;{返回 0}
//對於負數呢?
function Fun: Integer;
asm
mov al, 255
add al, 1
end;
{下面函數不會有問題, 返回 -1 }function Fun: Integer;
{再小於這個數字就會報錯! }
asm
mov eax, -1
end;
{它們能接受的最小負整數分別是: }
function Fun: Integer;
asm
mov al, -256
mov ah, -256
mov ax, -63356
mov eax, -4294967296
end;
//但它們的返回值缺不能所願, 譬如:{下面函數會返回 0 }
{這個好理解, 函數的返回值是 Integer; Integer 的最小值是 -2147483648; 怎麼可能放得下 -4294967296? 又被忽略了.}
function Fun: Integer;
asm
mov eax, -4294967296
end;
//其他情況也大概如此, 現在給 AX 一個絕對放得下的一個值: -1
{竟然返回一個正數: 65535, 為什麼?}function Fun: Integer;
//下面兩個函數也是同樣的道理:
asm
mov ax, -1
end;
{
因為 -1 在 AX 中被存為: 11111111 111111112;
這樣 EAX 的值是: 00000000 00000000 11111111 111111112;
EAX 的最高位只有是 1 才有可能是個負數, 現在 EAX 中的值就是: 65535
}{返回 255}
//其他允許單獨訪問低16位和低8位的32位寄存器, 情況肯定也是如此.
function Fun: Integer;
asm
mov al, -1
end;
{返回 65280}
function Fun: Integer;
asm
mov ah, -1
end;