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

1.2.2 數(shù)據(jù)傳輸指令

x86有多種數(shù)據(jù)傳輸指令,這里只簡單介紹最常用的MOV指令。MOV指令主要用來在寄存器之間及寄存器和內(nèi)存之間傳輸數(shù)據(jù),也可以用來把一個(gè)立即數(shù)寫到寄存器或內(nèi)存中。第1個(gè)操作數(shù)稱為目的操作數(shù),第2個(gè)操作數(shù)是源操作數(shù),MOV指令用于把源操作數(shù)的值復(fù)制到目的操作數(shù)中。

把ECX寄存器的值復(fù)制到EAX寄存器中,指令如下:

把數(shù)值1234復(fù)制到EDX寄存器中,指令如下:

因?yàn)樯婕皬膬?nèi)存中讀寫數(shù)據(jù),所以接下來有必要了解一下x86常用的幾種內(nèi)存尋址方式,實(shí)際上很多指令會(huì)涉及內(nèi)存尋址,不過跟數(shù)據(jù)傳輸放在一起講解更容易理解。

指令中可以直接給出內(nèi)存地址的偏移量,又稱為位移,也可以通過一項(xiàng)或多項(xiàng)數(shù)據(jù)計(jì)算得到一個(gè)地址。

(1)Displacement:位移,是一個(gè)8位、16位或32位的值。

(2)Base:基址,存放在某個(gè)通用寄存器中。

(3)Index:索引,存放在某個(gè)通用寄存器中,ESP不可用作索引。

(4)Scale:比例因子,用來與索引相乘,可以取值1、2、4、8。

經(jīng)過計(jì)算得到的地址稱為有效地址,計(jì)算公式如式(1-1)所示。

Base、Index和Displacement可以隨意組合,任何一個(gè)都可以不存在,如果不使用Index也就沒有Scale。Index和Scale主要用來尋址數(shù)組和多維數(shù)組,這里不繼續(xù)展開。下面簡單介紹基于Base和Displacement的尋址。

(1)位移(Displacement):一個(gè)單獨(dú)的位移表示距離操作數(shù)的直接偏移量。因?yàn)槲灰票痪幋a在指令中,所以一般用于編譯階段靜態(tài)分配的全局變量之類。

(2)基址(Base):將內(nèi)存地址存儲(chǔ)在某個(gè)通用寄存器中,寄存器的值可以變化,所以一般用于運(yùn)行時(shí)動(dòng)態(tài)分配的變量、數(shù)據(jù)結(jié)構(gòu)等。

(3)基址+位移(Base+Displacement):基址加位移,尤其適合尋址運(yùn)行時(shí)動(dòng)態(tài)分配的數(shù)據(jù)結(jié)構(gòu)的字段,以及函數(shù)棧幀上的變量。

如下3條匯編指令分別使用位移、基址和基址+位移這3種尋址方式,指令如下:

主站蜘蛛池模板: 常德市| 庆云县| 开原市| 桃园县| 张家界市| 潜山县| 湘潭县| 上蔡县| 乌鲁木齐县| 温州市| 温州市| 娱乐| 花莲市| 甘肃省| 阳新县| 赤城县| 临泽县| 罗山县| 商洛市| 汨罗市| 阿拉善右旗| 高清| 贞丰县| 安康市| 阳新县| 宕昌县| 泉州市| 儋州市| 安阳市| 青海省| 连南| 肥城市| 咸丰县| 崇信县| 温泉县| 嘉义县| 聂荣县| 封开县| 化德县| 永泰县| 德清县|