微机原理与接口技术.ppt

上传人:少林足球 文档编号:3854905 上传时间:2019-10-01 格式:PPT 页数:116 大小:1.19MB
返回 下载 相关 举报
微机原理与接口技术.ppt_第1页
第1页 / 共116页
微机原理与接口技术.ppt_第2页
第2页 / 共116页
微机原理与接口技术.ppt_第3页
第3页 / 共116页
微机原理与接口技术.ppt_第4页
第4页 / 共116页
微机原理与接口技术.ppt_第5页
第5页 / 共116页
点击查看更多>>
资源描述

《微机原理与接口技术.ppt》由会员分享,可在线阅读,更多相关《微机原理与接口技术.ppt(116页珍藏版)》请在三一文库上搜索。

1、,侯彦利,吉林大学工学部计算机硬件基础课程 微机原理与接口技术,1,吉林大学工学部计算机硬件基础课程 微机原理与接口技术,2,第4章 汇编语言及其程序设计,教学目的: 了解汇编语言源程序的结构 掌握伪指令系统 理解DOS功能调用 掌握汇编语言源程序的设计方法,3,4.1 汇编语言源程序,用汇编语言编写的程序称为汇编语言源程序,将汇编语言源程序翻译成机器语言的系统程序称为汇编程序assembler,翻译的过程叫做汇编assemble。,4,4.1.1 汇编语言源程序结构,汇编语言源程序结构是指语句的格式和程序的组成部分。源程序结构取决于汇编程序,不同的汇编程序要求的源程序结构不同,不同CPU的汇

2、编程序也不相同。不过功能大致相同的汇编语言其源程序结构也大致相同。本章以80X86CPU所常用的MASM宏汇编程序为背景介绍汇编语言源程序结构。 汇编语言源程序的组成部分,5,1. 汇编语言源程序的组成部分:,数据段名 SEGMENT 数据段名 ENDS 附加数据段名 SEGMENT 附加数据段名 ENDS 堆栈段名 SEGMENT 堆栈段名 ENDS 代码段名 SEGMENT 代码段名 ENDS END,每段以SEGMENT 语句开始,整个程序以END 语句结束,以ENDS 语句结束,6,【例题4-1】将STRING 1中100个字节传送到STRING 2中,DATA SEGMENT ;定义

3、数据段 STRING1 DB 100 DUP(55H) DATA ENDS ;数据段结束 EDATA SEGMENT ;定义附加段 STRING2 DB 100 DUP(?) EDATA ENDS ;附加段结束 STACK SEGMENT ;定义堆栈段 DW 256 DUP(?) STACK ENDS ;堆栈段结束 CODE SEGMENT ;定义代码段 ASSUME CS:CODE, DS:DATA, ES:EDATA, SS:STACK START: MOV AX, DATA MOV DS, AX ;初始化DS MOV AX, EDATA MOV ES, AX ;初始化ES MOV AX,

4、 STACK MOV SS, AX MOV SI, OFFSET STRING1 ;初始化源串指针 MOV DI, OFFSET STRING2 ;初始化目的指针 MOV CX, 100 ;初始化计数器 CLD ;设置DF=0,使SI和DI按增量变化,增量为1 REP MOVSB MOV AH, 4CH INT 21H CODE ENDS ;代码段结束 END START,7,汇编语言源程序由若干段组成:数据段、附件数据段、堆栈段和代码段等,段与段之间的顺序可以随意排列,每一段由SEGMENT开始,以ENDS结束,每段的开始和结束都附有相同的名字。 一个程序一般定义三类段:数据段、堆栈段和代码

5、段,必要时增加定义附加数据段,能独立运行的程序至少包含一个代码段。,8,2. 汇编语言的语句格式,汇编语言源程序中一行只能写一个语句。每个语句可以有4部分: 标号、操作码助记符、操作数助记符、注释。 例如: BEGAIN: MOV AX, BX ;BX数据传送给AX,9,标号是某条指令的地址,是用符号表示的地址,所以也叫符号地址。 标号后加冒号“:”。 名字是变量、段或子程序的名字。 例如【例题4-1】中的DATA、EDATA、STACK和CODE。 名字后面没有冒号“:”,与操作码之间用空格分隔。 操作码和操作数之间用空格分隔,操作数之间用逗号分隔。 分号表示注释,用来说明程序或语句的功能,

