原理第4章.ppt

上传人(卖家):金钥匙文档 文档编号:432922 上传时间:2020-04-04 格式:PPT 页数:91 大小:1.80MB
下载 相关 举报
原理第4章.ppt_第1页
第1页 / 共91页
原理第4章.ppt_第2页
第2页 / 共91页
原理第4章.ppt_第3页
第3页 / 共91页
原理第4章.ppt_第4页
第4页 / 共91页
原理第4章.ppt_第5页
第5页 / 共91页
点击查看更多>>
资源描述

1、1,微型计算机原理 与接口技术,第四章,第4章汇编语言及其程序设计,2,教学目的 了解汇编语言源程序的结构 掌握伪指令系统 理解DOS功能调用 掌握汇编语言源程序的设计方法,3,4.1.1汇编语言源程序结构 汇编语言源程序结构是指语句的格式和程序的组成部分。源程序结构取决于汇编程序,不同的汇编程序要求的源程序结构不同,不同CPU的汇编程序也不相同。不过功能大致相同的汇编语言其源程序结构也大致相同。本章以80X86CPU所常用的MASM宏汇编程序为背景介绍汇编语言源程序结构。,4.1 汇编语言源程序 用汇编语言编写的程序称为汇编语言源程序,将汇编语言源程序翻译成机器语言的系统程序称为汇编程序(a

2、ssembler),翻译的过程叫做汇编(assemble)。,4,1. 汇编语言源程序的组成部分:,数据段名 SEGMENT 数据段名 ENDS 附加数据段名 SEGMENT 附加数据段名 ENDS 堆栈段名 SEGMENT 堆栈段名 ENDS 代码段名 SEGMENT 代码段名 ENDS END,每段以SEGMENT 语句开始,整个程序以END 语句结束,以ENDS 语句结束,5,1.汇编语言源程序的组成部分 先观察下面的程序: 【例题4-1】将STRING 1中100个字节传送到STRING 2中。 DATA SEGMENT ;定义数据段 STRING1 DB 100 DUP(55H) D

3、ATA 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, STACK MOV SS, AX MOV SI, OFF

4、SET 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,6,汇编语言源程序由若干段组成:数据段、附加数据段、堆栈段和代码段等,段与段之间的顺序可以随意排列,每一段由SEGMENT开始,以ENDS结束,每段的开始和结束都附有相同的名字。一个程序一般定义三个段:数据段、堆栈段和代码段,必要时增加定义附加数据段,能独立运行的程序至少包含一个代

5、码段。如果没有堆栈段,程序在执行时自动使用操作系统提供的堆栈,因此汇编源程序时的警告信息“NO STACK SEGMENT”可以忽略。,7,2. 汇编语言的语句格式 汇编语言源程序中一行只能写一个语句。每个语句可以有4部分: 标号(名字)、操作码助记符、操作数助记符和注释。 例如: BEGAIN: MOV AX, BX ;BX数据传送给AX 标号是某条指令的地址,是用符号表示的地址,所以也叫符号地址。 标号后加冒号“:”。 名字是变量、段或子程序的名字。 例如【例题4-1】中的DATA、EDATA、STACK和CODE。 名字后面没有冒号“:”,与操作码之间用空格分隔。 操作码和操作数之间用空

6、格分隔,操作数之间用逗号分隔。 分号表示注释,用来说明程序或语句的功能,常跟在语句的后面,分号为注释的开始。如果一行的第一个字符是“;”说明整行都是注释,用来说明下面程序段的功能。 汇编语言语句类型:指令性语句、指示性语句,8,1. 指示性语句 又称为伪操作语句,它不是8088/8086CPU的指令,它与汇编程序(assembler)有关。指示性语句的功能主要是变量定义、为数据分配存储空间、告诉汇编程序如何对源程序汇编等。源程序汇编后指示性语句不生成目标代码,所以常被称为伪指令。 指示性语句的一般格式: 名字 伪操作码助记符 操作数,操作数 ;注释 例如: DATA SEGMENT ;定义数据

