读书人

学 Win32 汇编[14]: 应用中括号 []

发布时间: 2012-09-17 12:06:51 作者: rapoo

学 Win32 汇编[14]: 使用中括号 []

[地址] 是取地址指向的内容:

; Test14_1.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib?   .data?   dwVal dd 123.codemain proc?   PrintDec offset dwVal ;4206592 - 这是变量 dwVal 的地址?   PrintDec dwVal?       ;123?    - 这是变量值?   ?   lea ebx, dwVal?       ;Lea 是专门获取地址的指令, 这同 mov ebx, offset dwVal?   PrintDec ebx?   ?     ;4206592?   ?   mov eax, [ebx]?       ;现在 ebx 中放着 dwVal 变量的地址, [ebx] 则表示地址指向的值?   PrintDec eax?   ?     ;123?   retmain endpend main


地址指向的是什么数据?

; Test14_2.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib?   .data?   wVal dw 123.codemain proc?   lea ebx, wVal  ;把变量 wVal 的地址放到 ebx?       ;但现在 wVal 中放着的是 word 类型的数据, 而 [ebx] 默认是取 32 位的数据    ;这可通过伪指令 ptr 指定数据大小    ;同时需要把接收着换成 16 的(如 ax), 因为 mov 要求两个操作数的大小须一致?   xor eax, eax  ;清空 eax?   mov ax, word ptr [ebx]?   PrintDec eax  ;123?       ;也可以直接使用 movzx, 它可以从小到大(movzx r16/r32, r/8/r16/m8/m16)?   movzx eax, word ptr [ebx]?   PrintDec eax  ;123?   retmain endpend main


[] 一般用于数组:

; Test14_3.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib?   .data?   wArr dw 11,22,33.codemain proc    ;把数组 bArr 的起始地址放到 ebx, 并获取数组元素:?   lea ebx, wArr  ?   movzx eax, word ptr [ebx]?   movzx ecx, word ptr [ebx+2]?   movzx edx, word ptr [ebx+4]?   PrintDec eax  ;11?   PrintDec ecx  ;22?   PrintDec edx  ;33?       ;这样做更好些:?   lea ebx, wArr?   mov esi, type wArr ;把元素大小放在 esi?   movzx eax, word ptr [ebx]?   movzx ecx, word ptr [ebx + esi * 1]?   movzx edx, word ptr [ebx + esi * 2]?   PrintDec eax  ;11?   PrintDec ecx  ;22?   PrintDec edx  ;33?       ;这样也行:?   lea ebx, wArr?   mov esi, type wArr ;把元素大小放在 esi?   movzx eax, word ptr [ebx]?   movzx ecx, word ptr [ebx][esi * 1]?   movzx edx, word ptr [ebx][esi * 2]?   PrintDec eax  ;11?   PrintDec ecx  ;22?   PrintDec edx  ;33?       ;如果直接使用变量就更像高级语言里的数组了:?   lea ebx, wArr?   mov esi, type wArr ;把元素大小放在 esi?   movzx eax, word ptr wArr?   movzx ecx, word ptr wArr[esi * 1]?   movzx edx, word ptr wArr[esi * 2]?   PrintDec eax  ;11?   PrintDec ecx  ;22?   PrintDec edx  ;33?   retmain endpend main


当然也可以写入数组:

; Test14_4.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib?   .data?   wArr dw 11h ,22h, 33h.codemain proc?   DumpMem offset wArr, sizeof wArr ;11 00 22 00 33 00?   lea ebx, wArr  ?   mov word ptr [ebx],   44h?   mov word ptr [ebx+2], 55h?   mov word ptr [ebx+4], 66h?   DumpMem offset wArr, sizeof wArr ;44 00 55 00 66 00?       ;或者:?   mov word ptr wArr,?   77h?   mov word ptr wArr[2], 88h?   mov word ptr wArr[4], 99h?   DumpMem offset wArr, sizeof wArr ;77 00 88 00 99 00?   retmain endpend main


好像 [] 不能直接是变量或常数(变量后面跟的 [] 除外).

读书人网 >编程

热点推荐