官术网_书友最值得收藏!

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語法更清晰、易讀、易寫。

主站蜘蛛池模板: 策勒县| 安岳县| 桦甸市| 安国市| 枝江市| 富宁县| 奎屯市| 阿尔山市| 固始县| 玉林市| 永州市| 乐都县| 榆社县| 嘉义县| 安多县| 永平县| 仁寿县| 东兴市| 罗江县| 蒲城县| 海晏县| 承德市| 达州市| 长治县| 米泉市| 嘉定区| 八宿县| 营口市| 平凉市| 揭东县| 衡水市| 竹溪县| 达尔| 平顶山市| 英超| 阳春市| 陆河县| 巩留县| 建昌县| 堆龙德庆县| 德安县|