6、常跟在语句的后面,分号为注释的开始。如果一行的第一个字符是“;”说明整行都是注释,用来说明下面程序段的功能。,10,汇编语言语句类型:,指令性语句、指示性语句,11,指示性语句,又称为伪操作语句,它不是8088/8086CPU的指令,它与汇编程序(assembler)有关。指示性语句的功能主要是定义变量、为数据分配存储空间、告诉汇编程序如何对源程序汇编等。源程序汇编后指示性语句不生成目标代码,所以常被称为伪指令。 例如: DATA SEGMENT ;定义数据段 STRING1 DB 100 DUP(55H) DATA ENDS ;数据段结束,12,指令性语句,指令性语句是可执行语句,是8088

7、/8086CPU的指令。源程序汇编后指令性语句生成目标代码。例如: START: MOV AX, DATA MOV DS, AX ;初始化DS MOV AX, EDATA MOV ES, AX ;初始化ES MOV AX, STACK MOV SS, AX MOV SI, OFFSET STRING1 ;初始化源串指针 MOV DI, OFFSET STRING2 ;初始化目的指针 MOV CX, 100 ;初始化计数器 CLD ;设置DF=0,使SI和DI按增量变化,增量为1 REP MOVSB MOV AH, 4CH INT 21H,13,指令性语句和指示性语句的区别: 1.标号和名字 指

8、令性语句的标号是指令的符号地址,后边通常加上 : 名字通常表示变量名、段名和过程名,后边不加: 2.操作数 指令性语句的操作数最多有2个,可以没有; 指示性语句中的操作数至少要有1个,可以有多个,相互之间用逗号分开;,14,4.1.2 汇编语言源程序的处理过程,汇编程序(Assembler)就是处理汇编语言源程序的系统程序,处理的过程称为汇编。 源程序经过汇编生成目标程序,目标程序经过连接程序连接,就得到可执行文件。,15,4.1.3 汇编语言中的操作数,汇编语言语句中的操作数可以是寄存器、存储器单元、常量、变量、名字、标号和表达式。,16,1. 常量 常量也称常数,有数值常量和字符常量两种。

9、 数值常量可以是二进制数、十进制数和十六进制数。十六进制数若是以字母(AF)开始,需在前面加一个数字0,用以说明这是数值常量,不是字符串。例如: MOV AX, 0D3A9H 字符常量是用单引号括起来的字符或字符串,源程序汇编之后它们转换为相应的ASCII码。例如: MOV AL, A ;AL=41H VAR DB Hello ;相当于 VAR DB 48H, 65H, 6CH, 6CH, 6FH,17,2. 变量 变量是指存储单元中的数据,这些数据在程序运行中可以修改变化,因此称其为变量。每个变量可以有一个名字(变量名),也可以没有。一个变量名可以表示一个数据或一组类型相同的数据,即一个变量

10、名可以是一个数据的符号地址,也可以是一组数据的符号首地址。变量名可以作为存储器操作数使用。例如: STR DB STRING NUM DW 0AAH,23H LAB0 DQ 01A4578H,18,变量在除了代码段之外的其他段中定义,有段、偏移量和类型三种属性。 段属性:变量所在的段。 偏移量属性:变量的偏移地址。 类型属性:变量所存储数据的数据类型,有:BYTE、WORD、DWORD、DQ(8个字节)、DT(10个字节)。,19,3. 标号与名字 标号在代码段中定义,后面跟冒号,是指令的符号地址。标号经常作为转移指令、循环指令和调用指令的操作数。 标号有三种属性:段、偏移量和类型。 段属性:

11、标号所在的段。 偏移量属性:标号的偏移地址。 类型属性:标号是在本段内还是在其他段内,在本段内称为近地址属性(NEAR),在其他段内称为远地址属性(FAR),近地址属性NEAR可以省略。,20,例如: LEA SI, VAR MOV CX, 100 XOR AX, AX COUNT: ADD SI, 2 ADD AX, SI LOOP COUNT MOV SUM, AX ;COUNT的属性为近地址属性NEAR,21,名字通常指的是段名、变量名和子程序名,其后不跟冒号。标号与名字的用法作用不同,但设置方法却一样。可以使用: 大小写英文字母 数字0 特殊字符 ? # $ 标号或名字中的第一个字符必

