MASM汇编语言基础
第4章 MASM汇编语言知识

4.1
MASM汇编语言格式
• 4.1.1 指令语句格式
• 4.1.2 伪指令语句格式
返回本章首页
汇编语言有两种基本语句,它们是指令语句 和指示语句(又称伪指令语句)。 • 指令语句又称可执行语句,它要求 CPU 执 行某种操作。在第 3 章中介绍的各种指令 都是指令语句,指令语句经汇编后产生机器 目标代码。 • 指示语句又称伪指令,它不要求 CPU 执行 某种操作,汇编时也不产生对应的机器代码, 而仅仅给汇编程序提供汇编信息,如源程序 起止信息、段内存的安排等。
MOV AX,DATA
MOV DS,AX
4. 子程序定义伪指令
格式:过程名 PROC (NEAR/FAR) ┊ RET 过程名 ENDP 其中,过程名不可默认,过程的开始(PROC) 和结束(ENDP)应使用同一个过程名。过程名也是调 用指令 (CALL) 的目标操作数。 过程内部至少设置一条返回指令 RET 作为过程 的出口,它可以在过程的任何位置。
4.2.3 标号
• 标号是一条指令语句的符号地址。在汇编源程序中, 只有在需要转向一条指令语句时,才为该指令语句设 置标号,以便在转移类指令(含子程序调用指令)中 直接引用这个标号。因此,标号可作为转移类指令的 操作数,即转移地址。 • 【例4.3】符号地址表示。 • NEXT:MOV AL, [SI] ;带标号NEXT的指令 • ┆ • DEC CX • JNE NEXT ;标号NEXT作转移指令的操 作数
4.2 汇编语句表达式
• 4.2.1 常量 • 4.2.2 变量 • 4.2.3 标号
返回本章首页
4.2.1 常量• 1.数值量• 2. 字符串常量
1.数值常量
表4.1 各种形式数字常量格式对照表
第4章 MASM汇编语言

DW DW DW
100,200 300,400 PAR1,PAR2
VAR
DB DB
100 DUP (?) 2 DUP (0,2 DUP(1,2),3)
OPER1 OPER2
DB ?, ? DW ?, ? …… MOV OPER1, 0 MOV OPER2, 0
;字节指令 ;字指令
OPER1 OPER2
C.存储器操作数
以存储器单元作为操作数,所学的所有与存储 器有关的寻址都实有,引进符号地址(标号和变 量),标号和变量有三种属性: 段 属 性:段基址,标号在CS,变量DS或ES
偏移属性:与段基址的距离的偏移量值
类型属性:标号类型属性指段内还是段间
操作,即FAR(-2)和NEAR(-1),
变量类型属性是指变量的字节数, BYTE (1)、WORD(2)和DWORD(4)
说明: A.segment 和ends 共同定义一个逻辑段,必须成 对使用,每段有一段名。 B.段的大小不能超过64K。 C.段定义语句仅仅是将程序划分成段,它并不指明 定义的是什么段。 D.定位类型 表示段的起始位置,类型是起始地址 能被什么值整除,有如下类型: PAGE (256), PARA (16,隐含), WORD (2), BYTE (1)
[标 号:] 助记符 操作数1,操作数2 [;注释] [符号名] 定义符 参数1,…,参数n [;注释]
(4)操作数与参数
操作数:在指令中表示指令操作的对象,根据不同指 令,在指令中有0个、1个和2个操作数。 参数:是在伪指令或宏指令语句中使用,给出伪指令 语句或宏指令语句的参数,参数可以多个或没有。
功能:定义本模块中所引用的外部模块中的符 号名。
例:
NAME HU PUBLIC XX,GHH D1 SEGMENT XX DB 23 D1 ENDS C1 SEGMENT ASSUME CS:C1,DS:D1 STT: MOV AX,D1 MOV DS,AX GHH:…… C1 ENDS END STT
MASM汇编语言基础

2007 copyright / 9 2007年3月25日
四川理工学院 计算机科学系《微机原理》
§4.2.1 常量(续)
1.十进制常量:0~9数字序列,可以用字母D结尾,也可没 有结尾字母; 2.二进制常量:以字母B结尾的0和1组成的数字序列; 3.八进制常量:以字母O或Q结尾的0~7数字序列; 4.十六进制常量:以字母H结尾的0~9和A~F(或a~f)的 数字字母序列。 5.字符串常量:用单引号或双引号括起来的一个或多个字符, 这些字符用它的ASCII码值存储在内存中。
2007 copyright / 7 2007年3月25日
四川理工学院 计算机科学系《微机原理》
§4.1.2 伪指令语句(续)
2.伪指令字段 这是伪指令语句中不可省略的主要成分。它们是
伪指令语句要求汇编程序完成的具体操作命令。
3.操作数字段 本字段是否需要,需要几个,需要什么样的操作
数等都由伪指令字段中伪指令来确定。
2007 copyright / 11 2007年3月25日
四川理工学院 计算机科学系《微机原理》
§4.2.2 变量(续)
常用的有以下几种:
DB伪指令用来定义字节,其后的每个操作数都 占有一个字节;
DW伪指令用来定义字,其后的每个操作数都 占有一个字(低位字节存放在低地址,高位字 节存放在高地址);
2007 copyright / 5 2007年3月25日
四川理工学院 计算机科学系《微机原理》
§4.1 汇编语言语句种类及其格式(续)
§4.1.2 伪指令语句
与指令语句不同的是,伪指令本身不产生与之对应 的目标代码。它是在汇编程序对汇编语言源程序汇编 期间,由汇编程序处理的操作,它们可以完成如数据 定义、分配存储区、指示程序结束等功能。
汇编学习笔记(13)-宏指令(MASM)

