250 likes | 439 Views
第四章 汇编语言程序设计 4.1汇编语言的基本语法. 汇编过程. 检查源程序的语法错误,并给出出错信息。 产生 目标文件(. OBJ); 列表文件;(. LST )和交叉索引文件(. CRF 文件)。 展开宏指令。. 宏汇编语言及编程. 汇编语言: 一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言 (机器语言的符号化描述) 。 宏汇编语言: 增加 伪、宏指令 语句构成汇编 语言程序设计语言 。. 汇编: 汇编语言编写的程序不能由机器直接执行,必须经汇编程序翻译成机器语言程序。. 4.1汇编语言的基本语法. 连接程序. 机器码目标程序.
E N D
第四章 汇编语言程序设计 4.1汇编语言的基本语法 • 汇编过程 • 检查源程序的语法错误,并给出出错信息。 • 产生目标文件(.OBJ);列表文件;(.LST)和交叉索引文件(.CRF文件)。 • 展开宏指令。 • 宏汇编语言及编程 汇编语言:一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言(机器语言的符号化描述)。 宏汇编语言:增加伪、宏指令语句构成汇编语言程序设计语言。 汇编: 汇编语言编写的程序不能由机器直接执行,必须经汇编程序翻译成机器语言程序。
4.1汇编语言的基本语法 连接程序 机器码目标程序 MASM.EXE LINK.EXE 汇编程序 EXAM.ASM 汇编 EXAM.OBJ 连接 EXAM.LST 可选 ASCII 源程序 EXAM.EXE EXAM.COM EXAM.CRF 可执行程序 • 汇编过程 • 列表文件(.LST文件) • 同时列出汇编语言源程序和机器语言目标程序的文件。 • 交叉索引文件(.CRF文件) • 列出程序中使用的符号、变量和标号以及引用情况。 汇编与连接
4.1汇编语言的基本语法 • 常量、变量和标号 • 常量 汇编源程序翻译成机器码目标程序期间已经有确定数值的量。分为数字常量和符号常量两类。(指令中的立即数,MEM直接地址) • 宏汇编语句的基本格式 指令性语句——由指令构成 [标号:] 操作码操作数 [;注释] 如: START: MOV AX ,DATA 指示性语句——由命令(伪指令)构成 [名字/变量] 命令 参数 [;注释] 如: DATA SEGMENT AT 2000H
4.1汇编语言的基本语法 • 常量、变量和标号 • 常量 数字常量:直接用数字进行表示的常量。 二进制:10000100B、11110001020100B 十进制:12356D 十六进制:12ABH、0F56AH (字母打头必须前面补0,否则将出现汇编语法错误。) 如: MOV AX,100D MOV BL,0FAH MOV CL,1010 1000B
4.1汇编语言的基本语法 合法标识符: STA_124$ MOV_? @103 非法标识符: STA+124$ MOV ? • 常量、变量和标号 • 常量 符号常量:用标识符(常量名)表示的常量。 命名规则: 1)0≤31个ASCII码字符 2)A~Z、a~z、0~9 、?、@、$及下划线构成。 3)?不能单独作为标识符。 4)无独立的保留字及运算符。
4.1汇编语言的基本语法 • 常量、变量和标号 • 常量 定义 常量名 EQU(=) 数值或字母 例如: AA EQU 30 BB = 1000H CC EQU 10001010B DD = ‘ABC’ MOV AX,AA MOV AL,AA MOV BX,BB MOV BH,BB ;错BH将产生溢出 改善程序的可读性,程序的修改调试方便。 “=”可重复定义 EQU不可重复定义
4.1汇编语言的基本语法 • 常量、变量和标号 • 变量 内存单元地址的符号表示,存在地址的三个属性。 段属性:段地址,段寄存器的值 偏移地址:段内地址。 变量类型:变量所在存贮单元的类型,由存贮伪指令指定。 字节DB (8位)一个字节存贮单元 字DW (16位)二个连续字节存贮单元 双字DD (32位)四个连续字节存贮单元 双字DQ (64位)8个连续字节存贮单元 双字DT (80位)10个连续字节存贮单元
4.1汇编语言的基本语法 • 常量、变量和标号 • 变量定义 变量名存贮伪指令表达式1,表达式2,…… 例如: X DB 0AH AA EQU 1ABCH Y DW AA STR DB ‘ABCD1234’,12H,0ACH 重复子句表达式: N DUP (表达式) 例如: AA DB 10 DUP(0) BB DW 5 DUP(21*5),0DH,0AH
4.1汇编语言的基本语法 • 常量、变量和标号 • 标号 指令性语句存放地址的符号表示。 同变量一样,存在三个与地址有关的属性,常用于指令的转移和子程序调用。 • 标号定义 标号名:机器指令语句 例如: MOV SI,100H MOV DI,200H MOV CX,10H LOOP1: MOV AL,[SI] MOV [DI],AL INC SI INC DI LOOP LOOP1 ;此处LOOP1不是保留字
表达式与运算符 • 由操作数(常量、变量、标号)和运算符构成。 • 在汇编时完成相应的运算(数字常数),(OBJ)目标程序中不存在表达式,应用程序的DEBUG调试中不可能看到任何表达式。 • 算术运算符 • +、―、*、/ • MOD 除法取余运算→10 MOD 3=1 • SHL 左移运算 • 21H SHL 1 结果42H,相当于乘2的操作。 • SHR 右移运算 • 84 SHR 2 结果21H,相当于除4的操作。 • (SHL、SHR注意和相应的逻辑指令区别)
4.1汇编语言的基本语法 • 表达式与运算符 • 逻辑运算符 • AND、OR、NOT、XOR • 例如:AND AL,86H AND 0FH • AND是指令。 • AND逻辑运算符,86H AND 0FH=06H • 汇编后的指令是:AND AL,06H 与逻辑运算指令不同,CPU不执行任何操作,汇编时运算,在目标程序中只是一个常数。 • 关系运算符 • EQ、NE、LT、LE、GT、GE • 运算的结果为真用0FFFFH表示,否则为0。 • 例如: MOV BX,((PORT LE 5) AND 20H) • 当POTR小于5为MOV BX,20H否则为MOV BX,0H
4.1汇编语言的基本语法 • 表达式与运算符 • 分析运算符 • 求段基址 SEG 符号名 • MOV AX, SEG AA • SEG AA 为立即寻址是AA的段地址 • 求偏移地址OFFSET 符号名 • MOV SI,OFFSET BB • OFFSET BB 为立即寻址,是BB的偏移地址 • 求符号名的类型值TYPE 符号名 • MOV AL,TYPE CC • 返回变量CC的类型的字节数。 • 字节数据: TYPECC=1 字数据: TYPECC=2 • 双字数据: TYPECC=4 8字节数据: TYPECC=8 • 10字节数据: TYPECC=10 • 标号:NEAR=0FFFFH FAR=0FFFEH
4.1汇编语言的基本语法 • 表达式与运算符——分析运算符 • 变量的元素个数LENGTH 符号名 • DUP定义的变量的元素个数,否则=1 • 如,BUF DW N DUP(?),LENGTH BUF=N • X DD 12345678H,LENGTH X=1 • 求符号名分配的总字节数SIZE 符号名 • 返回变量的总字节数:SIZE=LENGTH*TYPE 例如: BUF1 DB N1,N2,N3,…N10 BUF2 DB 10 DUP(0) BUF3 DW 10 DUP(?) OFFSET BUF1=0000H TYPE BUF1=1 LENGTH BUF1=1 SIZE BUF1=1 OFFSET BUF2=000AH TYPE BUF2=1 LENGTH BUF2=10 SIZE BUF2=10 OFFSET BUF3=0014H TYPE BUF3=2 LENGTH BUF3=10 SIZE BUF3=20
4.1汇编语言的基本语法 • 表达式与运算符 • 属性运算符 • 定义类型算符PTR • 格式:类型PTR 表达式 • 类型BYTE WORD DWORD 例如: MOV BYTE PTR [DI],12H ;将[DI]定义为字节类型。 MOV [DI], 12H ;非法指令 INC WORD PTR [BX] ;字加1 INC BYTE PTR [BX] ;字节加1,当([BX])=1FFH时结果 ;不相同 INC [BX] ;非法指令 BUFW DW 1234H ;BUF为字类型。 MOV AH,BYTE PTR BUFW ;将BUFW指定为字节类型。 AH=34H
4.1汇编语言的基本语法 • 表达式与运算符 • 属性运算符 • 指定新属型算符 THIS • 格式:THIS 类型 • 指定下一个存贮单元的类型,与EQU(=)一起定义新变量。 • 类型BYTE WORD DWORD 例如: XYZ EQU THIS BYTE ;XYZ为字节类型的变量 ABC DW 4321H,2255H ;ABC为字类型的变量 XYZ、ABC表示同一存贮单元,这一单元有两种类型。 MOV [SI],XYZ ;将ABC的低8位21H送入[SI] MOV [DI],ABC ;将ABC字单元4321H送入[DI]单元。 为当前内存单元指定新的类型,不改变原来定义的类型。
4.1汇编语言的基本语法 • 指示性语句(伪指令) • 符号定义伪指令:EQU (=) • 格式:符号名 EQU(=) 表达式 • 例如: • COUNT EQU 20 • ABC=21H+4 • MOV AL,COUNT ;将20送AL • MOV AL,ABC ;将25H送AL EQU不能重复定义,=可任意重复定义。 如: A=3 B EQU 5 ;定义B=5 A=10 ;重定义A为10 B EQU 10 ;非法定义
4.1汇编语言的基本语法 • 段定义伪指令 • 格式:段名 SEGMENT [定位方式][组合方式][‘类别名’] … 段名 ENDS 定义了以段名命名的存贮段。汇编时给该段名分配一个段基值。 例如: DATA SEGMENT … DATA ENDS CODE SEGMENT … CODE ENDS 定义了二个段,段名分别为DATA、CODE。 • 指示性语句(伪指令)
4.1汇编语言的基本语法 • 指示性语句(伪指令) • 段定义伪指令的参数 • 格式:段名 SEGMENT [定位类型][组合方式][‘类别名’] • 定位方式:段的起始地址边界 • PAGE——指定起始地址的低8位是0,称页边界 • XXXX XXXX XXXX 0000 0000B • PARA——指定起始地址的低4位是0,称段边界(缺省) • XXXX XXXX XXXX XXXX 0000B • WORD——指定起始地址的低2位是0,称字边界 • XXXX XXXX XXXX XXXX XX00B • BYTE——指定起始地址为任意值。 • XXXX XXXX XXXX XXXX XXXXB • (PARA为缺省方式)
4.1汇编语言的基本语法 • 指示性语句(伪指令) • 段定义伪指令的参数 • 格式:段名 SEGMENT [定位类型][组合方式][‘类别名’] • 组合方式:连接程序时设定本段与其它段的连接方式。(模块化程序设计) • PUBLIC:同名段依次连接起来,形成一个连续的段。 • COMMON:同名段共用同一段起始地址,相互重叠段的长度,为最长的段的长度。 • AT 表达式:定位在表达式所指定的段地址。(代码段例外) • STACK:同名段构成一个连续的堆栈段,自动初始化SP。 • MEMORY:表示本段定位在所有段的地址之上,高地址处。 • 空缺(NONE)不与任何段相连接。各段有独立段基址。 • (缺省方式)
4.1汇编语言的基本语法 • 指示性语句(伪指令) • 段定义伪指令的参数 • 格式:段名 SEGMENT [定位类型][组合方式][‘类别名’] • 类别名:用单引号括起来的字符串。类别名相同的段按先后顺序存放在一个连续的存贮区中,形统一的物理段。(模块化程序设计) • 定位伪指令 • 格式:ORG 地址表达式 • 指定程序或数据在内存单元的起始地址。 例如: ORG 100H MOV AX,DATA ;指令偏移地址为100H。 MOV AX,BX ;其后的指令依次存放。
4.1汇编语言的基本语法 • 指示性语句(伪指令) • 段寄存器说明伪指令 • 格式:ASSUME 段寄存器:段名1,段寄存器:段名2…… • 在代码段,告诉汇编程序CS、DS、ES、SS应具有的符号段基址,但是段寄存器(CS除外)还必须用传送指令赋值。一般紧跟在SEGMENT语句之后 例如:CODE SEGMENT PARA ASSUME CS:CODE,DS:DATA MOV AX,DATA MOV DS,AX ;传送指令赋值 …… CODE ENDS DATA SEGMENT …… DATA ENDS
4.1汇编语言的基本语法 • 指示性语句(伪指令) • 过程(子程序)定义伪指令 • 格式:过程名 PROC NEAR[FAR] • ………… • 过程名 ENDP • 过程名:过程的起始地址,如子程序定义。 • 类型:NEAR 近过程(主、子同段) • FAR 远过程(主、子在两个不同的代码段) 过程应由RET指令返回与远近无关。
4.1汇编语言的基本语法 • 指示性语句(伪指令) • 模块命名伪指令(开始伪指令)NAME • 格式:NAME 模块名 • 如:NAME CODE1 • 程序结束伪指令 END • 格式:END 标号 标号为程序中第一条指令性指令标号。 • 标题命名伪指令 TITLE • 格式:TITLE 名字 • 当程序中所有程序都没有NAME时,可用TITLE命令。在LST中方式中的每一页输出该命名。 非模化程序设计中可不用NAME、TITLE命令,不影响程序汇编。
课后作业: • P188 4.1 4.3 4.4 • 4.5为错误的题