随笔 - 2146  文章 - 19 评论 - 11846 阅读 - 1267万


=、EQU、TEXTEQU 功能差不多, 它们定义的符号都将在编译前辈替换成它们指定的常量值.

相比之下 EQU 更好用些.

= 举例
; Test13_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
    n = 1      ; = 伪指令只能定义整数或整数表达式
    n = n + 1  ; 可重复定义
.code
main proc
    PrintDec n ;2
    ret
main endp
end main


EQU 例一
; Test13_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
    num1 equ 2         ; equ 可以定义整数和整数表达式
    num2 equ 3         ; 它不能像 = 一样重复定义
    num3 equ num1+num2 ; (我尝试了重复定义, 竟然有时也可以, 只是偶尔)
    
    txt  equ <'Asm'>   ; 可用 equ 定义字符串, 应使用 <>
    
    szTxt db txt, 0    ; 使用 equ 定义的常量
.code
main proc
    PrintDec num3     ;5
    PrintString szTxt ;Asm
    ret
main endp
end main


EQU 例二
; Test13_3.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
includelib kernel32.lib
include    user32.inc
includelib user32.lib

; 用 equ 给函数重命名
Msg  equ MessageBox
Exit equ <ExitProcess>  ;尖括号可保证字符串的完整、并避免和关键字冲突
; 甚至代替整个表达式
ShowMsg equ <invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK>

.data
    szMsg     db 'Hello World!', 0
    szCaption db 'Hi', 0
.code
main proc
    invoke Msg, NULL, addr szMsg, addr szCaption, MB_OK
    ShowMsg
    invoke Exit, NULL
main endp
end main


用 TEXTEQU 重做上一个例子, 完全可行:
; Test13_4.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
includelib kernel32.lib
include    user32.inc
includelib user32.lib

Msg  textequ MessageBox
Exit textequ <ExitProcess>
ShowMsg textequ <invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK>

.data
    szMsg     db 'Hello World!', 0
    szCaption db 'Hi', 0
.code
main proc
    invoke Msg, NULL, addr szMsg, addr szCaption, MB_OK
    ShowMsg
    invoke Exit, NULL
main endp
end main


用 TEXTEQU 重做 EQU 的第一个例子(Test13_2.asm), 有区别:
; Test13_5.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
    num1 equ 2               ; 这里的 equ 换做 textequ 不行
    num2 textequ <3>         ; 如果用 textequ 定义整数或表达式也要放在 <> 中
    num3 textequ <num1+num2> ; 这曾是 num3 equ num1+num2
    
    txt  textequ <'Asm' ;
    txt  textequ <'Delphi'>  ; textequ 可重复定义
    
    szTxt db txt, 0
.code
main proc
    PrintDec num3     ;5
    PrintString szTxt ;Delphi
    ret
main endp
end main


posted on   万一  阅读(5740)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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-07 通过 TStringList 给系列数字倒排序 - 回复 lancerning 的问题


点击右上角即可分享
微信分享提示