7、段 STRING1 DB 100 DUP(55H) DATA ENDS ;数据段结束 名字与伪操作助记符之间用空格分隔,名字由程序员设置。,9,指令性语句 指令性语句是可执行语句,是8088/8086CPU的指令。源程序汇编后指令性语句生成目标代码。第3章中介绍的所有指令都是指令性语句的主体,其操作数最多只能有两个。 指令性语句的一般格式: 标号: 操作码助记符 操作数助记符,操作数助记符 ;注释 例如:【例题4-1】中语句“START:MOV AX,DATA ”和语句“ INT 21H ”之间的所有语句都是指令性语句。START是标号,可根据需要由程序员设置。标号表示指令的符号地址,可以作为

8、转移指令、循环指令和调用指令的操作数,标号后面要加冒号。,10,指令性语句和指示性语句在格式上的区别: 1.标号和名字 指令性语句的标号是指令的符号地址,后边通常加上: 名字通常表示变量名、段名和过程名,后边不加: 2.操作数 指令性语句的操作数最多有2个,可以没有 指示性语句中的操作数至少要有1个,可以有多个,相互之间用逗号分开,11,4.1.2 汇编语言源程序的处理过程 CPU只能执行机器语言程序,汇编语言毕竟不是机器语言,汇编语言程序必须通过具有“翻译”功能的系统程序的处理。汇编程序(Assembler)就是处理汇编语言源程序的系统程序,处理的过程称为汇编。源程序经过汇编生成机器语言目标

9、程序,简称目标程序。目标程序经过连接程序连接,就得到可执行文件。,图4-1 汇编语言源程序的处理过程,12,4.1.3 汇编语言中的操作数,汇编语言语句中的操作数可以是寄存器、存储器单元、常量、变量、名字、标号和表达式。 1. 常量 常量也称常数,有数值常量和字符常量两种。 数值常量可以是二进制数、十进制数和十六进制数。十六进制数若是以字母(AF)开始,需在前面加一个数字0,用以说明这是数值常量,不是字符串。例如: MOV AX, 0D3A9H 字符常量是用单引号括起来的字符或字符串,源程序汇编之后它们转换为相应的ASCII码。例如: MOV AL, A ;AL=41H VAR DB Hell

10、o ;相当于 VAR DB 48H, 65H, 6CH, 6CH, 6FH,13,2. 变量 变量是指存储单元中的数据,这些数据在程序运行中可以修改变化,因此称其为变量。每个变量可以有一个名字(变量名),也可以没有。一个变量名可以表示一个数据或一组类型相同的数据,即一个变量名可以是一个数据的符号地址,也可以是一组数据的符号首地址。变量名可以作为存储器操作数使用。 例如: STR DB STRING NUM DW 0AAH,23H LAB0 DQ 01A4578H,14,变量在除了代码段之外的其他段中定义,有段、偏移量和类型三种属性。 段属性:变量所在的段。 偏移量属性:变量的偏移地址。 类型属

11、性:变量所存储数据的数据类型,有:BYTE、WORD、DWORD、DQ(8个字节)、DT(10个字节)。,15,3. 标号与名字 标号在代码段中定义,后面跟冒号,是指令的符号地址。标号经常作为转移指令、循环指令和调用指令的操作数。 标号有三种属性:段、偏移量和类型。 段属性:标号所在的段。 偏移量属性:标号的偏移地址。 类型属性:标号是在本段内还是在其他段内,在本段内称为近地址属性(NEAR),在其他段内称为远地址属性(FAR),近地址属性NEAR可以省略。,16,例如: LEA SI, VAR MOV CX, 100 XOR AX, AX COUNT: ADD SI, 2 ADD AX, S

12、I LOOP COUNT MOV SUM, AX ;COUNT的属性为近地址属性NEAR,17,名字通常指的是段名、变量名和子程序名,其后不跟冒号。标号与名字的用法作用不同,但设置方法却一样。可以使用: 大小写英文字母 数字0 特殊字符 ? # $ 标号或名字中的第一个字符必须是英文字母或圆点 ,整体最长不能超过31个字符,不能使用指令助记符、寄存器名及汇编语言指令系统中的保留字。 标号和名字由程序员确定。,18,4. 表达式 表达式由常量、变量和标号通过运算符结合而成。表达式中的运算在汇编时完成,运算结果可以是操作数也可以是操作数地址。例如下面指令中的源操作数: MOV AX, SEG VA

