舉例說明在組合語言中,"[]"的用法

來源:互聯網
上載者:User
"[]"的用法在"常見問題"已經有所說明,引用如下:

1、push dword ptr [024c1100] 壓棧024c1100值的雙字
2、cmp eax,[ebp+14] eax-ebp+14的有效值,不保留值,主要看標誌位
3、cmp byte ptr [eax],46 位元組型eax-46,看標誌位
4、lea eax,[edx-02] 把edx-02的有效值(一個地址值)給eax
5、mov ecx,[edx+08] edx+8值作為地址,此地址所指向的值給ecx

我再補充幾例我遇到的情況,參考了一些資料,以及我個人的理解.
-------------------------------------------------------------------------------
mov指令中用到"[]"

1--mov [edi], eax ----把eax的值(dword)賦給位於記憶體位址edi處的值
2--mov [bp-02], dx ---把dx的值(word)賦給位於記憶體位址bp-02處的值
3--mov esi,[BP+14] ---把位於記憶體位址BP+14的dword大小的值移入esi寄存器
4--mov eax, dword ptr [ebp-04]---把位於記憶體位址ebp-04的dword大小的值移入eax寄存器
5--mov eax, dword ptr[0000003Ah]--把位於記憶體位址3A的dword大小的值放入eax寄存器
6--mov cl, byte ptr [34h]--把位於記憶體位址34的byte大小的值放入cl寄存器
7--mov dx, word ptr [3Eh]--把位於記憶體位址3E的word大小的值放入dx寄存器
8--mov eax,[00403045h] --從記憶體位址403045讀取一個32位的值
9--mov al, byte ptr [eax+ecx]--把位於記憶體位址eax+ecx的byte大小的值放入al寄存器

綜括弧"[]"用來從括弧間的記憶體位址處取值,沒有括弧就只是這個值,寄存器和記憶體位址也可以.

10--mov cx,[eax]--把位於記憶體位址eax的word大小的值移入cx寄存器
在mov cx, [eax]中,處理器會先查看eax裝有什麼值(=記憶體位址),然後在那個記憶體位址中有什麼值,並把這個word(16位,因為目標-cx-是個16位寄存器)移入cx。
-------------------------------------------------------------------------------
cmp指令中用到"[]"

1--cmp dword ptr [ebp-04], 00000007--把位於記憶體位址ebp-04的dword大小的值與00000007比較
2--cmp byte ptr [si], 00 --把位於記憶體位址si的byte大小的值與00比較

-------------------------------------------------------------------------------
lea指令中用到"[]"

1--lea di, [bp-22] ----把bp-22的有效值(=記憶體位址)給di
-------------------------------------------------------------------------------
test指令中用到"[]"

1--test byte ptr [bx+08FD]
--將位於記憶體位址bx+08FD處的byte大小的值邏輯與,判斷運算結果是否為00

理解上難免有偏差,請指正!

標 題:其實"[]"相當於指標,裡面的內容是地址而不是數值,即使裡面放的是寄存器也一樣。  
發信人:qqj1228
詳細資料:

基本上有以下幾種情況:
1、"[]"內放立即數
mov eax,dword ptr [00403000h]
即把記憶體位址為403000的雙字資料放入eax,為直接定址。
2、"[]"內放寄存器
mov eax,dword ptr [ebx]
即把ebx中的地址所指的內容放入eax中,為寄存器間接定址。
mov eax,dword ptr [eax+edi]
即把eax中的數值加上edi中的數值所的結果作為記憶體位址,其指向的內容放入eax中,等價於mov eax,dword ptr [eax][edi],也為寄存器間接定址。
3、"[]"內放寄存器加立即數
mov eax,dword ptr [ebx+0ch]
即把ebx加0ch的結果作為記憶體位址,其指向的內容放入eax中,為寄存器相對定址。
同樣可等價於mov eax,dword ptr 0ch[ebx]。
4、"[]"內放寄存器乘以立即數
mov eax,dword ptr [edi*4]
即把edi內的地址乘四所得的新地址指向的內容放入eax中,為寄存器比例定址。
以上是我的理解,如有錯誤之處還望高手批評指正。  

標 題:to FTB: 
發信人:lianzi2000
詳細資料:

to FTB:
你說的不太準確, 在[]內的東東不管是立即數還是寄存器還是運算式, 都相當於進階語言中的變數, 也就是一個地址. 真正的運算元是該地址上存放的內容. 例如:
cmp byte ptr [eax],46

並不是拿eax中的值和46比較, 而是用由DS:[eax]指明的記憶體位址上存放的一個位元組和46比較. 同樣,push dword ptr [024c1100] 是把在記憶體位址 024c1100 處存放的雙字壓入堆棧,而不是把數字024c1100本身壓入堆棧.

雖說[]內是地址,但說它是指標也不是很對. 進階語言中所謂指標是指該變數存放的內容是一個地址. 例如: 我們在記憶體位址00478030處存放一個字元'c',假設在C中的說明是:

char my_char='c';

於是變數my_char就對應於地址00478030, [00478030]是一個字元型變數,
mov al, [00478030]
就是把字元'c'存入AL中.

若又有說明

char *p_char;

這時, 變數p_char也對應另一個地址,假設為00478158. [00478158]才是一個指標變數. 沒有賦值以前其存放內容是不確定的.若有:

p_char=&my_char;

這時, 在記憶體00478158存放的內容是00478030, 而在00478030處存放的才是字元'c'. 指標和變數名的關係就是如此.

詳細請參考我寫的彙編心得

一個比較特別的指令是lea, 意思是"裝入有效地址"(Load Effective Address), 它的運算元就是地址,所以
lea eax,[edx-02]
就是把 edx 中的值減去2再送入eax, 而不是把由[edx-02]指明的記憶體位址上的值放到eax. 其結果是[eax]和[ebx-02]都表示同一個地址.

 


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.