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

看雪資料發表於2003-06-04

文者:FTBirthday
內容:舉例說明在組合語言中,"[]"的用法
"[]"的用法在"常見問題"已經有所說明,引用如下:

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]都表示同一個地址.


    相關文章