13、R MOV BX, 5 MOD 3 ADD AL, LAB*5+DATA,19,表达式中的常用运算符,(1)算术运算符: +、-、*、/、MOD MOD是指除法运算的余数,如15 MOD 7结果为1。 MOV AX, 15 MOD 7 ;汇编之后为MOV AX, 1 MOV DX, ARRAY+(7-1)*2 (2)逻辑运算符: AND、OR、NOT、XOR 逻辑运算符只能用于数字表达式,不能用于地址表达式中。 CMP AL, 04H AND 75H ;汇编之后为CMP AL, 04,20,(3)关系运算符: EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大

14、于或等于) 关系运算符对两个性质相同的数据进行运算,可以构成数字表达式或地址表达式,运算的结果应为逻辑值:关系成立结果为真,输出为全1;关系不成立结果为假,输出为0。 例如: DATA和NUM为常量,DATA= 5AH, NUM=35H MOV BX, DATA GT NUM ; 汇编之后为MOV BX, 0FFFFH MOV BX, DATA EQ NUM ; 汇编之后为MOV BX, 0,21,(4)取值运算符: TYPE、SIZE、OFFSET、SEG TYPE Variable 或label 取变量或标号的类型。变量的类型值:DB为1、DW为2、 DD为4、DQ为8、DT为10,标号的

15、类型值:NEAR为-1;FAR为-2 例如: NUM DW 0375H, 982AH, 793EH ;定义变量 ADD SI, TYPE NUM ;汇编之后为ADD SI, 2,22,SIZE Variable 取变量的所有操作数的字节数,也称为大小运算符。 例如: LAB0 DB 34,65,28 LAB1 DW 100 DUP(3755H) MOV CX, SIZE LAB0 ;汇编之后为MOV CX, 3 MOV AX, SIZE LAB1 ;汇编之后为MOV CX, 200 OFFSET Variable 或label 取变量或标号的偏移地址。 例如: MOV BX, OFFSET N

16、UM ;与LEA BX, NUM指令等价,23,SEG Variable 或label 取变量或标号的段基址。 例如: MOV BX, SEG NUM ;取NUM所在段的段基址 (5)修改属性运算符: PTR 修改操作数的类型,操作仅限于本条指令。 例如:MOV BX,WORD PTR LAB0 段超越前缀“:”用来表示一个标号、变量或地址表达式的段属性。 例如: MOV AX,ES: BX+SI,24,注意:在计算表达式值时,括号内的表达式优先计算,然后按运算符的优先顺序计算,对优先级相同的运算符按从左到右的顺序进行计算。运算符的优先级别从高到低的排列次序如下: 在圆括号中的项,方括号中的项

17、 PTR、OFFSET、SEG、TYPE *、/、MOD、SHL、SHR +、- EQ、NE、LT、LE、GT、GE NOT,AND,然后是OR和XOR,25,4.2 伪 指 令,汇编语言中的指示性语句也称为伪指令。伪指令由汇编程序处理,不生成目标代码,不参与程序的执行。宏汇编程序MASM设置了几十种伪指令,下面简单介绍一些常用的伪指令: 设定段寄存器伪指令 数据定义伪指令 符号定义伪指令 过程定义伪指令 宏命令伪指令 模块定义与连接伪指令,26,4.2.1段定义伪指令,段定义伪指令SEGMENT和ENDS 格式:段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS 例如: DATA

18、 SEGMENT BUFFER DB 100 DUP(?) COUNT DW 100 DATA ENDS,27,2.ASSUME伪指令,格式:ASSUME 段寄存器名:段名,段寄存器名:段名, ASSUME伪指令说明段名和段基址寄存器之间的关系,但它不能给段寄存器赋值,段寄存器的值需要在代码段中由指令性语句赋值。 例如: ASSUME CS:CSEG, DS:DSEG, SS:SSEG, ES:EDSEG 说明CSEG段是代码段,DSEG段是数据段,SSEG段是堆栈段,EDSEG段是附加数据段。,28,【例题4-2】测试内存TAB单元内的数为奇数还是偶数,如是奇数则BX置成0FFFFH;如是偶

19、数BX置成0。 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 ;给DS段寄存器赋值 MOV AX, SSEG MOV SS, AX ;给SS段寄存器赋值 MOV AL, TAB TEST AL, 01H

