譬如 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;
asm
mov ax, 65536 {超出了 AX 的容量}
end;
//同样给 AL AH 赋值不能超过 255
{下面函数会返回 255}function Fun: Integer;
asm
mov al, 255
end;
{下面函数会返回 65280}function Fun: Integer;
asm
mov ah, 255
end;
{为什么不是 255? 因为给 AH 赋值 255 后, EAX 中的值 是 00000000 00000000 11111111 000000002}
//上面演示的是通过立即数(常量)赋值, 通过变量也是如此; 但在其他运算中会不会溢出是 CPU 之前不会知道的, 譬如:
{下面的函数不会出错, 但返回的是 0 }function Fun: Integer;
asm
mov eax, 4294967295 {这是 eax 所能接受的最大整数}
add eax, 1 {再 +1 就放不下了}
end;
{因为结果会是: 1 00000000 00000000 00000000 000000002; EAX 只能放下32位, 前面的一位就被忽略了.}
//如果 AX 溢出, EAX 会不会接着? {下面的函数也会返回 0 , 看来不会进位到 EAX; AX 虽然是 EAX 的一部分, 但使用时 也是相对独立的}
function Fun: Integer;
asm
mov ax, 65535
add ax, 1
end;
//AH AL 也是如此{返回 0}
function Fun: Integer;
asm
mov al, 255
add al, 1
end;