12、须是英文字母或圆点 ,整体最长不能超过31个字符,不能使用指令助记符、寄存器名及汇编语言指令系统中的保留字。 标号和名字由程序员确定。,22,表达式 表达式由常量、变量和标号通过运算符结合而成。表达式中的运算在汇编时完成,运算结果可以是操作数也可以是操作数地址。例如下面指令中的源操作数: MOV AX, SEG VAR MOV BX, 5 MOD 3 ADD AL, LAB*5+DATA,23,表达式中的常用运算符:,(1)算术运算符: +、-、*、/、MOD MOD是指除法运算的余数,如15 MOD 7结果为1。 MOV AX, 15 MOD 7 ;汇编之后为MOV AX, 1 MOV DX

13、, ARRAY+(7-1)*2 (2)逻辑运算符:AND、OR、XOR、NOT 逻辑运算符只能用于数字表达式,不能用于地址表达式中。 CMP AL, 04H AND 75H ;汇编之后为CMP AL, 04,24,(3)关系运算符:EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于) 关系运算符对两个性质相同的数据进行运算,可以构成数字表达式或地址表达式,运算的结果应为逻辑值:关系成立结果为真,输出为全1;关系不成立结果为假,输出为0。 例如:DATA和NUM为常量,DATA= 5AH NUM=35H MOV BX, DATA GT NUM ; 汇编之

14、后为MOV BX, 0FFFFH MOV BX, DATA EQ NUM ; 汇编之后为MOV BX, 0,25,(4)取值运算符:TYPE、SIZE、OFFSET、SEG TYPE Variable 或label ;取变量或标号的类型。 变量的类型值:DB为1、DW为2、DD为4、DQ为8、DT为10 标号的类型值:NEAR为-1;FAR为-2 例如: NUM DW 0375H, 982AH, 793EH ;定义变量 ADD SI, TYPE NUM ;汇编之后为ADD SI, 2,26,SIZE Variable 取变量的所有操作数的字节数,也称为大小运算符。 例如: LAB0 DB 34

15、,65,28 LAB1 DW 100 DUP(3755H) MOV CX, SIZE LAB0 ;汇编之后为MOV CX, 3 MOV AX, SIZE LAB1 ;汇编之后为MOV CX, 200,27,OFFSET Variable 或label 取变量或标号的偏移地址。 例如: MOV BX, OFFSET NUM ;与LEA BX, NUM指令等价 SEG Variable 或label 取变量或标号的段基址。 例如: MOV BX, SEG NUM ;取NUM所在段的段基址,28,(5)修改属性运算符:PTR 修改操作数的类型,操作仅限于本条指令。 例如:MOV BX,WORD PT

16、R LAB0 段超越前缀“:”用来表示一个标号、变量或地址表达式的段属性。例如: MOV AX,ES: BX+SI,29,注意:在计算表达式值时,括号内的表达式优先计算,然后按运算符的优先顺序计算,对优先级相同的运算符按从左到右的顺序进行计算。运算符的优先级别从高到低的排列次序如下: 在圆括号中的项,方括号中的项 PTR、OFFSET、SEG、TYPE *、/、MOD、SHL、SHR +、- EQ、NE、LT、LE、GT、GE 先NOT,AND,然后是OR和XOR,30,4.2 伪 指 令,汇编语言中的指示性语句也称为伪指令。伪指令由汇编程序处理,不生成目标代码,不参与程序的执行。宏汇编程序M

17、ASM设置了几十种伪指令,下面简单介绍一些常用的伪指令: 设定段寄存器伪指令 数据定义伪指令 符号定义伪指令 过程定义伪指令 宏命令伪指令 模块定义与连接伪指令,31,4.2.1段定义伪指令,段定义伪指令SEGMENT和ENDS 格式:段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS 例如: DATA SEGMENT BUFFER DB 100 DUP(?) COUNT DW 100 DATA ENDS,32,(1)定位类型:说明该段对起始地址的要求。 PARA:段起始地址必须能被16整除; BYTE:段起始地址可以是任何地址; WORD:段起始地址必须为偶数; PAGE:段起始

