1. 程式人生 > >彙編--運算元定址方式

彙編--運算元定址方式

一:直接記憶體運算元

num DWORD 200h

mov eax, num

mov ebx,[num] ;==mov ebx, num 因為num資料標號本身就代表著地址

二:直接偏移運算元

arrayB  BYTE 10h,20h,30h,40h,50h

mov al, [arrayB + 2]

mov bl, arrayB + 2

arrayW WORD 100h,200h,300h

mov ax, [arrayW+2]  ;ax=200h

在PE檔案中,直接是arrayW+2相加之後的地址

三:間接運算元

al1 BYTE 10h

mov eax, 0
 mov esi, OFFSET val1
mov al, [esi]  ;源運算元
mov bl, 4
 mov [esi], bl ;目的運算元

inc BYTE PTR [esi]

訪問陣列

.data
arrayB BYTE 10h,20h,30h

.code
main PROC
    mov esi, OFFSET arrayB
    mov al,[esi]
    inc esi
    add al,[esi]
    inc esi
    add al,[esi]
    call DumpRegs
    INVOKE ExitProcess, 0
main ENDP
END main

四:變址運算元

變址運算元把常量和暫存器相加得到一個有效地址

constant[reg]  ;與C中 array[index]類似,

[constant+reg]

 constant是變數的名字 mov esi,0 mov al,[arrarA + esi] inc esi

mov esi, OFFSET arrarA mov ax,[esi] mov ax,[esi+2]

比例因子

mov eax, array[esi*TYPE array] == mov  eax, [array+esi*TYPE array]

五:基址變址運算元

把兩個暫存器的值相加,得到一個偏移地址,兩個暫存器分別稱為基址和變址

[base + index] base,index可以是任意的32位通用暫存器

mov eax, [ebx+edx]

將變址地址*比例因子

mov eax, [ebx+edx*TYPE op]

六:相對基址變址運算元

將偏移,基址暫存器,變址暫存器,以及可選的比例因子組合起來

[base + index +displacement]

displacement[base + index]

displacement可以是變數的名字或者是常量表達式。

base index可以是任意的32位通用暫存器

mov ebx, Rowsize
mov esi, 2
mov eax, tableB[ebx + esi*TYPE tableB]

基址變址運算元

.data
array WORD 10h, 20h, 90h
rowsize = $-array
      WORD 30h, 40h, 23h
      WORD 50h, 60h, 45h

.code
main PROC
    mov eax, OFFSET array
    mov ebx, rowsize
    add ebx, TYPE WORD
    mov cx, WORD ptr[eax+ebx]
    call DumpRegs
    push 0
    call ExitProcess
main ENDP
END main

帶比例因子的基址變址運算元

.data
array WORD 10h, 20h, 90h
rowsize = $-array
      WORD 30h, 40h, 23h
      WORD 50h, 60h, 45h

.code
main PROC
    mov eax, OFFSET array
    add eax, rowsize
    mov ebx, 2
    mov cx, WORD ptr[eax+ebx*TYPE WORD]
    call DumpRegs
    push 0
    call ExitProcess
main ENDP
END main

帶比例因子的相對基址變址運算元

.data
array WORD 10h, 20h, 90h
rowsize = $-array
      WORD 30h, 40h, 23h
      WORD 50h, 60h, 45h

.code
main PROC
    mov eax, rowsize
    mov ebx, 1
    ;mov cx, WORD ptr[array+eax+ebx*TYPE WORD]
    mov cx, WORD ptr array[eax+ebx*TYPE WORD]
    call DumpRegs
    push 0
    call ExitProcess
main ENDP
END main

相對基址變址運算元

.data
array WORD 10h, 20h, 90h
rowsize = $-array
      WORD 30h, 40h, 23h
      WORD 50h, 60h, 45h

.code
main PROC
    mov eax, rowsize
    mov ebx, 1*TYPE WORD
    mov cx, WORD ptr[array+eax+ebx]
    ;mov cx, WORD ptr array[eax+ebx]
    call DumpRegs
    push 0
    call ExitProcess
main ENDP
END main