null第5章 汇编语言与程序
第5章 汇编语言与程序设计主要内容主要内容 汇编语言、汇编程序的基本概念
汇编语言程序设计过程
汇编语言源程序的结构框架
常用伪指令
简单程序设计 5.1 汇编语言基础5.1 汇编语言基础 程序设计语言包括:面向机器的语言机器语言 汇编语言 高级语言 汇编语言: 用助记符表示指令
汇编语言源程序:用汇编语言编写的程序
汇编程序: 编译汇编语言源程序的程序5.1.1 设计汇编语言程序的步骤5.1.1 设计汇编语言程序的步骤1.编写源程序(文件名.ASM)2.编译成目标文件(文件名.OBJ)3.生成可执行文件 (文件名.EXE)4.调试、运行程序用编辑软件(如EDIT.EXE等)用汇编程序(如TASM.EXE等)用链接程序(如TLINK.EXE等)用调试程序(如TD.EXE等)
也可直接运行可执行文件 有集成软件,通过菜单调用相应程序5.1.2 汇编语言源程序结构5.1.2 汇编语言源程序结构段名1 SEGMENT ;定义段1
┇ ;一系列语句
段名1 ENDS ;段1结束
┇
段名n SEGMENT ;定义段n
┇
段名n ENDS ;段n结束
END ;整个程序结束由若干段组成5.1.2 汇编语言源程序结构5.1.2 汇编语言源程序结构DATA SEGMENT ;定义数据段
MEM1 DB 11H, 22H
┇
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
┇
CODE ENDS
END START ;程序结束由数据段、代码段组成5.1.3 汇编语言语句
5.1.3 汇编语言语句格式 指令性语句 :CPU执行的指令
指示性语句 :CPU不执行的指令,编译时执行下面分别介绍指令性语句指令性语句由CPU执行的指令,编译后生成目标代码,放在目标文件中
要求的操作在执行程序时完成
例 MIUS: ADD AX, BX ;加法指令
INC BX ;BX加10
语句格式:
[标号:] [前缀] 助记符 [操作数], [操作数] [ ;注释] 指令的符号地址操作码注释前加分号编译 汇编源程序(文件名.ASM)目标文件(文件名.OBJ)
指示性语句(伪指令)指示性语句(伪指令)是CPU不执行的指令,编译后不生成目标代码
用于分配内存空间、定义变量、指示程序开始和结束等编译
汇编源程序(EX1.ASM)目标文件(EX1.OBJ)设程序有伪指令 DATA DB 12
把数据12放到内存数据段地址DATA中没有伪指令代码
相应操作已在编译时完成伪指令格式伪指令格式 [名字] 伪指令助记符 操作数 [, 操作数, …] [;注释] 变量的符号地址 伪指令举例:
DATA DB 12 ;把数据12放到内存的数据段中
Y EQU 100 ;用符号(变量)Y代替数据100指示性语句中的操作数指示性语句中的操作数可以是:
寄存器、存储器单元
常量:数值或字符、字符串
变量:代表内存的数据区,程序视为存储器操作数
表达式:可包括各种运算符5.2 常用伪指令(指示性指令)5.2 常用伪指令(指示性指令) 数据定义伪指令
符号定义伪指令
段定义伪指令
设定段寄存器伪指令
结束伪指令
过程定义伪指令
宏命令伪指令下面分别介绍数据定义伪指令数据定义伪指令 用途:定义数据区中变量的类型
格式:[变量名] 伪指令助记符 操作数,[… ] [ ;注释]
例 ONE DB 25 ;定义一个字节,存入25
例 TWO DB ? ;定义一个字节,数据未知
例 THREE DB 3, 6 ;定义连续2字节
ONE┇ ┇ 25TWO××3┇6THREE数据定义伪指令助记符数据定义伪指令助记符 DB:定义的变量为字节型
DW:字类型(2字节)
DD:双字型(4字节)
DQ:4字型(8字节) DT:10字节型
例
ONE DW 1234H ;定义一个字并存入数据
TWO DW 56H ;定义一个字并存入数据
DATA1 DW ? ;定义一个字
DATA2 DD ? ;定义双字ONE34H00HTWO12H┇ 56H┇ ××××DATA1××××××××DATA2内存低端内存高端要求掌握定义字符串定义字符串定义字符串必须用DB伪指令
例 DATA1 DB ‘ABCD‘
例 DATA1 DB 41H, 42H, 43H, 44H
例 DATA1 DB ‘ABC‘, 44HBCDA3种等价写法DATA1定义存储字符的输入缓冲区(不要求)定义存储字符的输入缓冲区(不要求) 格式:符号地址 DB N1, ? , N1 DUP (?)
例 DAT1 DB 20, ?, 20 DUP (?) 状态见图
N10DHN2整个缓冲区最多键入字符数实际键入字符数结束符20 ? ?缓冲区初态DAT1重复操作符重复操作符 用于:为一个数据区的各单元设置相同的初值
格式:[变量名] 伪指令助记符 n DUP (值, …)
例 DATA DB 0, 0, 0, 0 等价
DATA DB 4 DUP (0)
例 DB 22H, 11H, 22H, 11H 等价
DB 2 DUP (22H,11H)符号定义伪指令符号定义伪指令 格式:符号名 EQU 表达式
操作:用符号名代替后边的表达式,不可重新定义
说明:EQU说明的表达式不占用内存空间
例 CONSTANT EQU 100
VAR EQU 30H+99H 段定义伪指令段定义伪指令 说明逻辑段的起始和结束
说明不同程序模块中同类逻辑段之间的联系形态
段名 SEGMENT [定位类型] [组合类型] [类别]
┇
段名 ENDS
例 定义数据段
DATA SEGMENT
MEM1 DB 11H, 22H
MEM2 DW 1234H
DATA ENDS说明逻辑段的起点段的类别与其他段的关系指定段寄存器伪指令指定段寄存器伪指令 功能:用于说明指向逻辑段的寄存器
格式:
ASSUME 段寄存器名: 段名 [, 段寄存器名: 段名, … ]
例 DATA SEGMENT ;定义数据段
┇
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME CS: CODE, DS: DATA ;指定段寄存器
┇
CODE ENDS结束伪指令结束伪指令 功能:表示源程序结束
格式:END [标号]
例 CODE SEGMENT
ASSUME CS: CODE
START: MOV AX, 12H
┇
CODE ENDS
END START ;表示源程序结束
5.3 汇编语言程序设计5.3 汇编语言程序设计5.3.1 顺序结构程序
5.3.2 分支结构程序
5.3.3 循环结构程序
5.3.4 子程序
5.3.1 顺序结构程序 (举例1)5.3.1 顺序结构程序 (举例1)例5.4 下面程序把输入的小写字母变成大写字母,并输出。
大写字母ASCII码=小写字母ASCII码-32
CODE SEGMENT
ASSUME CS: CODE
START: MOV AH, 1 ;键盘输入字符
INT 21H ;输入的字符存入AL中
SUB AL, 32 ;小写字母转成大写字母
MOV DL, AL ;显示的字符要事先存入DL中
MOV AH, 2 ;显示字符
INT 21H
MOV AH, 76 ;退出程序,返回操作系统
INT 21H
CODE ENDS
END START 顺序结构程序 (举例2)顺序结构程序 (举例2)DATA SEGMENT
NUM1 DW 250H
NUM2 DW 1A9H
RESULT DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX ;数据段地址送DS
MOV AX, NUM1
SUB AX, NUM2 ;两数相减,即AX=NUM1-NUM2
MOV RESULT, AX ;存放结果
MOV AH, 4CH
INT 21H ;返回
CODE ENDS
END START求两数之差
即NUM1-NUM2
结果放RESULT中NUM1→ 50NUM2→RESULT→ A95.3.2 分支结构程序(举例1)5.3.2 分支结构程序(举例1)例5.6 下面程序段从键盘输入1个0~9的数字,该数乘以2,乘积存入DX中
MOV DX, 0
MOV AH, 1
INT 21H ;键盘输入,输入的字符存入AL中
CMP AL, 39H ;检查输入的字符是否为数字,即要求39H≥AL≥30H
JA STOP ;若AL>‘9’,即AL>39H,则跳到STOP处,结束程序
CMP AL, 30H
JA STOP ;若AL<‘0’,即AL<30H,则跳到STOP处,结束程序
AND AL, 0FH ;将数字的ASCII码转变成二进制编码,并放在AL中
MOV BL, 2
MUL BL ;AL×BL,乘积放AX中
MUL DX, AX ;乘积存入DX中
STOP: … 分支结构程序 (举例2)分支结构程序 (举例2) 2X+4 X<2
3X-5 X≥2 X→ 5 ?Y→例5.7 实现分段函数Y=
MOV BX, 3 ;计算X≥2
MUL BX
SUB AX, 5 ;计算3X-5
JMP A2 ;转到A2
A1: MOV BX, 2 ;计算X<2
MUL BX
ADD AX, 4 ;计算2X+4
A2: MOV Y, AX ;保存Y值
MOV AH, 4CH ;返回
INT 21H
CODE ENDS
END STARTDATA SEGMENT
X DW 5
Y DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AX, X
CMP AX, 2 ;比较AX和2
JL A1 ;AX小于2转到A1 5.3.3 循环结构程序 (举例1) 5.3.3 循环结构程序 (举例1) 例5.8 编写程序,计算1+2+…+10,结果送AX寄存器
CODE SEGMENT
ASSUME CS:CODE
START: MOV AX, 0 ;AX清0,用于存储1+2+…+10之值
MOV BX, 1 ;加数初始化(第1个加数1→BX)
MOV CX, 10 ;循环次数10→CX
SUM: ADD AX, BX ;累加(AX+BX→AX)
INC BX ;构造下一个加数:BX加1
LOOP SUM ;CX减1,若CX≠0,则转到SUM处继续加
MOV AH, 4CH
INT 21H
CODE ENDS
END START 5.3.4 子程序 5.3.4 子程序 子程序(过程)定义格式:
子程序名 PROC [ NEAR/FAR ]
┇
RET
子程序名 ENDP
调用子程序指令:CALL 子程序名
子程序返回指令:RET子程序举例子程序举例例5.14 编写实现延时(耗时)功能的子程序(近过程),名称为DELAY
DELAY PROC NEAR ;定义名为DELAY的近过程,用于实现延时功能
PUSH CX ;保护CX
PUSH AX ;保护AX
D1: MOV CX, 0FFFFH
D2: MOV AX, 0FFFFH
DEC AX
JNZ D2
LOOP D1
POP AX ;恢复AX
POP CX ;恢复CX
RET ;返回到调用处
DELAY ENDP ;DELAY子程序结束处
子程序举例子程序举例例5.14 编写程序,每隔一定时间在屏幕显示字符A,当有键按下,即结束程序。
要求调用子程序DELAY实现延时(每隔一定时间)。
CODE SEGMENT
ASSUME CS:CODE
START: MOV DL, 'A'
SHOW: MOV AH, 2
INT 21H ;屏幕显示字符A
COUNT: MOV AH, 1 ;检查是否有键按下
INT 16H
JNE EXIT ;有则退出
CALL DELAY ;调用下面的延时子程序DELAY
JMP SHOW ;跳到SHOW处,继续显示字符A
EXIT: MOV AH, 4CH ;退出程序
INT 21HDELAY PROC NEAR
┇
DELAY ENDP
CODE ENDS
END START本章要求掌握的主要内容本章要求掌握的主要内容 汇编语言程序设计的一般过程
汇编语言源程序的结构框架
什么是指令性语句和指示性语句
基本伪指令
能够阅读和编写简单的汇编语言源程序简答题(更多习题见教材)简答题(更多习题见教材)1.要运行一个用汇编语言编写的程序需经过几个步骤,每步使用什么程序,得到什么文件?
2.一个汇编语言源程序通常由哪些逻辑段组成?
3.什么是汇编语言伪指令,写出一条伪指令。
4.什么是CPU执行指令,写出一条执行指令。
5.编写程序,在屏幕上显示26个大写字母,要求用33号中断程序的2号子功能,即每次输出一个字母,共循环26次。
完