ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

学 Win32 汇编[13]: 定义符号常量(=、EQU、TEXTEQU)

2021-04-30 12:04:08  阅读:239  来源: 互联网

标签:13 include lib equ includelib EQU Win32 main inc


学 Win32 汇编[13]: 定义符号常量(=、EQU、TEXTEQU)


=、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 2010-04-07 17:24  万一  阅读(4648)  评论(0)  编辑  收藏

标签:13,include,lib,equ,includelib,EQU,Win32,main,inc
来源: https://blog.51cto.com/u_14617575/2745505

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有