- 深度探索Go語言:對(duì)象模型與runtime的原理特性及應(yīng)用
- 封幼林編著
- 700字
- 2023-08-10 16:55:34
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種尋址方式,指令如下:

- Practical Data Analysis Cookbook
- Functional Python Programming
- Reporting with Visual Studio and Crystal Reports
- ASP.NET MVC4框架揭秘
- C語言程序設(shè)計(jì)(第3版)
- What's New in TensorFlow 2.0
- C/C++算法從菜鳥到達(dá)人
- JMeter 性能測試實(shí)戰(zhàn)(第2版)
- 算法訓(xùn)練營:提高篇(全彩版)
- 利用Python進(jìn)行數(shù)據(jù)分析(原書第3版)
- Julia高性能科學(xué)計(jì)算(第2版)
- SQL Server 2008 R2數(shù)據(jù)庫技術(shù)及應(yīng)用(第3版)
- C++ Fundamentals
- Mastering AWS Security
- Python語言科研繪圖與學(xué)術(shù)圖表繪制從入門到精通