`
zzc1684
  • 浏览: 1224517 次
  • 性别: 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


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

分享到:
评论

相关推荐

    汇编语言编程的40个基本实践

    32. **性能分析**:使用性能分析工具来衡量和优化代码的运行速度。 33. **位移和移位操作**:掌握SHL、SHR等移位指令,实现快速乘除和位逻辑操作。 34. **自定义汇编宏**:创建自己的宏定义,简化重复代码。 35. ...

    FASM用户手册

    - **定义变量**:使用`.byte`, `.word`, `.dword`等指令来定义不同类型的变量。 - **初始化数据**:可以直接初始化变量,如`.data`段中定义变量并赋初值。 **2.3 常数和标号** - **常数定义**:可以使用`.equ`指令...

    汇编 算符优先分析法分析器的设计

    在“汇编 算符优先分析法分析器的设计”这个项目中,我们将探讨如何使用VC6.0这一经典的开发环境来实现一个基于算符优先分析法的分析器。 首先,我们需要了解算符优先分析法的基本原理。该方法依赖于一个算符优先表...

    purebasic零售版

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

    表达式求值程序设计说明书.doc

    - **Win32窗口程序**:程序应采用Win32 API构建窗口界面,以便用户交互。 - **运算支持**:除了基本的四则运算,还需要支持位运算,以及处理小括号内的优先级。 - **文本框交互**:用户可以通过文本框输入和查看...

    NASM英文手册

    例如,使用-o选项可以指定输出文件名,-f选项用于指定输出文件的格式,如elf、coff或win32等。-l选项可以生成汇编源代码的列表文件,这对于调试和维护代码很有帮助。Makefile依赖项的生成允许开发者自动化构建过程,...

    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,....... - 友好的系统,简单而...

    DELPHI关键字详解.doc

    `assembler` 关键字与 `asm` 类似,但只支持80x86汇编,而不支持Win32汇编。`assembler` 代码不支持 Delphi 的高级特性,如 `Invoke` 语句。 以上仅是Delphi关键字的一部分,实际上还有许多其他关键字,如 `const`...

    PureBasic 4.51 x86

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

    nasm-2.14rc16 64位安装包

    与其他汇编器相比,NASM具有更简洁的语法,易于理解和学习,同时也支持高级特性,如宏处理和直接生成ELF、COFF、Win32/64等目标文件格式。 **NASM的版本信息** 本安装包为"nasm-2.14rc16 64位",意味着它是NASM的...

    C#微软培训资料

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

    写给C语言初学者的话

    首先,掌握分号与大括号的使用至关重要。分号(;)在C语言中是语句的结束标志,几乎每个表达式结束后都需要一个分号。然而,不是所有结构都要求分号,例如if、switch、for、while语句以及数据类型定义和函数定义等,...

    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 ...

    如何使用RichEdit50W进行语法高亮显示的想法

    标题 "如何使用RichEdit50W进行语法高亮显示的想法" 涉及到的是在编程环境中集成富文本编辑器,特别是使用RichEdit50W控件实现代码的语法高亮显示。这是一个对于开发源代码编辑器或者IDE(集成开发环境)来说非常...

    2021-2022计算机二级等级考试试题及答案No.18090.docx

    10. 类的定义使用花括号{}包裹,例如:`class MyClass { ... }` 11. SQL中的`UPDATE`语句用于修改表中已存在的数据。 12. Web的工作模式是浏览器/服务器模式,即客户端通过浏览器向服务器发送请求并接收响应。 13...

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

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

    Delphi常用关键字用法详解

    最后,`assembler`关键字是Delphi早期版本中用于插入80x86汇编代码的,它不支持Win32汇编或`Invoke`指令,这与`asm`关键字有所不同。 这些关键字是Delphi程序员日常工作中不可或缺的部分,理解和熟练运用它们可以...

Global site tag (gtag.js) - Google Analytics