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.都不改变标志
第3章汇编语言基础
第3章汇编语言基础汇编语言是可以直接有效地控制硬件进行底层编程的有力工具。
本章介绍MASM下的源程序格式和开发方法,展开包括常量和变量的数据表达方式,并引出常用的汇编语言伪指令,为后续章节编写汇编语言程序打下基础。
3.1源程序结构像其他程序设计语言一样,MASM汇编语言对其语句格式、程序结构以及开发过程等有相应的要求,它们在本质上相同、方法上相似,具体内容各有特色。
3.1.1语句格式汇编语言源程序由语句序列构成,每条语句一般占一行,每行不超过132个字符(MA SM 6.0开始可以是512个字符)。
语句有如下相似的2种,一般都由分隔符分成的4个部分组成。
①执行性语句——用于表达处理器指令(也称为硬指令),汇编后对应一条指令代码。
由处理器指令组成的代码序列是程序设计的主体。
执行性语句的格式如下:标号: 硬指令助记符操作数, 操作数;注释②说明性语句——用于表达伪指令,指示源程序如何汇编,变量怎样定义,过程怎么设置等。
说明性语句的格式如下:名字伪指令助记符参数,参数,…;注释1. 标号与名字在执行性语句中,冒号前的标号表示处理器指令在主存中的逻辑地址,主要用于指示分支、循环等程序的目的地址,可有可无。
说明性(指示性)语句中的名字可以是变量名、逻辑段名、子程序名等,反映变量、逻辑段和子程序等的逻辑地址。
标号和名字都具有自身的各种属性。
标号采用冒号分隔硬指令,名字采用空格或制表符分隔伪指令,据此也分开了两种语句。
标号和名字是符合汇编语言语法的用户自定义的标识符。
标识符(Identifier)一般最多由31个字母、数字及规定的特殊符号(如_、$、?、@)组成,不能以数字开头(与其他高级程序语言一样)。
在一个源程序中,用户定义的每个标识符必须是唯一的,还不能是汇编程序采用的保留字。
保留字(Reserved Word)是编程语言本身需要使用的各种具有特定含义的标识符,也称为关键字。
汇编程序中主要有硬指令助记符、伪指令助记符、操作符、寄存器名以及预定义符号等。
MASM汇编语言基础
§4.3.4 数值返回运算符
数值返回运算符有5个,分别是:SEG、OFFSET、TYPE、 LENGTH和SIZE。这种运算符旳对象必须是存储器操作数,即 变量名或标号,经过运算后返回旳是一种数值。下面分别阐明各 运算符旳功能。
1.SEG
格式:SEG 变量名或标号
当运算符SEG加在一种变量名或标号前面时,汇编程序回送 旳运算成果是这个变量或标号所在旳段旳段基址;
③ 对于DD伪指令,仅可给两个字符构成旳字符串分配4个字节旳单元, 且这两个ASCII码是存储在两个低字节(存储顺序与DW伪指令相同)中, 两个高字节均存储00H。相当于定义一种双字。
(4)带DUP体现式:DUP是定义反复数据操作符,在操作数 部分旳格式为:
反复次数 DUP(反复旳内容)
DUP能够嵌套使用
图4.1 指令语句旳格式
一条指令语句有如下4个字段:
1.标号字段
这是一种可选字段。标号必须以“:”作为结束符。一种标号是 一条指令旳符号地址,它代表该指令旳第一种字节旳地址。
2.指令助记符字段
这是一条指令中不可缺乏旳主要成份。它表达这条语句要求 CPU完毕什么操作。
3.操作数字段
参加操作旳数据或地址。指令语句能够有一种操作数、两个操 作数或无操作数。
§4.4 程序旳段构造
§4.4.1 段定义伪指令 格式: 段名 SEGMENT
…… 段名 ENDS 一种完整旳汇编源程序中能够定义多种段,但同步起作用旳 最多只有4个。每一种段都是由伪指令SEGMENT开始,由ENDS 结束,SEGMENT和ENDS必须成对出现,而且在SEGMENT和 ENDS旳前面都必须有同一种段名;SEGMENT和ENDS语句之 间旳省略号部分,对于代码段来说,主要是指令,也能够有伪指 令;对于数据段、附加段和堆栈段来说,一般是存储单元旳定义、 分配等伪操作。
第4章 MASM汇编语言知识
DATA1
DB
DB DW DW DD
31
01H , ‟A‟ , ‟123‟ , ‟BCD‟
1 , 2 DUP(2 , 3) 0AB1CH , ? , 0 20 , 14H , -1 234H , ?
32 33 42 43 44 01 02 03 02 03 … …
… … …
01
2013年9月24日星期二
27
1、单字符输入(01号功能调用)
功能调用号:01H
入口参数:无
出口参数: (AL)=输入字符的ASCII码 举例:从键盘上获取一位十进制数据。
指令序列:
执行时状态: 光标等待键盘输入,输入一个字符“1”后返回;
在屏幕上可看到输入的字符;
MOV AH , 01H INT 21H
1. 设置入口参数 ① (AH)=功能调用号 ② 其他参数根据功能需要而不同,也可没有; 2. 执行指令INT 21H,调用相应的DOS模块 3. 获得输出参数 ① 根据不同的功能从不同的位置获取,也可没有。
2013年9月24日星期二 26
4.4.1 常用的DOS功能调用
单字符输入 单字符输出 字符串输出 字符串输入 程序结束返回 01号功能调用 02号功能调用 09号功能调用 0A号功能调用 4C号功能调用
end
2013年9月24日星期二
可添加子程序代码
21
存储模式说明
简化模式下,必须使用.MODEL伪指令指明存储模式;
汇编程序根据该伪指令生成相应的ASSUME语句等; 可选的存储模式
TINY:COM文件使用;
SMALL:一个数据段、一个代码段,只支持段内转移; COMPACT:多个数据段,一个代码段;
汇编学习笔记(4)-伪指令(MASM)
汇编学习笔记(4)-伪指令(MASM)前言编写汇编代码的时候会使用到两种语句,一种就是前面介绍的汇编指令又CPU提供功能支持,另一种呢叫做伪指令,伪指令是由汇编的编译器提供支持。
所以伪指令的运行结果都必须实在编译的时候就能确定的,下面介绍的就是伪指令了。
注意接下来介绍的伪指令都是基于MASM汇编编译器,比较常用的还有NASM 它的语法以后有机会介绍数值表达式数值表达式不是汇编指令,表达式的值是在汇编代码的汇编过程中就由汇编编译器计算出结果而写到二进制程序中了,并不是在程序运行的过程中才计算的(1) 常数表达式常数就是直接的数字,直接写数字默认表示10进制数,也可以用符号指定为其他进制D = 十进制 ; MOV AL, 1234DB = 二进制; MOV AL, 0101BH = 十六进制 ; MOV AL, 0FFFFH , 注意常数必须是数字开头不能是字母开头,如果16进制数第一个数字是字母的话就要补一个0在前面Q = 八进制 ; MOV AL, 123Q因为在程序中字母也是数字,所以其实也可以直接将字母或者字符串当成数字,比如MOV AL, 'a'MOV AX,"ab" ; 双引号和单引号都是可以使用的(2) 算数运算符就是简单的正(+) 负(-) 加(+) 减(-) 乘(*) 除(/) 模(mod)mov ax, 100+200mov ax, 100/2(3) 关系运算符等于(EQ) 不等(NE) 大于(GT) 小于(LT) 大于等于(GE) 小于等于(LE)如果等式成立则实际的值为0FFFF就是补码表示的-1, 如果关系不成立那么结果就是0mov ax, 123 gt 234mov ax, 1234+5 lt 1235(4) 逻辑运算与(and) 或(or) 非(not) 异或(xor) 左位移(shl) 右位移(shr)mov ax, 1 shl 3mov al, 3 and 47(5) 其他操作符HIGH LOW WIDTH MASKHIGH 表示取数据的高八位LOW 表示取数据的低八位地址表达式地址表达式所表示的是存储器操作数的地址。