汇编学习笔记(13)-宏指令(MASM)结构说明: 是⼀堆数据的定义的集合基本格式: 结构名称 STRUC 字段的定义 结构名称 ENDS 举例: STUDENT STRUC ID DW ? SCORE DB 1 NAME DB 'STUDENTNAME' STUDENT ENDS定义变量: 变量名结构类型 < 参数表 > 举例: S1 STDUENT <1,50,'zhao'> S2 STDUENT <1,60,'zhang'> S3 STDUENT <1,70,'wang'>结构使⽤: 1. MOV AX, P1.ID 2. MOV BX, OFFSET P1 MOV AL, [BX].SCORE总结: 使⽤起来还是和C/C++ 的结构⽐较类似的,实际上 P1.ID 和 [BX].SCORE 的两种引⽤⽅式本质上是汇编器帮我们转换了地址。
记录说明: 结构是将将⼀堆定义结合起来,⽅便管理,那么记录就是讲⼀个字或者⼀个字节拆分成各种按照位的定义 实际上记录就是⼀个字或者字节的按位定义,所以长度最长不超过16位,右对齐。
基本格式: 记录名称 RECORD 字段1:位宽=初始值,字段2:位宽=初始值,…. 举例: ABCD RECORD AA:5=12, BB:3=6, CC:4=3 内存结构: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 aa aa aa aa aa bb bb bb cc cc cc cc定义变量: 变量名结构类型 < 参数表 > 举例: S2 ABCD <1,2,3> S1 ABCD <1,2,3> S3 ABCD <3,2,1>记录使⽤: WIDTH 返回⼀个记录整体的位宽或者⼀个字段的位宽 MOV AX, WIDTH ABCD MOV AX, WIDTH AA MASK 返回对应字段的掩码 MOV BX, MASK AA; BX = 0001111100000000B总结: 和结构的功能有点类似,相当于在字节尺度尺度上的结构定义,相当于定义标志位,⽽MASK 就是提取标志位的掩码。
MASM

1.1 实验目的掌握汇编软件MASM的使用,熟悉汇编语言的上机过程。
1.2相关基础知识1.2.1汇编语言程序上机步骤1.汇编语言程序设计上机步骤汇编语言源程序的上机步骤包括编辑、汇编、链接、调试等几个过程,如图1-1所示。
图1.1 汇编语言源程序上机步骤2.汇编汇编是把用汇编语言编写的源代码程序翻译成计算机能够识别的二进制机器语言程序。
目前常用的汇编程序是MASM,称为宏汇编程序。
宏汇编程序当前主要有两个版本:MASM5.0和MASM6.0。
其中,MASM5.0的可执行文件是MASM.EXE,MASM5.0用于DOS环境下。
初学者首先学习使用MASM5.0。
而MASM6.0的可执行文件是ML.EXE。
汇编过程是将源程序翻译为等价的二进制机器语言的过程。
所产生的文件称为目标程序,其后缀为.OBJ。
在这个阶段中,将对源程序的语法进行检验,如果发现错误将给予提示。
错误提示分为严重错误和警告错误两种。
严重错误指示某些指令存在语法错误,不能形成对应的二进制机器指令。
而警告错误指示某些指令含义不够明确,需要提醒程序员注意。
程序员可以根据提示对源程序进行修改,直到得到正确的结果为止。
在汇编过程中还会产生列表文件和交叉引用文件。
列表文件的后缀为.LST,主要用于给出源程序和机器代码程序的清单,以供检查程序使用。
交叉引用文件的后缀为.CRF,它是一个为源程序所引用的各种符号进行前后对照的文件,主要用于给出不同程序段中互相引用的全部符号列表。
这两个文件是可有可无的,如果不需要生成这两个文件,可以在汇编过程中加以控制。
3.链接在汇编过程中形成了目标文件(.OBJ),但是在该文件中,只是将源程序的操作码部分变成了机器码,而地址操作数还是可浮动的相对地址,不是实际地址,浮动地址需要再定位。
只有经过链接过程才能形成最后的可执行文件。
链接程序的功能就是把一个或多个目标文件合并成一个可执行文件,其后缀为.EXE。
其实在链接过程中一共形成两个文件:第一个是可执行文件(.EXE)。
第4章 MASM汇编语言知识

