大多數指令有一個或者多個操作數,指示出執行一個操作中要使用的源數據值,以及放置結果的目的位置。x86-64支持多種操作數格式。
源數據值可以以常數形式給出,或者是從寄存器或內存中讀出。
結果可以存放在寄存器或內存中。
立即數尋址
在AT&T彙編中,立即數用來表示常數值。立即數的書寫方式是$後面跟隨一個用標準C表示法表示的整數。
不同的指令允許的立即數值範圍不同,彙編器會自動選擇最緊湊的方式進行數值編碼。
寄存器尋址
寄存器尋址主要是根據寄存器的名稱讀取寄存器的內容。
16個寄存器的低位1字節、2字節、4字節、8字節中的一個作爲操作數,這些字節數分別對應於8位、16位、32位、24位。
我們用符號ra來表示任意寄存器a,用R[ra]來表示它的值,這是將寄存器集合看成一個數組R,用寄存器標識符作爲索引。
內存尋址
內存尋址會根據計算出來的有效地址,訪問某個內存位置。
因爲將內存看成一個很大的字節數組,我們用Mb[Addr]表示對存儲在內存中從地址Addr開始的b個字節值的引用。爲了簡便,我們通常省去下標b。
針對不同的尋址模式,總結如下表:
類型 |
格式 |
操作數值 |
名稱 |
立即數 |
$Imm |
Imm |
立即數尋址 |
寄存器 |
ra |
R[ra] |
寄存器尋址 |
存儲器 |
Imm |
M[Imm] |
絕對尋址 |
存儲器 |
(ra) |
M[R[ra]] |
間接尋址 |
存儲器 |
Imm(rb) |
M[Imm+R[rb]] |
(基址+偏移量)尋址 |
存儲器 |
(rb,ri) |
M[R[rb]+R[ri]] |
變址尋址 |
存儲器 |
Imm(rb,ri) |
M[Imm+R[rb]+R[ri]] |
變址尋址 |
存儲器 |
(,ri,s) |
M[R[ri]∗s] |
比例變址尋址 |
存儲器 |
Imm(,ri,s) |
M[Imm+R[ri]∗s] |
比例變址尋址 |
存儲器 |
(rb,rs,i) |
M[R[rb]+R[ri]∗s] |
比例變址尋址 |
存儲器 |
Imm(rb,ri,s) |
M[Imm+R[rb]+R[ri]∗s] |
比例變址尋址 |
對於尋址語法Imm(rb,ri,s),表示的是最常用的形式。
這樣的引用由4部分組成,一個立即數偏移Imm,一個基址寄存器rb,
一個變址寄存器ri和一個比例因子s,這裏s必須是1、2、4或者8.
基址和變址寄存器都必須是64位寄存器。
有效地址被計算爲Imm+R[rb]+R[ri]∗i。
引用數組元素時,會用到這種通用形式。
其他形式都是這種通用形式的特殊情況,只是省略了某些部分。