首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 內嵌組合語言教學 (29):寄存器數值範圍與溢出行為

     編輯:Delphi

理解寄存器位寬決定的數值範圍、有符號/無符號解讀差異、溢出截斷行為,是編寫正確組合語言代碼的基礎。本文以 EAX/AX/AH/AL 為例詳細演示。

寄存器重疊關係

EAX (32位) = 11111111 11111111 11111111 11111111
AX  (16位) =                 11111111 11111111
AH  (8位)  =                 11111111
AL  (8位)  =                             11111111

EAX、AX、AH、AL 實際指向同一物理寄存器的不同位範圍。

無符號數值範圍

寄存器位寬最大值十六進位
AL / AH8 位255$FF
AX16 位65,535$FFFF
EAX32 位4,294,967,295$FFFFFFFF

溢出截斷演示

{ 超出 AX 容量會編譯錯誤 }
mov ax, 65536  { Error }

{ 運行時溢出:EAX 最大值 + 1 = 0 (高位截斷) }
mov eax, 4294967295
add eax, 1     { EAX = 0 }

{ AX 溢出不進位到 EAX 高位 }
mov ax, 65535
add ax, 1      { AX = 0, EAX 高 16 位不變 }

{ AL 溢出 }
mov al, 255
add al, 1      { AL = 0 }

有符號數範圍 (補碼表示)

寄存器最小值最大值
AL / AH-128127
AX-32,76832,767
EAX-2,147,483,6482,147,483,647

負數賦值陷阱

{ mov ax, -1 實際存入 11111111 11111111b }
{ EAX 變為 00000000 00000000 11111111 11111111b = 65535 }
{ 函數返回 Integer 時會被解讀為正數 65535 ! }

{ 正確做法:使用 32 位寄存器 }
mov eax, -1   { EAX = $FFFFFFFF = -1 (正確) }

關鍵結論

  • 8/16 位寄存器溢出不進位到高位
  • 負數賦值給部分寄存器會導致符號擴展錯誤
  • 函數返回值請務必使用完整位寬寄存器 (EAX/ECX/EDX)
  • Delphi Integer 為 32 位有符號,對應 EAX
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved