- x86匯編與逆向工程:軟件破解與防護的藝術
- (美)斯蒂芬妮·多馬斯 (美)克里斯托弗·多馬斯
- 703字
- 2025-02-10 16:05:42
2.2 匯編語法
在數千種可能的計算機架構中選取x86是重要的,但這還不夠。雖然指令集架構(ISA)定義了諸如寄存器、數據格式和機器指令等因素,但它并未規定語法。
只要匯編語言遵循寄存器、尋址等的所有規則,并且定義了正確的指令集,它就是一個有效的x86語言。例如,x86語言必須有乘法操作。然而,它的助記符可以是mul、MUL、multiply等。
匯編語言的語法完全由匯編器確定。沒有通用的匯編語言標準語法,也沒有特定的x86匯編語法。因此,匯編語法存在成百上千種變體。
然而,你會發現大多數x86匯編工具使用兩種主流的x86語法:AT&T語法和Intel語法。在這兩個主要分支下,有數百種特定于匯編器的變體。
雖然Intel語法和AT&T語法都是針對x86的,但它們看起來非常不同。例如,考慮一條旨在將存儲在地址ebx+4*ecx+2020的內存移到寄存器eax的語句。
這個指令在Intel語法和AT&T語法中表現得非常不同:

在Intel語法中,mov指令后面跟著的是結果將要存儲的位置。內存訪問是通過方括號來指示的,而內存地址[ebx+4*ecx+2020]的計算則是在這些括號內進行的。
AT&T語法與Intel語法在以下方面存在差異:
? 順序:參數位置被交換,因此目標位置被列在第二位。
? 寄存器:AT&T使用百分號(%)來表示寄存器,而Intel則不這么做。
? 內存訪問:AT&T使用圓括號來指示內存訪問,而Intel則使用方括號。
? 計算:在AT&T和Intel語法中,所需內存地址的計算看起來有很大的區別。
? 指令:雖然在這里沒有展示出來,但AT&T經常使用與Intel不同的且更長的指令助記符。
為了清晰和連貫,本書中的示例選擇了Intel語法。以下是選擇Intel而非AT&T的一些原因:
? Intel支持:Intel是占據主導地位的處理器開發商,他們使用的是Intel語法。
? 工具使用:大部分主要的逆向工程工具(比如IDA)都使用Intel語法。
? 可讀性:人們普遍認為,Intel語法比AT&T語法更清晰、易讀、易寫。