18、地址必须从页边界开始,即必须能被256整除; 如果省略定位类型参数,汇编程序默认为PARA。,33,(2)组合类型:多个程序模块进行连接时,相同类型的段进行组合构成一个段。 NONE:本段作为独立段装入内存,不与其他模块中的段组合,即使段名相同也不组合。 PUBLIC:与其他模块中由PUBLIC说明的同名段接在一起。 COMMON:与其他模块中由COMMON说明的同名段重叠存放,后连接的COMMON段会覆盖前面的内容,连接之后COMMON的长度是各分段中的最长的段的长度。 STACK:与其他模块中由STACK说明的同名堆栈连接在一起,形成一个大的堆栈段,由各模块共享,堆栈指针自动指向这个大堆栈

19、段的栈顶。,34,MEMORY:将该段放在所有段的最后(高地址),如果连接时有多个MEMORY段,汇编程序将遇到的第一个作为MEMORY段,其余的作为COMMON段。 AT :表达式计算出的值为段基址,但不能用这种方式指定代码段。 如果省略组合类型参数,汇编程序默认为NONE。,35,(3)类别:指定段的类别。 用单引号括起来的字符串,常用STACK表示堆栈段,CODE表示代码段,DATA表示数据段,EXTRA表示附加数据段。在多个程序模块连接时,具有相同类别的段在一起装入连续的内存区域,无类别的段在一起装入连续的内存区域。,36,Estack segment para stack stack

20、 Estack ends 该段是堆栈段,段名为Estack;segment指明堆栈段开始;para说明该段必须从能被16整除的地址边界开始;stack指明组合类型;stack指明类别是堆栈类。 注意:同一个段的起始和结束必须是同一个名字。,37,2. ASSUME伪指令,格式:ASSUME 段寄存器名:段名,段寄存器名:段名, ASSUME伪指令说明段名和段基址寄存器之间的关系,但它不能给段寄存器赋值,段寄存器的值需要在代码段中由指令性语句赋值。 例如: ASSUME CS:CSEG, DS:DSEG, SS:SSEG, ES:EDSEG 说明CSEG段是代码段,DSEG段是数据段,SSEG段

21、是堆栈段,EDSEG段是附加数据段。,38,【例题4-2】测试内存TAB单元内的数为奇数还是偶数,如是奇数则BX置成0FFFFH;如是偶数BX置成0。,39,DSEG SEGMENT ;默认定位类型PARA,默认组合类型NONE TAB DB ? DSEG ENDS SSEG SEGMENT STACK ;默认定位类型PARA,组合类型为STACK DW 256 DUP(0) SSEG ENDS CSEG SEGMENT ;默认定位类型PARA,默认组合类型NONE ASSUME CS:CSEG, DS:DSEG, SS:SSEG START: MOV AX, DSEG MOV DS, AX

22、;给DS段寄存器赋值 MOV AX, SSEG MOV SS, AX ;给SS段寄存器赋值 MOV AL, TAB TEST AL, 01H ;测试BX中最低位的逻辑值 JZ EVEN1 ;ZF=1,AL为偶数转移至EVEN处执行 MOV BX, 0FFFFH ;AL为奇数,设置奇数标志 JMP CON EVEN1: MOV BX, 0 ;设置偶数标志,40,CON: MOV AH, 4CH INT 21H CSEG ENDS ;代码段结束 END START,41,4.2.2 数据定义伪指令,数据定义伪指令也称为变量定义伪指令,或存储单元分配伪指令。它用来定义变量、确定变量的类型、给变量赋初

23、值、为变量分配存储空间等。 格式: 变量名 伪操作助记符 操作数1,操作数2 DATA SEGMENT STR DB STRING NUM DW 0AAH,23H LAB0 DQ 01A4578H DATA ENDS,42,数据变量有5种定义命令,如下: DB:定义变量为字节类型,其后的每个操作数都占一个字节。 DW:定义变量为字类型,其后的每个操作数都占两个字节。 DD:定义变量为双字类型,其后的每个操作数都占二个字,即四个字节。 DQ:定义变量为四个字类型,其后的每个操作数都占四个字,即八个字节。 DT:定义变量为十个字节,其后的每个操作数都占十个字节。,43,例如: VAR DB 67H

24、, 4FH, 7AH ;定义VAR为字节类型变量,3个字节类型的操作数顺序存储在以VAR为首地址的连续内存单元中,每个操作数占一个内存单元。 注意:使用变量时,变量的类型必须与指令的要求相符。 例如:MOV AL,VAR ;AL=67H,44,DELAY DW 98A3H,17D9H ;定义DELAY为字类型变量,2个字类型的操作数顺序存储在以DELAY为首地址的连续内存单元中,每个操作数占2个内存单元。 例如: MOV BX, DELAY+2 ;BX=17D9H,45,NUM DD 0AAH,3EF6AC23H ;定义NUM为双字类型变量,2个双字类型的操作数顺序存储在以NUM为首地址的连续

25、内存单元中,每个操作数占4个内存单元。,46,从NUM中取一个字,应使用如下方法: 例如: MOV SI,OFFSET NUM MOV CX,SI 下列用法错: MOV CX,NUM ;指令错误,47,LAB0 DQ 01A4578H ;定义LAB0为4字类型变量,操作数存储在以LAB0为首地址的连续8个内存单元中。 LAB1 DT 3958235434H ;定义LAB1为10个字节类型变量,操作数存储在以LAB1为首地址的连续10个内存单元中。 注意:多字节数据在内存中存放时遵守“低位存于低地址中,高位存于高地址中”的原则。,48,【例题4-3】数据段中变量的内存分配。 DATA SEGME

26、NT STR DB STRING NUM DW 0AAH,23H LAB0 DQ 01A4578H ENDS,49,数据定义伪指令中的操作数可以是数值型常量、字符串常量,也可以是常量表达式,还可以是问号?,问号表示预留相应数量的存储单元,但不存入数据。例如: DATA1 DW 16*9, 55*3 DATA2 DB ?,? 变量DATA2有2个字节类型的操作数, 为每个操作数预留2个存储单元, 不进行初始化。,50,如果操作数很多而且相同,可以使用重复数据操作符DUP定义变量。例如: DATA3 DB 6 DUP(AAH) DATA4 DB 3 DUP(?,55H,?) 变量DATA3有6个操

27、作数,初始化为AAH; 变量DATA4有3组操作数,每组为3个, 共9个字节类型的操作数。,51,4.2.3符号定义伪指令,符号定义伪指令也称为赋值伪指令。在程序中有时会多次出现同一个数值或表达式,通常可以用赋值伪指令将其赋给一个符号,程序中凡是用到该数值或表达式的地方都用这个符号代替,这样既提高了程序的可读性又使程序易于修改。有2条符号定义伪指令: EQU =,52,1. EQU伪指令 格式:符号名 EQU 表达式 例如: CONS EQU 10 ;常数赋给符号CONS ALPHA EQU CONS9-32 ;常数赋给符号ALPHA ADDR EQU ALPHASI+8 ;地址表达式赋给符号

28、ADDR LOAD EQU MOV ;助记符赋给符号 注意:表达式中如果有变量或符号,则应该在该语句之前定义它们。在同一个程序中,一个符号不能定义两次。,53,用法: MOV AL, ALPHA CMP AL, CONS JMP WORD PTR ADDR,54,= 伪指令 格式: 符号名=表达式 说明:功能与EQU一样,给符号赋值,唯一的区别是可以对一个符号名重复定义。例如: NUM=8 NUM=NUM+6 这两条伪指令汇编之后,NUM=14,一般等号伪指令定义数值常量。,55,4.2.4 过程定义伪指令,过程定义伪指令也称为子程序定义伪指令。在程序中使用调用命令CALL调用它。过程定义伪指

