我是靠谱客的博主 无私曲奇,最近开发中收集的这篇文章主要介绍masm 16位汇编语法表达式标号宏控制宏,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

表达式

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

运算符英文意义
EQequal等于==
NEnot equal不等于!=
GTgreater than大于 >
GEgreater than or equal大于等于>=
LEless 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位汇编语法表达式标号宏控制宏所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部