妖哥 2008-4-8 21:00
初学 Delphi 嵌入汇编[29] - 寄存器所能接受的数值范围
譬如 EAX AX AH AL 四个储存器, 真实存在的其实只有一个 EAX, AX AH AL 不过是不同的访问方式.
[color=#ff0000]11111111 11111111 11111111 11111111[/color] : EAX
11111111 11111111 [color=#ff0000]11111111 11111111[/color] : AX
11111111 11111111 [color=#ff0000]11111111[/color] 11111111 : AH
11111111 11111111 11111111 [color=#ff0000]11111111[/color] : AL
[color=#008000]//譬如 AX 是一个16位2字节储存器, 它能接受的最大整数是 65535
{下面函数会返回 65535}[/color]
[b][color=#000080]function[/color][/b] Fun: Integer;
[b][color=#000080]asm[/color][/b]
mov ax, [color=#0000ff]65535[/color] [color=#008000]{给 AX 赋值就是给 EAX 赋值}[/color]
[b][color=#000080]end[/color][/b];
[color=#008000]{下面函数会出错}[/color]
[b][color=#000080]function[/color][/b] Fun: Integer;
[b][color=#000080]asm[/color][/b]
mov ax, [color=#0000ff]65536[/color] [color=#008000]{超出了 AX 的容量}[/color]
[b][color=#000080]end[/color][/b];
[color=#008000]//同样给 AL AH 赋值不能超过 255
{下面函数会返回 255}[/color]
[b][color=#000080]function[/color][/b] Fun: Integer;
[b][color=#000080]asm[/color][/b]
mov al, [color=#0000ff]255[/color]
[b][color=#000080]end[/color][/b];
[color=#008000]{下面函数会返回 65280}[/color]
[b][color=#000080]function[/color][/b] Fun: Integer;
[b][color=#000080]asm[/color][/b]
mov ah, [color=#0000ff]255[/color]
[b][color=#000080]end[/color][/b];
[color=#008000]{为什么不是 255? 因为给 AH 赋值 255 后, EAX 中的值是 00000000 00000000 11111111 000000002}[/color]
[color=#008000]//上面演示的是通过立即数(常量)赋值, 通过变量也是如此; 但在其他运算中会不会溢出是 CPU 之前不会知道的, 譬如:
{下面的函数不会出错, 但返回的是 0 }[/color]
[b][color=#000080]function[/color][/b] Fun: Integer;
[b][color=#000080]asm[/color][/b]
mov eax, [color=#0000ff]4294967295[/color] [color=#008000]{这是 eax 所能接受的最大整数}[/color]
add eax, [color=#0000ff]1[/color] [color=#008000]{再 +1 就放不下了}[/color]
[b][color=#000080]end[/color][/b];
[color=#008000]{因为结果会是: 1 00000000 00000000 00000000 000000002; EAX 只能放下32位, 前面的一位就被忽略了.}[/color]
[color=#008000]//如果 AX 溢出, EAX 会不会接着?
{下面的函数也会返回 0 , 看来不会进位到 EAX; AX 虽然是 EAX 的一部分, 但使用时也是相对独立的}[/color]
[b][color=#000080]function[/color][/b] Fun: Integer;
[b][color=#000080]asm[/color][/b]
mov ax, [color=#0000ff]65535[/color]
add ax, [color=#0000ff]1[/color]
[b][color=#000080]end[/color][/b];
[color=#008000]//AH AL 也是如此
{返回 0}[/color]
[b][color=#000080]function[/color][/b] Fun: Integer;
[b][color=#000080]asm[/color][/b]
mov al, [color=#0000ff]255[/color]
add al, [color=#0000ff]1[/color]
[b][color=#000080]end[/color][/b];
[color=#008000]//对于负数呢?
[/color]
[color=#008000]{下面函数不会有问题, 返回 -1 }[/color]
[b][color=#000080]function[/color][/b] Fun: Integer;
[b][color=#000080]asm[/color][/b]
mov eax, -[color=#0000ff]1[/color]
[b][color=#000080]end[/color][/b];
[color=#008000]{它们能接受的最小负整数分别是: }[/color]
[b][color=#000080]function[/color][/b] Fun: Integer;
[b][color=#000080]asm[/color][/b]
mov al, -[color=#0000ff]256[/color]
mov ah, -[color=#0000ff]256[/color]
mov ax, -[color=#0000ff]63356[/color]
mov eax, -[color=#0000ff]4294967296[/color]
[b][color=#000080]end[/color][/b];
[color=#008000]{再小于这个数字就会报错! }[/color]
[color=#008000]//但它们的返回值缺不能所愿, 譬如:
{下面函数会返回 0 }[/color]
[b][color=#000080]function[/color][/b] Fun: Integer;
[b][color=#000080]asm[/color][/b]
mov eax, -[color=#0000ff]4294967296[/color]
[b][color=#000080]end[/color][/b];
[color=#008000]{这个好理解, 函数的返回值是 Integer; Integer 的最小值是 -2147483648; 怎么可能放得下 -4294967296? 又被忽略了.}[/color]
[color=#008000]//其他情况也大概如此, 现在给 AX 一个绝对放得下的一个值: -1
{竟然返回一个正数: 65535, 为什么?}[/color]
[b][color=#000080]function[/color][/b] Fun: Integer;
[b][color=#000080]asm[/color][/b]
mov ax, -[color=#0000ff]1[/color]
[b][color=#000080]end[/color][/b];
[color=#008000]{
因为 -1 在 AX 中被存为: 11111111 111111112;
这样 EAX 的值是: 00000000 00000000 11111111 111111112;
EAX 的最高位只有是 1 才有可能是个负数, 现在 EAX 中的值就是: 65535
}[/color]
[color=#008000]//下面两个函数也是同样的道理:
[/color]
[color=#008000]{返回 255}[/color]
[b][color=#000080]function[/color][/b] Fun: Integer;
[b][color=#000080]asm[/color][/b]
mov al, -[color=#0000ff]1[/color]
[b][color=#000080]end[/color][/b];
[color=#008000]{返回 65280}[/color]
[b][color=#000080]function[/color][/b] Fun: Integer;
[b][color=#000080]asm[/color][/b]
mov ah, -[color=#0000ff]1[/color]
[b][color=#000080]end[/color][/b];
[color=#008000]//其他允许单独访问低16位和低8位的32位寄存器, 情况肯定也是如此.
[/color]