29、令的格式: 过程名 PROC 属性 过程名 ENDP,56,说明:过程名(procedure name)为标识符,由程序员设置。过程名是子程序入口的符号地址,即是子程序的第一条指令性语句的符号地址。 过程的属性可以是NEAR或FAR,过程与调用命令在同一个代码段,过程的属性可以设置为NEAR类型;过程与调用命令不在同一个代码段,过程的属性应该设置为FAR类型。NEAR为缺省属性。,57,DELAY PROC NEAR PUSH AX PUSH CX MOV AX,0FFFFH NEXT: MOV CX,AX NEXT1: LOOP NEXT1 DEC AX JNZ NEXT POP CX PO

30、P AX RET DELAY ENDP,58,可以使用CALL指令调用DELAY,也可以用JMP指令跳转到DELAY 例如: CSEG SEGMENT ASSUME CS:CSEG, DS:DSEG START: MOV AX,DSEG MOV DS,AX MOV AX, ARRAY CALL DELAY MOV AH, 4CH INT 21H CSEG ENDS END START,59,一个过程可以调用其他的过程,这称为过程嵌套。例如: MAIN PROC FAR CALL SUB RET MAIN ENDP SUB PROC NEAR RET SUB ENDP 过程也可以调用自己,称为递

31、归调用。,60,4.2.5 程序结束伪指令,程序结束伪指令告诉汇编程序MASM源程序到此结束,并附带说明程序从哪开始执行。 格式:END 标号 END为伪操作符,标号为程序开始执行的指令的符号地址。如果程序包含多个模块,只有主程序模块的结束伪指令END后可以加标号,其他程序模块的END后不能指定标号。,61,4.2.6其他较常见伪指令简介,程序开始伪指令NAME 格式:NAME 模块名 功能:定义本程序模块的名字,告诉汇编程序MASM:源程序从这开始。,62,2. 标题定义伪指令TITLE 格式:TITLE 标题字符串 功能:打印源程序清单时,标题字符串作为每一页的标题。标题字符串对程序模块的

32、功能有说明作用,最多可有60个字符。如程序中没有NAME伪指令,则汇编程序将标题字符串中的前6个字符作为模块名。如果程序中既无NAME也无TITLE伪指令,源程序文件名就作为模块名。,63,ORG伪指令 格式:ORG 表达式 功能:指定后面的指令或数据从表达式指出的地址(偏移地址)开始存放。,64,4.3 DOS系统功能调用,DOS操作系统为用户提供的系统功能调用有两种,一种称为BIOS功能调用,也叫低级调用,调用它们可以驱动磁盘、控制显示器输出、驱动打印机和管理时钟;另一种称为DOS功能调用,也叫高级调用,调用它们可以管理内存、管理设备、管理文件和目录。 微机系统中21H号中断被称为DOS系

33、统功能调用,它的内部提供了八十多个功能子程序,可以实现字符输入、字符显示和打印、磁盘读写、文件建立打开关闭、文件读写等功能,基本上满足了普通程序员的编程需要。为了调用方便,系统对这些功能子程序顺序编号,称为功能号。调用的步骤如下: 把要调用的功能号送AH寄存器 根据调用要求设置入口参数 INT 21H,65,1. 输入单个字符 从键盘输入单个字符可以使用1、7、8号功能。1号功能接收键盘输入的字符并保存在AL中,同时显示在屏幕上。7、8号功能接收键盘输入的字符保存在AL中但不显示。它们都不需要入口参数。 例如: MOV AH, 1 INT 21H 这两条指令执行后,光标在屏幕上闪动,等待键盘按

34、键。一旦有键按下,其ASCII码存入AL中,字符显示在屏幕上。,66,2. 输入字符串 从键盘输入字符串存入指定的内存区域。 入口参数为DS:DX 使用0A号功能前首先要定义一个数据区,要求数据区的的第一个字节含有允许输入的最大字符个数(包括回车符),第二个字节用于存放实际输入的字符个数,从第三个字节开始作为字符串存储空间。 如果计划最多输入10个字符,数据区的定义方法如下: BUFF DB 10,0,10 DUP(?),67,BUFF数据区允许输入的最大字符个数为10个,若实际输入的字符个数(包括回车符)超过10个,则后面的字符由于没有存储空间而被丢弃,且喇叭会发出嘟嘟声报警,直到键入回车符