2020年8月14日星期五
12
等号伪指令
➢ 格式 ✓ <标识符> = <表达式>
➢ 功能 ✓ 定义标识符,来代替表达式的值;
➢ 与EQU语句的区别: ✓ 只能定义数值; ✓ 在同一程序中可对一个符号名重复定义;
4.3.5 定位伪指令ORG
➢ 格式: ORG <数值表达式> ➢ 功能:
100H 23
➢ 可以只分配存储空间,而不赋具体的数值; ✓ 使用通配符“?”
➢ 可以定义一段连续的存储空间; ✓ 使用DUP子句
变量定义伪指令举例1——常数和表达式
例1. 变量定义伪指令的操作数是数值时,均
……
以二进制补码形式在内存中保存。
A1 0A 10
A2 64 100
➢ 设常量定义为: NUM EQU 100
配连续的存储空间。
DATA1
DATA1 DB 100 DUP(0)
00 00 … 00
DATA2 DB 3 DUP (3 DUP (2) , 7)
100个
02 02 02 07 02 02 02 07 02 02 02 07 DATA2
变量定义伪指令练习
请写出下列变量定义伪指令的内存分配情况。 DATA1 DB 01H , ’A’ , ’123’ , ’BCD’ DB 1 , 2 DUP(2 , 3) DATA2 DW 0AB1CH , ? , 0 DW 20 , 14H , -1 DATA3 DD 234H , ?
DATA1
… 01 41 31 32 33 42 43 44 01 02 03 02 03 …
DATA2
… 1C AB -- -- 00 00 14 00 14 00 FF FF …
第4章 MASM汇编语言基础

4.3 表达式与运算符
表达式:
• 常用作指令语句或伪指令语句的操作数 • 由常数、变量、标号等通过运算符连接而成 • 经计算后可得到一个数值或地址
运算符:
• 算术运算符 • 逻辑运算符 • 关系运算符 • 数值返回运算符 • 属性与分离字节运算符
4.3.1 算术运算符
算术运算符有共8个: +(加)、-(减)、*(乘)、/(整除)、 MOD(求余)、SHL(左移)、SHR(右移)、[ ](下标运算)。
: 10H 20H 00H FFH 00H 00H : 00H 02H 00H 04H 00H 00H 10H :
1000H
DS
0004H
0002H VARW的偏移量 ARRAY的偏移量 ARRAY段基值
例:(DS)=108BH,(CS)=108EH DATA SEGMENT BUF1 DB -5,20H,10,’AB’ BUF2 DW -20,1234H,$+5,’CD’,BUF2 BUF3 DD -10,5678ABCDH, $+7 ,’EF’ DD BUF2 DATA ENDS
$地址计数器的值 (IP),$值是不 断变化。
0019H 001AH 001BH 001CH 001DH 001EH 001FH 0020H 0021H 0022H
8B 10 46 45 00 00 05 00 8B 10
DS
DS
4.2.3 标号(Label)
1.定义
标号是一条指令目标代码的符号地址,它常作为转移指令或调 用指令的操作数。 例: ABC:INC SI ; 带标号ABC的指令 JNZ ABC ; 条件转移指令中,标号ABC作操作数
12H
[;注释]
; 给变量VAR1分配一 字节单元,初值12H
第5章汇编语言基础

几点注意 1.MOV可传送8位和16位数据,具体决定于指令中涉及的寄存器,也决定立即 1.MOV可传送8位和16位数据,具体决定于指令中涉及的寄存器,也决定立即 数的形式 2.即含源操作数,又含目的操作数,两者之中至少有一个是用寄存器指出的 2.即含源操作数,又含目的操作数,两者之中至少有一个是用寄存器指出的 3.不能在两个内存之间直接传送数据,如果要把地址为AREA1的存储单元的内 3.不能在两个内存之间直接传送数据,如果要把地址为AREA1的存储单元的内 容传送至同一段内的地址为AREA2的存储单元去,MOV指令不能直接完成 容传送至同一段内的地址为AREA2的存储单元去,MOV指令不能直接完成 如:MOV AREA2,AREA1;错误 如:MOV AREA2,AREA1;错误 MOV AL,AREA1 AL, MOV AREA2,AL AREA2, 4.寄存器既可做源操作数,又可做目的操作数,但CS和IP这两个寄存器不能作 4.寄存器既可做源操作数,又可做目的操作数,但CS和IP这两个寄存器不能作 为目的操作数,换句话说,这两个寄存器的值不能随意修改 5.用BX、SI、DI来间接寻址时,默认的段寄存器为DS,而用BP来间接寻址时, 5.用BX、SI、DI来间接寻址时,默认的段寄存器为DS,而用BP来间接寻址时, 默认的段寄存器为SS 默认的段寄存器为SS 6.两个段寄存器之间不能直接传送信息,也不允许用立即寻址的方式为段寄存器 6.两个段寄存器之间不能直接传送信息,也不允许用立即寻址的方式为段寄存器 赋初值。如 MOV DS,2100H;错误 MOV ES,DS;错误 DS,2100H;错误 ES,DS;错误 MOV AX,2100H AX, MOV DS,AX DS, 6.修改SS和SP的指令之间不要插入其他指令 6.修改SS和SP的指令之间不要插入其他指令 7.都不改变标志 7.都不改变标志