[地址] 是取地址指向的内容:
; 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
好像 [] 不能直接是变量或常数(变量后面跟的 [] 除外).
分类:
Delphi 与汇编入门
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2008-04-08 Windows 编程[1] - 窗体生成的过程一