35、。 BUFF数据区的第二个字节初始化为0, 0A号功能执行时会把实际键入的字符数(不包括回车符)置入其中。如果实际键入的字符数不足10个,字符存储空间还有空余,空余的空间置0。 一般在定义数据区时,会比计划输入的字符数多一些。调用0A号功能的方法如下: MOV DX, OFFSET BUFF MOV AH, 0AH INT 21H,68,【例4-4】 从键盘上输入字符串WELCOME,DATA SEGMENT BUFF DB 10,0,10 DUP(?) ;定义数据区 DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX,

36、 DATA MOV DS, AX MOV DX, OFFSET BUFF MOV AH ,0AH ;功能号送AH INT 21H ; 功能调用 MOV AH, 4CH INT 21H CODE ENDS END START,69,3. 显示单个字符 入口参数:DL,将待显示字符的ASCII码送DL寄存器。 例如在屏幕上显示大写字母B,可以用下面的3条指令实现: MOV DL, B ;待显示字符的ASCII码送DL MOV AH, 2 ;功能号送AH INT 21H ;功能调用,70,4. 显示字符串 将字符串显示在屏幕上。 入口参数:DS:DX ,字符串必须以$结尾。 【例4-5】在屏幕上显示

37、字符串。,71,DATA SEGMENT STRING DB WELCOME TO JILIN UNIVERSITY, $ DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX , DATA MOV DS, AX MOV DX, OFFSET STRING ;设置入口参数 MOV AH, 09H ;功能号送AH INT 21H ;功能调用 MOV AH, 4CH INT 21H CODE ENDS END START 注意:9号功能要求字符串在数据段DS中,调用之前应将字符串首地址送至DX。,72,5. 返回操作系统 4CH号

38、功能调用使程序正常结束并返回操作系统, 调用方法如下: MOV AH, 4CH INT 21H 21H号中断内包含有丰富的系统功能调用,如果想查看更多的系统功能调用,可以参考附录。,73,4.4 汇编语言程序设计基础,4.4.1 汇编语言程序设计步骤 (1)分析问题确定算法 (2)画出程序流程图 (3)编写程序 (4)上机调试程序 将源程序汇编,剔除语法错误,生成目标代码文件;将目标代码文件链接生成可执行文件,利用调试工具(如DEBUG等)对可执行文件进行调试,经过调试确定程序的正确性。,74,4.4.2 顺序程序设计,【例4-6】 编写计算SA*B-C的程序,A、B、C是无符号字节变量,S是

39、字变量。 DATA SEGMENT A DB 38 ;定义数据 B DB 54 C DB 16 S DW ? ;为运算结果保留存储空间 DATA ENDS,75,CODE SEGMENT ASSUME CS : CODE, DS : DATA START: MOV AX, DATA MOV DS, AX MOV AL, A MOV BL, B MUL BL ;A*B,结果存在AX中 MOV BL, C MOV BH, 0 SUB AX, BX ;AX-C,结果在AX中 MOV S, AX ;保存计算结果 MOV AH, 4CH INT 21H ;返回操作系统 CODE ENDS END STA

40、RT,76,【例4-7】在内存中从TABLE单元开始的连续16个单元中,存放着015的平方值(平方表),查表求任意数X(0X15)的平方值,将结果保存在RESULT中。 DATA SEGMENT TABLE DB 0,1,4,9,16,25,36, 49,64,81 DB 100,121,144,169,196,225 X DB 11 RESULT DB ? ;定义结果存放单元 DATA ENDS,77,STACK SEGMENT STACK STACK DW 100 DUP(?) ;定义堆栈空间 STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA,

41、 SS:STACK START: MOV AX, DATA ;初始化数据段 MOV DS,AX MOV AX,STACK ;初始化堆栈 MOV SS,AX LEA BX,TABLE ;设置平方表的基地址 MOV AH,0 MOV AL, X ;取待查数 ADD BX, AX ;计算在表中具体地址 MOV AL, BX MOV RESULT, AL ;X的平方数存入RESULT MOV AH, 4CH INT 21H CODE ENDS END START,78,4.4.3 分支程序设计,分支程序结构分为简单分支结构和多分支结构两种形式 简单分支程序设计 一般用条件转移指令实现简单分支程序设计。