20、;测试BX中最低位的逻辑值 JZ EVEN1 ;ZF=1,AL为偶数转移至EVEN处执行 MOV BX, 0FFFFH ;AL为奇数,设置奇数标志 JMP CON EVEN1: MOV BX, 0 ;设置偶数标志 CON: MOV AH, 4CH INT 21H CSEG ENDS ;代码段结束 END START,29,4.2.2 数据定义伪指令,数据定义伪指令也称为变量定义伪指令,或存储单元分配伪指令。它用来定义变量、确定变量的类型、给变量赋初值、为变量分配存储空间等。 格式: 变量名 伪操作助记符 操作数1,操作数2 DATA SEGMENT STR DB STRING NUM DW 0

21、AAH,23H LAB0 DQ 01A4578H DATA ENDS,30,数据变量有5种定义命令,如下: DB:定义变量为字节类型,其后的每个操作数都占一个字节。 DW:定义变量为字类型,其后的每个操作数都占两个字节。 DD:定义变量为双字类型,其后的每个操作数都占二个字,即四个字节。 DQ:定义变量为四个字类型,其后的每个操作数都占四个字,即八个字节。 DT:定义变量为十个字节,其后的每个操作数都占十个字节。,31,例如: VAR DB 67H, 4FH, 7AH ;定义VAR为字节类型变量,3个字节类型的操作数顺序存储在以VAR为首地址的连续内存单元中,每个操作数占一个内存单元。 注意:

22、使用变量时,变量的类型必须与指令的要求相符。 例如:MOV AL,VAR ;AL=67H,32,DELAY DW 98A3H,17D9H ;定义DELAY为字类型变量,2个字类型的操作数顺序存储在以DELAY为首地址的连续内存单元中,每个操作数占2个内存单元。 例如: MOV BX, DELAY+2 ;BX=17D9H,33,NUM DD 0AAH,3EF6AC23H ;定义NUM为双字类型变量,2个双字类型的操作数顺序存储在以NUM为首地址的连续内存单元中,每个操作数占4个内存单元。,34,从NUM中取一个字,应使用如下方法: 例如: MOV SI, OFFSET NUM MOV CX,SI

23、 下列用法错: MOV CX, NUM ;指令错误 LAB0 DQ 01A4578H ;定义LAB0为4字类型变量,操作数存储在以LAB0为首地址的连续8个内存单元中。 LAB1 DT 3958235434H ;定义LAB1为10个字节类型变量,操作数存储在以LAB1为首地址的连续10个内存单元中。 注意:多字节数据在内存中存放时遵守“低位存于低地址中,高位存于高地址中”的原则。,35,【例题4-3】数据段中变量的内存分配。 DATA SEGMENT STR DB STRING NUM DW 0AAH,23H LAB0 DQ 01A4578H ENDS,36,数据定义伪指令中的操作数可以是数值

24、型常量、字符串常量,也可以是常量表达式,还可以是问号?,问号表示预留相应数量的存储单元,但不存入数据。例如: DATA1 DW 16*9, 55*3 DATA2 DB ?,? 变量DATA2有2个字节类型的操作数, 为每个操作数预留2个存储单元, 不进行初始化。,37,如果操作数很多而且相同,可以使用重复数据操作符DUP定义变量。例如: DATA3 DB 6 DUP(AAH) DATA4 DB 3 DUP(?,55H,?) 变量DATA3有6个操作数,初始化为AAH; 变量DATA4有3组操作数,每组为3个, 共9个字节类型的操作数。,38,4.2.3 符号定义伪指令,符号定义伪指令也称为赋值

25、伪指令。在程序中有时会多次出现同一个数值或表达式,通常可以用赋值伪指令将其赋给一个符号,程序中凡是用到该数值或表达式的地方都用这个符号代替,这样既提高了程序的可读性又使程序易于修改。有2条符号定义伪指令: EQU 和 =,39,1. EQU伪指令 格式:符号名 EQU 表达式 例如: CONS EQU 10 ;常数赋给符号CONS ALPHA EQU CONS9-32 ;常数赋给符号ALPHA ADDR EQU ALPHASI+8 ;地址表达式赋给符ADDR LOAD EQU MOV ;助记符赋给符号 注意:表达式中如果有变量或符号,则应该在该语句之前定义它们。在同一个程序中,一个符号不能定义

