汇编--操作数寻址方式

来源:互联网 发布:网络投稿怎么赚钱 编辑:程序博客网 时间:2024/05/22 14:55

一:直接内存操作数

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



0 0
原创粉丝点击