AT&T彙編的尋址方式


大多數指令有一個或者多個操作數,指示出執行一個操作中要使用的源數據值,以及放置結果的目的位置。x86-64支持多種操作數格式。
源數據值可以以常數形式給出,或者是從寄存器或內存中讀出。
結果可以存放在寄存器或內存中。

立即數尋址

在AT&T彙編中,立即數用來表示常數值。立即數的書寫方式是$後面跟隨一個用標準C表示法表示的整數。
不同的指令允許的立即數值範圍不同,彙編器會自動選擇最緊湊的方式進行數值編碼。

寄存器尋址

寄存器尋址主要是根據寄存器的名稱讀取寄存器的內容。
16個寄存器的低位1字節、2字節、4字節、8字節中的一個作爲操作數,這些字節數分別對應於8位、16位、32位、24位。
我們用符號rar_a來表示任意寄存器a,用R[ra]R[r_a]來表示它的值,這是將寄存器集合看成一個數組R,用寄存器標識符作爲索引。

內存尋址

內存尋址會根據計算出來的有效地址,訪問某個內存位置。
因爲將內存看成一個很大的字節數組,我們用Mb[Addr]M_b[Addr]表示對存儲在內存中從地址AddrAddr開始的b個字節值的引用。爲了簡便,我們通常省去下標b。
針對不同的尋址模式,總結如下表:

類型 格式 操作數值 名稱
立即數 $ImmImm ImmImm 立即數尋址
寄存器 rar_a R[ra]R[r_a] 寄存器尋址
存儲器 ImmImm M[Imm]M[Imm] 絕對尋址
存儲器 (ra)(r_a) M[R[ra]]M[R[r_a]] 間接尋址
存儲器 Imm(rb)Imm(r_b) M[Imm+R[rb]]M[Imm+R[r_b]] (基址+偏移量)尋址
存儲器 (rb,ri)(r_b, r_i) M[R[rb]+R[ri]]M[R[r_b] + R[r_i]] 變址尋址
存儲器 Imm(rb,ri)Imm(r_b, r_i) M[Imm+R[rb]+R[ri]]M[Imm + R[r_b] + R[r_i]] 變址尋址
存儲器 (,ri,s)(, r_i, s) M[R[ri]s]M[R[r_i] * s] 比例變址尋址
存儲器 Imm(,ri,s)Imm(, r_i, s) M[Imm+R[ri]s]M[Imm + R[r_i] * s] 比例變址尋址
存儲器 (rb,rs,i)(r_b, r_s, i) M[R[rb]+R[ri]s]M[R[r_b] + R[r_i] * s] 比例變址尋址
存儲器 Imm(rb,ri,s)Imm(r_b, r_i, s) M[Imm+R[rb]+R[ri]s]M[Imm + R[r_b] + R[r_i] * s] 比例變址尋址

對於尋址語法Imm(rb,ri,s)Imm(r_b, r_i, s),表示的是最常用的形式。
這樣的引用由4部分組成,一個立即數偏移ImmImm,一個基址寄存器rbr_b
一個變址寄存器rir_i和一個比例因子ss,這裏s必須是1、2、4或者8.
基址和變址寄存器都必須是64位寄存器。
有效地址被計算爲Imm+R[rb]+R[ri]iImm + R[r_b] + R[r_i] * i
引用數組元素時,會用到這種通用形式。
其他形式都是這種通用形式的特殊情況,只是省略了某些部分。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章