彙編--運算元定址方式
一:直接記憶體運算元
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