42、条件成立就转移到程序段1执行,否则按原顺序执行指令。,79,【例4-8】在数据段中DATA单元和DATA+1单元各存有一个无符号数,比较两数的大小,大的存入DATA单元,小的存入DATA+1单元。程序段如下:,MOV AL, DATA CMP AL, DATA+1 ;比较 JNC CHANGE ;DATADATA+1,转移到CHANGE MOV BL, DATA+1 ;条件不成立顺序执行 MOV DATA, BL ;交换 MOV DATA+1,AL CHANGE: .,80,2. 多分支程序设计 汇编语言语句功能简单,多分支程序是简单分支的罗列。,81,【例4-9】在提示信息PLEASE IN

43、PUT CHARACTER:后从键盘输入字符,如果输入的是ESC键,则结束程序;如果输入的是小写字母则显示;如果是大写字母,则转换为小写字母显示。,82,DATA SEGMENT MESSAGE DB 0DH,0AH,PLEASE INPUT CHARACTER: ,0DH,0AH,$ DATA ENDS STACK SEGMENT STACK STACK DW 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS: DATA, SS: STACK START: MOV AX, DATA MOV DS, AX MOV AX, STACK M

44、OV SS, AX MAS: MOV DX, OFFSET MESSAGE MOV AH, 9 INT 21H,83,AGAIN: MOV AH, 1 INT 21H CMP AL,1BH JE EXIT ;是ESC, 转移到EXIT CMP AL, 61H JC LOW0 ;是大写字母,转移到LOW0 CMP AL, 7BH JC LOW1 ;是小写字母,转移到LOW1 JMP MAS LOW0: ADD AL, 20H ;加上20H转换为小写字母的ASCII LOW1: MOV DL, AL MOV AH, 2 INT 21H JMP AGAIN EXIT: MOV AH, 4CH INT

45、 21H CODE ENDS END START,84,4.4.4 循环程序设计,循环程序结构由循环初始化、循环体和循环控制三部分组成。循环程序结构有两种:先执行后判断和先判断后执行。,85, 循环初始化,用来设置循环初始值,如设置循环计数器初值、设置地址指针首地址和初始数据等。 循环体,是循环的主体,包括循环要完成的具体操作和修改循环参数,如地址指针修改、计数值的修改。 循环控制,测试循环条件,判断是否继续循环,使循环能在有限的次数后结束。 在循环次数确定的情况下,可用循环次数作为控制条件,这时常用LOOP指令实现控制循环。循环控制的方法有很多,如标记控制循环,开关量控制循环,逻辑尺控制循环

46、等,在不同的场合使用不同的方法。,86,【例4-10】在数据段中从BUFF单元开始存放100个字节类型的无符号数,编写程序找出其中最大的数并存入MAX单元中。 DATA SEGMENT BUFF DB 100DUP(?) ;定义100个数据 MAX DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX,87,MOV CX, 99 ;设置循环次数 LEA SI, BUFF ;数据首地址送SI MOV AL, SI ;取第一个数 INC SI CON: CMP AL, SI ;与第二个数

47、比较大小 JNC NEXT ;若ALSI,则跳转NEXT处 MOV AL, SI ;AL SI, 替换AL NEXT:INC SI ;修改地址指针 LOOP CON ;测试循环条件CX=0? MOV MAX, AL MOV AH, 4CH INT 21H CODE ENDS END START,88,【例4-11】在数据段中从BUFF单元开始存放100个字节类型的无符号数,将它们按从大到小的顺序排序。 排序有多种算法,这里使用起泡法。从第一个数开始依次对相邻的两个数进行比较,100个数需要比较99次,所以程序需要设计一个99次的循环。在这个循环里每次比较时如果前边的数小于后面的数,这两个数交换位置。这99次的循环结束后,最小的数已经交换到了最后,还剩99个数要用同样的比较方法找到最小的数并放到最后,这只要再设计一个98次的循环就可

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1