概述
表达式
masm
提供了很多表达式方便我们进行编程操作
例如:
code segment
START:
mov ax,65+87
mov ax,65 and 78
mov ax,65 lt 66
mov ax, 65 mod 2
code ends
end START
上面的的操作编译器会帮我们实现进行转化为合法的汇编语法
要让编译器帮我计算出结果必须提供的表达式在编译阶段就能确定。
算数运算:
运算符 | 意义 | 例子 |
---|---|---|
+ | 加 | 65+32 |
- | 减 | 65-32 |
* | 乘 | 65*32 |
/ | 除 | 65/32 |
mod | 取模 | 65 mod 32 |
逻辑运算:
运算符 | 意义 |
---|---|
and | 位与 |
or | 位或 |
not | 位反 |
xor | 位异或 |
mov ax,5566h and 6655h
mov ax,7788h or 8877h
mov ax, not 5566h
mov ax,5566h xor 7788h
关系运算符:
关系运算符的结果,如果结果为真,则所有位都置为1,即FFFF
; 否则所有的位都置为0
,即0000
运算符 | 英文 | 意义 |
---|---|---|
EQ | equal | 等于== |
NE | not equal | 不等于!= |
GT | greater than | 大于 > |
GE | greater than or equal | 大于等于>= |
LE | less than or equal | 小于等于>= |
mov ax,56 gt 45
标号
@@
@@是一个特殊的标号
我们看下他的特殊用法
mystack segment stack
db 255 dup(0ch)
mystack ends
code segment
START:
mov ax,01h
mov ax,02h
mov ax,03h
@@:
mov ax,04h
;像前找到一个最近的标号@@ f为front ,这里跳转到mov ax,06h
jmp @f
mov ax,05h
@@:
mov ax,06h
;像后找到一个最近的标号@@ b为before 这会跳转到 mov ax,06h
jmp @b
mov ax,07h
code ends
end START
org
用于指定段偏移存放数据
我们直接看一个例子就知道
dseg segment
data db 1
;让后面的变量的定义在dseg偏移8个字节
org 8
data2 db 10 dup(066h)
;后面的 data3会紧挨着db
data3 db 1
dseg ends
$
当前地址指令$ (伪指令)
mov ax,$
dseg segment
data db 1
;让后面的变量的定义在dseg偏移8个字节
org 8
data2 db 10 dup(066h)
;后面的 data3会紧挨着db
data3 db 1
dseg ends
cseg segment
assume cs:cseg,ds:dseg,es:dseg
start:
mov ax,dseg
mov ds,ax
;获取当前指令的偏移
mov ax,$
mov ah,4ch
int 21h
cseg ends
end start
当然$
也可以用花指令.
dseg segment
data db 1
;让后面的变量的定义在dseg偏移8个字节
org 8
data2 db 10 dup(066h)
;后面的 data3会紧挨着db
data3 db 1
dseg ends
cseg segment
assume cs:cseg,ds:dseg,es:dseg
start:
mov ax,dseg
mov ds,ax
;获取当前指令的偏移
jmp $+3
;随便定义一个指令,这样会导致反编译器解析错误
db 011h
;jmp $+3实际跳转到的地址
mov ax,67
mov ah,4ch
int 21h
cseg ends
end start
结构体
结构体名 struc
;结构体成员
结构体名 ends
下面便是一个案例
;结构体定义
Student struct
m_id dw ?
m_sz db 256 dup(?)
Student ends
dseg segment
;初始化用<变量1,变量2,变量3>
g_stu Student<56h,"hello world$$">
dseg ends
cseg segment
assume cs:cseg,ds:dseg,es:dseg
myFun proc near
local @stu:Student
mov @stu.m_id,56
mov ax,@stu.m_id
;告诉编译器 bx内存是一个Student结构体
assume bx:ptr Student
;赋值偏移地址
lea bx,@stu
;利用迂回的方式给其结构体赋值
mov [bx].m_id,99
;关闭
assume bx:nothing
myFun ENDP
start:
mov ax,dseg
mov ds,ax
mov g_stu.m_id,56
mov ax,g_stu.m_id
mov ah,4ch
int 21h
cseg ends
end start
宏
equ语句
相当于一个宏定义
可以看如下示例
;开始利用宏
MAXBYTE equ 255
VERSION equ "5.621"
MOVE EQU mov
GETBX equ byte ptr [bx]
WORDBYPE equ dw
cseg segment
assume cs:cseg,ds:dseg,es:dseg
start:
MOVE ax,dseg
MOVE ds,ax
mov ah,4ch
int 21h
cseg ends
end start
=
用于定义一些常量
cseg segment
assume cs:cseg,ds:dseg,es:dseg
start:
mov ax,dseg
mov ds,ax
;常量定义
@val1 = 2
mov ax,@val1
mov ah,4ch
int 21h
cseg ends
end start
macro 语句
宏名 macro [参数1][,参数2]...
宏体
endm
对应的一个案例,用于退出函数
ExitProcess MACRO
mov ax,4c00h
int 21
ENDM
InokeInt Macro arg1,arg2
mov ax,arg1
int arg2
ENDM
dseg segment
dseg ends
cseg segment
assume cs:cseg,ds:dseg,es:dseg
start:
mov ax,dseg
mov ds,ax
@val1 = 2
mov ax,@val1
InokeInt 4c00h,21
ExitProcess
cseg ends
end start
一个更复杂的案例
ExitProcess MACRO
mov ax,4c00h
int 21
ENDM
InokeInt Macro reg,der
mov cl,4
ro&der reg,cl
ENDM
dseg segment
dseg ends
cseg segment
assume cs:cseg,ds:dseg,es:dseg
start:
mov ax,dseg
mov ds,ax
;右移动4位
InokeInt ax,r
;左移动4位
InokeInt ax,l
ExitProcess
cseg ends
end start
控制宏
示例 if
.if ax > 0
mov ax,0
.elseif ax==0
mov ax,1
.else
mov ax,2
.endif
循环while
.while condition
;内部逻辑
.ENDW
示例
.while ax==0
;内部逻辑
.ENDW
循环REPEAT
.repeat
;内部逻辑
.until condition
示例
.repeat
;内部逻辑
mov ax,0
.until ax==0
最后
以上就是无私曲奇为你收集整理的masm 16位汇编语法表达式标号宏控制宏的全部内容,希望文章能够帮你解决masm 16位汇编语法表达式标号宏控制宏所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复