26、两次。 用法: MOV AL, ALPHA CMP AL, CONS JMP WORD PTR ADDR,40,= 伪指令 格式: 符号名=表达式 说明:功能与EQU一样,给符号赋值,唯一的区别是可以对一个符号名重复定义。例如: NUM=8 NUM=NUM+6 这两条伪指令汇编之后,NUM=14,一般等号伪指令定义数值常量。,41,4.2.4过程定义伪指令,过程定义伪指令也称为子程序定义伪指令。在程序中常常有一些功能相对独立的程序段重复出现,通常将它定义为过程或称为子程序,在程序中需要这种功能时只要使用调用命令CALL调用它就可以了。过程定义伪指令的格式: 过程名 PROC 属性 过程名 EN

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

28、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,44,一个过程可以调用其他的过程,这称为过程嵌套。例如: MAIN PROC FAR CALL SUB RET MAIN ENDP SUB PROC NEAR RET SUB ENDP 过程也可以调用自己,称为递归调用。,45,4.2.5 程序结束伪指令,程序结束伪

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

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

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

32、入AL中,字符显示在屏幕上。,50,2. 输入字符串(0AH) 从键盘输入字符串存入指定的内存区域。 入口参数为DS:DX,即指定的内存区域应该在DS段,首地址应该存入DX寄存器。 使用0AH号功能前首先要定义一个数据区,要求数据区的的第一个字节含有允许输入的最大字符个数(包括回车符),第二个字节用于存放实际输入的字符个数,从第三个字节开始作为字符串存储空间。 如果计划最多输入10个字符,数据区的定义方法如下: BUFF DB 10,0,10 DUP(?),51,BUFF数据区允许输入的最大字符个数为10个,若实际输入的字符个数(包括回车符)超过10个,则后面的字符由于没有存储空间而被丢弃,且

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

34、ATA START: MOV AX, DATA MOV DS, AX MOV DX, OFFSET BUFF MOV AH ,0AH ;功能号送AH INT 21H ; 功能调用 MOV AH, 4CH INT 21H CODE ENDS END START,53,3. 显示单个字符(02H) 入口参数:DL,将待显示字符的ASCII码送DL寄存器。 例如在屏幕上显示大写字母B,可以用下面的3条指令实现: MOV DL, B ;待显示字符的ASCII码送DL MOV AH, 2 ;功能号送AH INT 21H ;功能调用 4. 显示字符串(09H) 将字符串显示在屏幕上。 入口参数:DS:DX

35、 ,字符串必须以$结尾。 【例4-5】在屏幕上显示字符串。,54,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中,调用之前应将字符串首

36、地址送至DX。,55,5. 返回操作系统 4CH号功能调用使程序正常结束并返回操作系统, 调用方法如下: MOV AH, 4CH INT 21H 21H号中断内包含有丰富的系统功能调用,如果想查看更多的系统功能调用,可以参考附录。,56,4.4.1 汇编语言程序设计步骤 (1)分析问题确定算法 对应用问题及其环境的分析是编程的第一步,追踪问题中的数据流向及条件,将问题模块化。明确程序运行要求和数据输入输出形式的要求,找出合理的算法,建立恰当的数据结构。 (2)画出程序流程图 根据算法和数据结构,画出程序流程图。 (3)编写程序 分配数据存储空间、设计参数传递方法、确定各寄存器的功能,继而用指令

37、和伪指令实现程序流程图中指定的功能,形成汇编语言源程序。 (4)上机调试程序 将源程序汇编,剔除语法错误,生成目标代码文件;将目标代码文件链接生成可执行文件,利用调试工具(如DEBUG等)对可执行文件进行调试,经过调试确定程序的正确性。,4.4 汇编语言程序设计基础,57,4.4.2 顺序程序设计,【例4-6】 编写计算SA*B-C的程序,A、B、C是无符号字节变量,S是字变量。 DATA SEGMENT A DB 38 ;定义数据 B DB 54 C DB 16 S DW ? ;为运算结果保留存储空间 DATA ENDS CODE SEGMENT ASSUME CS : CODE, DS :

38、 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 START,58,【例4-7】在内存中从TABLE单元开始的连续16个单元中,存放着015的平方 值(平方表),查表求任意数X(0X15)的平方值,将结果保存在RESULT中 DATA SEGMENT TABLE DB 0,1,4,9,1

39、6,25,36,49,64,81,100,121,144,169,196,225 X DB 11 RESULT DB ? ;定义结果存放单元 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 ;初始化堆栈 MOV SS,AX LEA BX,TABLE ;设置平方表的基地址 MOV AH,0 MOV AL, X ;取

