`
zzc1684
  • 浏览: 1190190 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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


; Test14_1.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
    
.data
    dwVal dd 123
.code
main 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
    ret
main endp
end main


地址指向的是什么数据?


; Test14_2.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
    
.data
    wVal dw 123
.code
main 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
    ret
main endp
end main


[] 一般用于数组:


; Test14_3.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
    
.data
    wArr dw 11,22,33
.code
main 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

    ret
main endp
end main


当然也可以写入数组:


; Test14_4.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
    
.data
    wArr dw 11h ,22h, 33h
.code
main 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
    ret
main endp
end main


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

分享到:
评论

相关推荐

    purebasic零售版

    PureBasic 是一个新的基于...- 象BASIC关键字一样完全支持Win32 API - 汇编程序内嵌 - 为快速编译使用固定文件预编译结构 - 结构化 CLI编译器 - 高效率,包括大量关键词,联机帮助 - 友好的系统,简单而好用,安装方便

    BASIC编辑器

    - 象BASIC关键字一样完全支持Win32 API - 汇编程序内嵌 - 为快速编译使用固定文件预编译结构 - 结构化 CLI编译器 - 高效率,包括大量关键词,联机帮助 - 友好的系统,简单而好用,安装方便 - 600条以上的内部命令 - ...

    PureBasic V4.3

    - 象BASIC关键字一样完全支持Win32 API - 汇编程序内嵌 - 为快速编译使用固定文件预编译结构 - 结构化 CLI编译器 - 高效率,包括大量关键词,联机帮助 - 支持XML,正则表达式,ftp ,http,....... - 友好的系统,简单而...

    PureBasic 4.3 Linux 版

    - 象BASIC关键字一样完全支持Win32 API - 汇编程序内嵌 - 为快速编译使用固定文件预编译结构 - 结构化 CLI编译器 - 高效率,包括大量关键词,联机帮助 - 支持XML,正则表达式,ftp ,http,....... - 友好的系统,简单而...

    PureBasic 4.51 x86

    - 象BASIC关键字一样完全支持Win32 API - 汇编程序内嵌 - 为快速编译使用固定文件预编译结构 - 结构化 CLI编译器 - 高效率,包括大量关键词,联机帮助 - 支持XML,正则表达式,ftp ,http,....... - 友好的系统,简单而...

    Delphi5开发人员指南

    4.5 定义公共体系结构:使用对象库 93 4.5.1 考虑应用程序的体系结构 93 4.5.2 Delphi固有的体系结构 94 4.5.3 体系结构的例子 94 4.5.4 子窗体TChildForm 94 4.5.5 数据库基础模式窗体TDBMode- Form 96 4.5.6 ...

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

    Windows 记事本替代工具 Notepad3 5.21.227.1 + x64.zip

    Windows 操作系统在过去几年中得到了显着更新。 但是,默认的 Windows 记事本在 20 年内未更新。 如果你需要一个简单的编程任务的文本编辑器,请考虑使用 Notepad3 中文版吧!我们使用默认 Windows 记事本当前缺少的...

    Notepad2_v4.1.24简体中文版(Windows7)

    6 对括号{}〔〕()可以高亮配对显示,方便查看(仅对英文符号有效) 7 可以自定义代码页和字符集,对中文支持良好 8 使用标准的正则表达式搜索和替换 9 可以使用半透明模式,cool 10 快速放大、缩小页面,不用...

    Notepad2 V4.2.25

    6 对括号{}〔〕()可以高亮配对显示,方便查看(仅对英文符号有效) 7 可以自定义代码页和字符集,对中文支持良好 8 使用标准的正则表达式搜索和替换 9 可以使用半透明模式,cool 10 快速放大、缩小页面,不用...

Global site tag (gtag.js) - Google Analytics