40、待查数 ADD BX, AX ;计算待查数在表中具体地址 MOV AL, BX MOV RESULT, AL ;X的平方数存入RESULT MOV AH, 4CH INT 21H CODE ENDS END START,59,4.4.3 分支程序设计,分支程序结构分为简单分支结构和多分支结构两种形式 简单分支程序设计 一般用条件转移指令实现简单分支程序设计。条件成立就转移到程序段1执行,否则按原顺序执行指令。,60,【例4-8】在数据段中DATA单元和DATA+1单元各存有一个无符号数,比较两数的大小,大的存入DATA单元,小的存入DATA+1单元。程序段如下: MOV AL, DATA CM

41、P AL, DATA+1 ;比较 JNC CHANGE ;DATADATA+1,转移到CHANGE MOV BL, DATA+1 ;条件不成立顺序执行 MOV DATA, BL ;交换 MOV DATA+1,AL CHANGE: .,61,2. 多分支程序设计 汇编语言语句功能简单,多分支程序是简单分支的嵌套。,62,【例4-9】在提示信息PLEASE INPUT CHARACTER:后从键盘输入字符,如果输入的是ESC键,则结束程序;如果输入的是小写字母则显示;如果是大写字母,则转换为小写字母显示。 DATA SEGMENT MESSAGE DB 0DH,0AH,PLEASE INPUT C

42、HARACTER:,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 MOV SS, AX MAS: MOV DX, OFFSET MESSAGE ;调用9号功能 MOV AH, 9 INT 21H,63,AGAIN: MOV AH, 1 INT 21H CMP AL,1BH ;1BH为ESC的ASCII码 JE EX

43、IT ;是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 ;调用2号功能 MOV AH, 2 INT 21H JMP AGAIN EXIT: MOV AH, 4CH INT 21H CODE ENDS END START,64,4.4.4 循环程序设计,循环程序结构由循环初始化、循环体和循环控制三部分组成。循环程序结构有两种:先执行后判断和先判断后执行。

44、,65, 循环初始化,用来设置循环初始值,如设置循环计数器初值、设置地址指针首地址和初始数据等。 循环体,是循环的主体,包括循环要完成的具体操作和修改循环参数,如地址指针修改、计数值的修改。 循环控制,测试循环条件,判断是否继续循环,使循环能在有限的次数后结束。 在循环次数确定的情况下,可用循环次数作为控制条件,这时常用LOOP指令实现控制循环。循环控制的方法有很多,如标记控制循环,开关量控制循环,逻辑尺控制循环等,在不同的场合使用不同的方法。,66,DATA SEGMENT BUFF DB 100 DUP(?) ;定义100个数据 MAX DB ? DATA ENDS CODE SEGMEN

45、T ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV CX, 99 ;设置循环次数 LEA SI, BUFF ;数据首地址送SI MOV AL, SI ;取第一个数 INC SI CON: CMP AL, SI ;与第二个数比较大小 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,【例4-1

46、0】在数据段中从BUFF单元开始存放100个字节类型的无符号数,编写程序找出其中最大的数并存入MAX单元中。,67,【例4-11】在数据段中从BUFF单元开始存放100个字节类型的无符号数,将它们按从大到小的顺序排序。 排序有多种算法,这里使用起泡法。从第一个数开始依次对相邻的两个数进行比较,100个数需要比较99次,所以程序需要设计一个99次的循环。在这个循环里每次比较时如果前边的数小于后面的数,这两个数交换位置。这99次的循环结束后,最小的数已经交换到了最后,还剩99个数要用同样的比较方法找到最小的数并放到最后,这只要再设计一个98次的循环就可以了。以此类推这个过程需要99轮。 用起泡算法排序需要设计两重循环,内循环完成数的比较和交换,初始内循环计数值为N-1次,之后每次进入内循环计数值减1;外循环需要N-1次,从外循环进入内循环时注意地址指针初始化和内循环次数的设置。 下面的程序在内循环中设置了交换标志,从外循环进入内循环时检查交换标志,如果标志不为0说明前一个内循环里至少有两数据的顺序不合要求,需要再执行一次内循环;如果标志为0,说明所有数据的排序结束。,68,LEN EQU 100 DATA SEGMENT BUFF DB 100(?) ;定义100个数据 CHANGE

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

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(原理第4章.ppt)为本站会员(金钥匙文档)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|