汇编语言程序设计课件_第1页
汇编语言程序设计课件_第2页
汇编语言程序设计课件_第3页
汇编语言程序设计课件_第4页
汇编语言程序设计课件_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、汇编语言程序设计汇编语言程序设计4.1 汇编语言的基本语法(1) 用编辑程序建立 .ASM源文件;(2) 用汇编程序把 .ASM文件转汇编成 .OBJ文件;(3) 用链接程序把 .OBJ文件连接成.EXE文件;(4) 用DOS命令直接键入文件名就可执行该程序。 常用的汇编程序有Microsoft公司推出的宏汇编程MASM和BORLAND公司推出的TASM。我们采用QASM2.7版。4.1.1汇编程序的建立过程4.1 汇编语言的基本语法(1) 用编辑程序建立 .ASM源4.1.1汇编程序的建立过程4.1.1汇编程序的建立过程 为运行汇编语言程序,至少要在磁盘上提供以下文件:(1) 编辑程序,如E

2、DIT.EXE;(2) 汇编程序,如MASM.EXE;(3) 连接程序,如LINK.EXE;(4) 调试程序,如DEBUG.COM。4.1.1汇编程序的建立过程 为运行汇编语言程序,至少要在磁盘上提供以下文件:4.1【例】将变量VAR1和VAR2相减,并将结果送入变量RESULT。DATA SEGMENT ;定义数据段 VAR1 DW 7654H ;定义变量VAR1初值为7654H VAR2 DW 2345H ;定义变量VAR2初值为2345H RESULT DW ? ;定义变量RESULTDATA ENDS ;数据段结束CODE SEGMENT ;定义代码段 ASSUME CS: CODE

3、, DS: DATA ;为各个逻辑段指定段寄存器4.1.2 汇编语言程序格式【例】将变量VAR1和VAR2相减,并将结果送入变量RESUSTART: MOV AX, DATA ;初始化数据段寄存器DS MOV DS, AX MOV AX, VAR1 ;变量VAR1送AX SUB AX, VAR2 ;AX-VAR2结果送AX MOV RESULT, AX ;结果送变量RESULT MOV AH, 4CH ;调用4CH号DOS中断 INT 21H ;返回操作系统CODE ENDS ;代码段结束 END START ;汇编结束4.1.2 汇编语言程序格式START: MOV AX, DATA 物理地

4、址是由段地址和偏移地址组合而成的,汇编程序在把源程序转换为目标程序时,必须确定标号和变量(代码段和数据段的符号地址)的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起,形成一个可执行程序。为此,需要用段定义伪操作。4.1.2 汇编语言程序格式 物理地址是由段地址和偏移地址组合而成的,汇编程序在把SEGMENT_NAMESEGMENTSEGMENT_NAMEENDS 其中,删节号部分对于数据段、附加段和堆栈段来说,一般是存储单元的定义、分配等伪操作;对于代码段则是指令及伪操作。4.1.2 汇编语言程序格式SEGMENT_NAMESEGMENT4.1.

5、2 汇编 还必须明确段和段寄存器的关系,可用ASSUME伪操作来实现,其格式为 ASSUME :段名,. ASSUME :NOTHING其中,段寄存器名必须是CS、DS、ES和SS中的一个,而段名则必须是由SEGMENT定义的段中的段名。ASSUME NOTHING则可取消前面由ASSUME所指定的段寄存器。4.1.2 汇编语言程序格式 还必须明确段和段寄存器的关系,可用ASSUME伪操作 较为完整的汇编源程序段定义。DATE_SEG1 SEGMENT;定义数据段DATE_SEG1 ENDSDATA_SEG2 SEGMENT;定义数据附加段 DATA_SEG2 ENDSCODE_SEG SEG

6、MENT;定义代码段 ASSUME CS:CODE_SEG,DS:DATA_SEG1,ES:DATA_SEG2START:;开始执行的入口地址4.1.2 汇编语言程序格式 较为完整的汇编源程序段定义。4.1.2 汇编语言;设置DS寄存器为当前数据段MOVAX,DATA_SEG1 ;将数据段地址赋予DSMOVDS,AX;设置ES寄存器为当前附加段MOVAX,DATA_SEG2 ;将附加数据段地址赋予ESMOVES,AXCODE_SEGENDS ;代码段定义结束ENDSTART ;源程序结束4.1.2 汇编语言程序格式;设置DS寄存器为当前数据段4.1.2 汇编语言程序格式 由于ASSUME伪操作

7、只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,要把段地址装入段寄存器中,就必须在代码段中有对段地址装入相应的段寄存器中的指令。可用两条MOV指令完成这一操作。但是,代码段CS不需要这样做,这一操作是在程序初始化时完成的。4.1.2 汇编语言程序格式 由于ASSUME伪操作只是指定某个段分配给哪一个段寄 汇编语言源程序由若干条语句组成,语句分为如下两类。 1) 指令语句 指令语句能完成一定的操作功能,能够翻译成机器代码的语句。 指令语句的格式为: 【标号:】 指令助记符 【操作数】 【;注释】4.1.3汇编语言程序的语句类型 汇编语言源程序由若干条语句组成,语句分为如下两类

8、。4 2) 伪指令语句 伪指令语句也叫指示性语句,它只是为汇编程序在翻译汇编语言源程序时提供有关信息,并不翻译成机器代码,所以也不占用执行时间。 伪指令的格式为: 【符号名】 伪指令定义符 【参数表】 【;注释】 4.1.3汇编语言程序的语句类型 2) 伪指令语句4.1.3汇编语言程序的语句类型 4.2.1 常量 1常量的类型 (1)数值型常量 二进制数:以字母B结尾,例:10101001B。 十进制数:以字母D结尾(或省略),例:5678。 十六进制数:以字母H结尾,由09,AF所组成,以字母AF开头的十六进制数,须在字母前加上数字0。4.2 伪指令 4.2.1 常量4.2 伪指令 (2)字

9、符串常量 字符串常量是用单引号或双引号括起来的一个或多个字符,如ABC或“ABC”,字符在机器内是以ASCII存放。字母大、小写在计算机内存放的是不同的数值,例如,B在内存中为42H,b在内存中为62H。 4.2.1 常量 (2)字符串常量4.2.1 常量 2常量或表达式赋值伪指令 可以用赋值伪指令给常量或表达式赋值,程序中凡是需要用到的地方就可以用这个符号名来代替 (1)等值伪指令(EQU) 格式:符号名 EQU 表达式 功能:将表达式的值赋给符号名。 SUM EOU 34H ;将常数34H赋给 SUM NUM EQU EBP+31H ;EBP+3赋以NUM 4.2.1 常量 2常量或表达式

10、赋值伪指令4.2.1 常 (2)等号伪指令 格式:符号名表达式 功能:将表达式的值赋给符号名。 MATH=20H ENG=3 ENG=MATH+ENG+10H 等号语句与EQU语句有同样的功能,区别在于在同一源程序中,EQU语句不允许对符号重复定义,而等号语句允许对符号重复定义。4.2.1 常量 (2)等号伪指令4.2.1 常量 1. 变量的属性 段属性(SEG):变量所在段的段基址,它通常放在DS、ES、SS段寄存器中。 偏移属性(OFFSET):从变量所在段的起始地址到定义变量位置之间的字节数。 类型属性(TYPE):指变量占用存储单元的字节数。字节变量类型为BYTE,字变量类型为WORD

11、,双字变量类型为DWORD。4.2.2 变量 1. 变量的属性4.2.2 变量 2. 变量定义伪指令 变量定义伪指令是为操作数分配存储单元,并给这个存储单元取一个名字,即变量名,同时为变量赋以初值。 【变量名】 DB/DW/DD/DF/DQ/DT 表达式l, 功能:为变量分配存储单元,表达式可以是数值表达式、地址表达式、字符串、?、用逗号隔开的上述各项或DUP(表达式)。4.2.2 变量 2. 变量定义伪指令4.2.2 变量 (1)数值变量定义语句 NUM DB 100,45H ;将64H,45H赋给字节变量NUM SUM DW 3456H ;将3456H赋给字变量SUM TOTAL DD 2

12、2334455H ;将22334455H赋给双字变量 TOTAL 4.2.2 变量 (1)数值变量定义语句4.2.2 变量4.2.2 变量4.2.2 变量 (2)字符串变量定义语句 定义字符串变量可以用DB伪指令,它为字符串中的每个字符分配一个字节的存储单元,在存储单元中存放的是字符的ASCII码值。 ABC DB ABCDEF ;将字符串赋给变量ABC DATE DB BA,DC ;将两个字符串赋给变量DATE 4.2.2 变量 (2)字符串变量定义语句4.2.2 变量4.2.2 变量4.2.2 变量 (3)预分配存储单元 “?” 语句可以为数据项分配存储单元,但是存储单元中不预置确定的值,

13、所以常用来预留存储单元。 BVAR DB ? ;预分配1个字节单元 DVAR DW ?,?,? ;预分配3个字单元4.2.2 变量 (3)预分配存储单元4.2.2 变量 (4)重复数据定义 DUP语句可以重复进行数据定义操作,用带DUP的表达式可以为若干重复数据分配存储单元,DUP表达式也可以嵌套。 D1 DB 3 DUP(0) ;定义D1为3个全为0的字节单元 D2 DW l0 DUP(0ABCDH) ;定义D2为10个全为0ABCDH的字单元 D3 DD 2 DUP (20H, 2 DUP(10H) ;定义D3为20H,10H,10H, 20H,10H,10H4.2.2 变量 (4)重复数

14、据定义4.2.2 变量 标号是可执行语句的符号地址,用来表示指令在存储器中的位置。经常在转移指令中目标操作数字段出现,用以表示转移指令的目标地址。标号之后必需有一个冒号“:” 。 1标号的属性 (1)段属性(SEG):指标号所在段的段基址,它通常放在DS、ES、SS段寄存器中。 4.2.3 标号 标号是可执行语句的符号地址,用来表示指令在存 (2)偏移属性(OFFSET):指标号所在段中的偏移地址,即标号所在的地址与段基址之间的字节数。 (3)类型属性或距离属性(TYPE):用来说明该标号是段内引用还是段间引用。段内引用时为NEAR属性,指针占两个字节;段间引用时为FAR属性,指针占4个字节。

15、4.2.3 标号 (2)偏移属性(OFFSET):指标号所在段中的 2定义类型属性伪指令LABEL 语句格式: 变量名或标号 LABEL 类型 (1)与变量连用,给下一条语句中的变量取个新的名字,并可重新定义它的类型,其类型可以是BYTE、WORD或DWORD 。 (2)与标号连用 ,给指令地址定义一个新的标号,并可改变其类型属性NEAR或FAR 。4.2.3 标号 2定义类型属性伪指令LABEL4.2.3 分为数值表达式和地址表达式两种类型。表达式的运算是在汇编时由汇编程序完成的,表达式的运算结果作为操作数参加指令规定的操作。 1. 数值表达式 MOV AX, 2+10H 指令中源操作数是一

16、个数值表达式,其运算结果是个数值,指令执行后AX中存放的是该表达式的值。4.2.4 表达式 分为数值表达式和地址表达式两种类型。表达式的 2. 地址表达式 地址表达式的结果是一个存储单元的地址。当这个地址中存放的是数据时,称为变量;当这个地址中存放的是指令时,则称为标号。例如: MOV AX,ES:BX+1001H 指令中源操作数是地址表达式,其结果是一个存储单元的地址。4.2.4 表达式 4.2.4 表达式 1. 算术运算符 算术运算符:、*、等,参加运算的数和运算的结果均为整数,除法运算的结果取商的整数部分。 2. 逻辑运算符 逻辑运算符:AND、OR、XOR和NOT,用于对常量进行按位操

17、作。 4.2.5 运算符 1. 算术运算符4.2.5 运算符 注意,逻辑运算符与逻辑指令在形式上是一样的,但它们在语句中的位置不同。表达式中的逻辑运算符是只出现在指令的操作数部分,是由汇编程序汇编时完成运算;而逻辑指令是出现在指令的操作码部分,其运算是在指令执行时进行的。 OR AL,BH OR 80H MOV AL,CL AND 10000000B 4.2.5 运算符 注意,逻辑运算符与逻辑指令在形式上是一样的, 3. 关系运算符 包括GT(大于)、GE(大于等于)、LT(小于)、LE(小于等于)、EQ(等于)和NE(不等于)6种。对两个操作数进行比较运算,结果为逻辑值。 MOV AX, 1

18、1 EQ 1011B ;111011B为真,(AX)0FFFFH MOV BX, 10H EQ 32 ;10H=32为假,(BX)04.2.5 运算符 3. 关系运算符4.2.5 运算符 4. 修改属性运算符PTR 修改属性运算符PTR可以临时改变变量或标号原有的类型属性并赋予其新的类型属性。 DATA DB 10H,11H,12H,13H MOV EAX, DWORD PTR DATA ;修改DATA为双字型变量 4.2.5 运算符 4. 修改属性运算符PTR4.2.5 运算符 5. 取值运算符 取值运算符包括SEG(返回段地址)、OFFSET(返回偏移地址)、TYPE(返回类型字节数)、L

19、ENGTH(返回变量单元数)和SIZE(返回变量总字节数)。它们不改变原操作数的属性,只是取操作数的某一属性,返回的结果是一个数值。4.2.5 运算符 5. 取值运算符4.2.5 运算符 (1)SEG运算符 SEG运算符加在变量名或标号之前,返回的数值是该变量或标号所在段的段基址。例如; MOV AX,SEG VAR 如果变量VAR所在段的段基址为1000H,则该指令执行后AX的内容为1000H。 4.2.5 运算符 (1)SEG运算符4.2.5 运算符 (2)OFFSET运算符 OFFSET运算符加在变量名或标号之前,返回的数值是该变量或标号的偏移基址。例如: MOV BX,OFFSET V

20、AR 如果变量VAR在段内的偏移地址为2000H,则该指令执行后BX的内容为2000H。4.2.5 运算符 (2)OFFSET运算符4.2.5 运算符 (3)TYPE运算符 TYPE运算符加在变量名之前,返回的数值是该变量的类型字节数,DB为1,DW为2。当TYPE加在标号之前,返回的数值是这个标号的类型属件值, NEAR为1,FAR为2。 A1 DB 1,2,3,4,5,6,7,8 A2 DW l234H,5678H SF LABEL FAR SN: MOV BL, TYPE A1 ;BL=1 MOV BH, TYPE A2 ;BH=2 MOV DH, TYPE SF ;DH=2 4.2.5

21、 运算符 (3)TYPE运算符4.2.5 运算符 (4)LENGTH运算符 加在变量名之前,返回的数值是变量中所定义的元素个数。如果变量是用DUP说明的,则返回DUP前面的数值;如果没有DUP说明,则返回的值总是1。 B1 DB 100 DUP(0) B2 DW 4321H, 3859H MOV BX,LENGTH B1 ;等效MOV BX,100 MOV AX,LENGTH B2 ;等效MOV AX,14.2.5 运算符 (4)LENGTH运算符4.2.5 运算符 (5)SIZE运算符 该运算符加在变量名之前,返回的数值是该变量所分配的字节总数。它等于LEGTH和TYPE两个运算符返回的乘积

22、。例如,对于上例中所定义的变量B1、B2的返回值如下所示。 MOV BX, SIZE B1 ;(BX)=100 MOV CX, SIZE B2 ;(CX)=24.2.5 运算符 (5)SIZE运算符4.2.5 运算符 内存是分段管理的,程序的不同部分应放在特定的段中。段定义伪指令就是为程序的分段而设置的。 段名 SEGMENT 段名 ENDS 任何逻辑段总是从SEGMNT语句开始,以ENDS语句结束,成对出现。 4.2.6 段定义伪指令 内存是分段管理的,程序的不同部分应放在特定的 ASSUME 段寄存器名:段名,段寄存器名:段名, 该语句通知汇编程序源程序中定义的段由哪个段寄存器寻址。 AS

23、SUME语句是非执行语句,要求放在代码段内的段定义语句之后。4.2.7 段寄存器指派伪指令 ASSUME 段寄存器名:段名,段寄存 ASSUME语句仅仅约定了对逻辑段进行寻址操作时使用哪个段寄存器,而段寄存器的初值还必须在程序中用指令设置。 MOV AX,DATA MOV DS,AX 对CS的赋值是由操作系统系统自动完成的,程序员不用设置。4.2.7 段寄存器指派伪指令 ASSUME语句仅仅约定了对逻辑段进行寻 ORG 表达式 ORG伪指令用来指定该语句之后的程序或数据开始存放的偏移地址。 ORG 2000H VAR1 DB 2,3,45H ;从偏移地址2000H开始存放变量VAR1 4.2.

24、8 移动地址指针伪指令 4.2.8 移动地址指针伪指令 在汇编语言中,可以用$表示当前位置计数器的值。 DATA SEGMENT STR DB GOOD COUNT EQU $ STR DATA ENDS $表示当前的偏移地址,变量名STR表示上一条语句中变量STR的偏移地址,$STR表示两个偏移地址之差,是以变量STR为首地址的连续字节数,即STR为首地址的字符个数。4.2.9 当前位置计数器$ 在汇编语言中,可以用$表示当前位置计数器的值 END伪指令作为汇编语言源程序的结束语句,一般放在源程序的最后一行。一个程序模块只允许有一个END语句。 格式: END 标号4.2.10 程序结束伪指

25、令END 4.2.10 程序结束伪指令END 为方便程序员编写输入/输出程序,系统提供了两组功能程序。一组固化在BIOS内,由几十个内部子程序组成,它们能完成对I/O设备、文件、磁盘等的管理和操作。另一组是操作系统DOS为用户提供的使用输入输出设备的系统资源,它不仅使用简单,而且可以确保所开发的软件在同一操作系统下的兼容性。4.3 操作系统资源的使用 为方便程序员编写输入/输出程序,系统提供了两组功能程 1. 系统功能调用方法 系统功能调用INT 21H是一个有近90个子功能的中断服务程序,这些子功能的编号称为功能号。INT 21H的功能大致可以分为四个方面:设备管理、目录管理、文件管理和其他

26、。设置功能号n(AH)设置入口参数执行INT 21H分析出口参数4.3.1 DOS系统功能调用 1. 系统功能调用方法设置功能号n(AH)设置入口 2.基本I/O功能调用 (1)单个字符键盘输入(1、7、8号功能) 执行1号功能调用时,系统将扫描键盘,等待用户按键,一但有键按下,就将键值(相应字符的ASCII码值)读入,先检查是否是键,若是,则退出命令执行;否则,将键值送入AL寄存器,同时将这个字符显示在屏幕上。4.3.1 DOS系统功能调用 2.基本I/O功能调用 4.3.1 DOS系统 MOV AH,1 INT 21H AH8与AH=1功能类同,只是不在屏幕上显示输入的字符:而AH=7 ,

27、则只将输入字符的ASCII码送入AL,不显示,也不对字符做检查是否是键。 4.3.1 DOS系统功能调用4.3.1 DOS系统功能调用 (2)单个字符输出(2号功能) 执行2号功能调用时,要求将要显示字符的ASCII码(入口参数)送给寄存器DL,显示时光标跟随字符移动。并检查是否是,若是,则退出命令。 MOV DL, “:” MOV AH, 2 INT 21H 上述代码实现将字符“:”送入屏幕显示的功能。4.3.1 DOS系统功能调用 (2)单个字符输出(2号功能)4.3.1 DOS系 (3)输出字符串(9号功能) 执行9号功能调用时,要求DS:DX必须指向内存中一个以“$”作为结束标志的字符

28、串(入口参数)。 BUF DB HOW DO YOU DO ?$ MOV DX, OFFSET BUF MOV AH, 9 INT 21H 如果希望光标能自功换行,那么可在字符串结束字符$之前加上回车和换行的ASCII码(0DH,0AH)。4.3.1 DOS系统功能调用 (3)输出字符串(9号功能)4.3.1 DOS系统 (4)字符串输入(10号功能) 10号功能调用的功能是从键盘接收字符串并送到用户指定的输入缓冲区中,它要求DS:DX必须指向内存中一个将要存放字符串的缓冲区的首地址。 BUF DB 30, ?, 30 DUP(?) MOV DX, OFFSET BUF MOV AH, 0AH

29、 INT 21H4.3.1 DOS系统功能调用 (4)字符串输入(10号功能)4.3.1 DOS系 (5)程序结束返回操作系统(4C号功能) 执行4C号功能调用时,将使程序结束并返回操作系统,一般在程序结束处,编写指令: MOV AH,4CH INT 21H4.3.1 DOS系统功能调用 (5)程序结束返回操作系统(4C号功能)4. BIOS(Basic Input/Output System)是IBM-PC机的监控程序,它固化在微型机主板的ROM中,它的内容主要有系统测试程序(POST)、初始化引导程序(BOOT)、I/O设备的基本驱动程序和许多常用程序模块,它们一般以中断服务程序的形式存在

30、。4.3.2 BIOS系统功能调用 BIOS(Basic Input/Output S4.3.2 BIOS系统功能调用4.3.2 BIOS系统功能调用 由图可见,BIOS程序直接建立在硬件基础上,磁盘操作系统(DOS)和其他操作系统建立在BIOS基础上,各种高级语言则建立在操作系统基础上。用户程序可以使用高级语言,也可以调用DOS或其他操作系统,还可以调用BIOS,甚至直接指挥硬件设备。4.3.2 BIOS系统功能调用 由图可见,BIOS程序直接建立在硬件基础上,磁盘操作 应用程序调用DOS提供的系统功能,完成输入/输出或其他操作,用户可以少考虑硬件,实现起来容易。优点是程序的效率高,缺点是需

31、要程序员对硬件性能有较深的了解,编程复杂,所以一般不直接对硬件编程。 4.3.2 BIOS系统功能调用 应用程序调用DOS提供的系统功能,完成输入/输出或 BIOS中断程序处于DOS功能调用和硬件环境之间,和DOS功能调用相比,其优点是效率高,缺点是编程相对复杂;和直接对硬件编程相比,优点是实现相对容易,缺点是效率相对低。 (1) 有些功能DOS没有提供,但BIOS提供了; (2) 有些场合无法使用DOS功能调用; (3) 其他原因。4.3.2 BIOS系统功能调用 BIOS中断程序处于DOS功能调用和硬件环境之间,和4.4 汇编程序设计 程序是计算机命令(语句)的有序组合,这些语句的组合主要

32、有四大结构:顺序结构、分支结构、循环结构和子程序结构。下面分别加以说明。4.4 汇编程序设计 顺序结构的程序是一种最简单的程序,是没有分支、没有循环的直线运行的程序。实际上,程序中大多数代码段的指令都是顺序执行的,即使是循环程序和分支程序其主体部分也是顺序执行的。顺序结构作为完整的程序很少见,一般作为程序的部分使用。4.4.1 顺序程序设计4.4.1 顺序程序设计 例4-1 假设x、y为单字节正整数,编程计算 Z=(x23y) / 2。 结果Z用两个字节来存放。 根据题意,只要顺序的计算出x2、3y和(x23y) / 2便可。4.4.1 顺序程序设计 例4-1 假设x、y为单字节正整数,编程计

33、算4.4DATA SEGMENT X DB 25 Y DB 32 Z DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX, DATA MOV DS, AX MOV AL, X MUL AL ;求X2 4.4.1 顺序程序设计DATA SEGMENT4.4.1 顺序程序设计 MOV BL, Y ADD BL, BL ;Y+Y ADD BL, Y ;Y+Y+Y SUB AX, BX ;X23Y SHR AX, 1 ;(X23Y)/ 2 MOV Z, AX ;结果送Z MOV AH, 4CH ;返回操作系统 INT 21HCO

34、DE ENDS END START ;汇编结束4.4.1 顺序程序设计 MOV BL, Y 4.4.1 例4-2 用查表的方法将一位十六进制数转换成与它相应的ASCII码。 使用查表的方法,要建立一个表TABLE,在表中按照十六进制数从小到大的顺序放入它们对应的ASCII码值。然后再利用查表指令XLAT实现。编制的源程序如下: STACK1 SEGMENT STACK DW 20H DUP(0) ;建立堆栈段 STACK1 ENDS4.4.1 顺序程序设计 例4-2 用查表的方法将一位十六进制数转换成与它相DATA SEGMENT TABLES DB 30H,31H,32H,33H,34H,3

35、5H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H HEX DB 04H ;假定要查的十六进制数为4 ASCI DB ? ;存放查表的结果DATA ENDSCOSEG SEGMENT ASSUME CS:COSEG, DS:DATA, SS:STACK14.4.1 顺序程序设计DATA SEGMENT4.4.1 顺序程序BEING: MOV AX, DATA MOV DS, AX MOV BX, OFFSET TABLES MOV AL, HEX ;表内位移量送AL XLAT ;查表 MOV ASCI,AL ;结果送ASCI MOV DL, AL MOV

36、 AH, 2 ;调用DOS中断2号 INT 21H MOV AH, 4CH ;返回操作系统 INT 21HCOSEG ENDS END BEING4.4.1 顺序程序设计BEING: MOV AX, DATA.2 分支程序设计 分支程序利用条件转移指令对运算结果的状态标志进行判断,以实现转移功能。实现分支的要素有两个: (1)使用能影响状态标志的指令,如算术逻辑指令、移位指令和位测试指令等,将状态标志设置为能正确反映条件成立与否的状态。 (2)使用条件转移指令,对状态位进行测试判断,确定程序如何转移,形成分支。4.4.2 分支程序设计 分支程序利用条件4.4.2 分支程序设计4.

37、4.2 分支程序设计 例4-3 奇校验程序 标准ASCII码的最高位没有使用,可以用作传输的校验位。如果使包含校验位在内的数据中“1”的个数恒定为奇数,就是奇校验。程序首先通过键盘输入一个字符,如果字符的ASCII码中“1”的个数为奇数,则令最高位为“0”,否则令最高位为“1”。程序如下:4.4.2 分支程序设计 例4-3 奇校验程序4.4.2 分支程序设计CODE SEGMENT ;定义代码段,此题没有数据段 ASSUME CS: CODESTART: MOV AH, 1 INT 21H ;键盘输入, AL输入字符的ASCII码 AND AL, 7FH ;最高位置“0”、其他位不变 ;同时标

38、志PF反映“1”的个数 JNP NEXT ;个数为奇数,不需处理,转移 OR AL, 80H ;个数为偶数,高位置“1”、其他位不变 NEXT: MOV AH, 4CH ;返回操作系统 INT 21H CODE ENDS END START4.4.2 分支程序设计CODE SEGMENT ;定义代码段 例4-4 编程计算下列函数的值,X取值范围:128127。符号函数4.4.2 分支程序设计 例4-4 编程计算下列函数的值,X取值范围:128DATA SEGMENT X DB -3 ;假定X=-3 Y DB ?DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS:

39、 DATASTART: MOV AX, DATA MOV DS, AX MOV AL, X CMP AL, 0 ;X和0比较 JGE BIGER ;X=0跳转到4.4.2 分支程序设计DATA SEGMENT4.4.2 分支程序设计 MOV AL, 0FFH ;X=0的程序段BIGER: JE EQUL ;X=0跳转到EQUL MOV AL, 1 ;X0,1送Y单元 MOV Y, AL JMP NEXT ;跳过处理X=0的程序段EQUL: MOV Y, AL ;X=0,0送Y单元NEXT: MOV AH, 4CH ;返回操作系统 INT 21HCODE ENDS END START4.4.2

40、分支程序设计 MOV AL, 0F4.4.3 循环程序设计 1. 循环程序的组成 (1)循环初始化部分:主要是为一些变量赋上初值。循环初值分两类:一类是循环工作部分的初值,别一类是控制循环结束条件的初值。 (2)循环体部分:需要重复执行的程序段,是循环的主体。 (3)循环控制部分:用来保证循环程序按规定的次数或特定条件正常循环,按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。4.4.3 循环程序设计 1. 循环程序 2. 循环程序的结构 “当”型循环 “直到”型循环循环初始状态循环控制条件循环体循环初始状态循环控制条件循环体NYNY4.4.3 循环程序设计 2. 循环程序

41、的结构循环初始状态循环控制条件循环体 3. 循环控制的方法 (1)计数控制循环 将计数器的初值设置为循环次数,以后每执行一通循环体,使循环计数器减1,并测试计数器是否为0,若为0,则终止循环;否则,继续执行循环体。这种方法称为计数法,一般用循环指令LOOPLOOPELOOPNE进行编程。4.4.3 循环程序设计 3. 循环控制的方法4.4.3 循环程序设计 (2)条件控制法 对于循环次数不能预先确定的程序,只能根据循环过程中某个特定条件是否满足来控制循环是继续还是退出。这类通过测试特定条件来实现循环控制的方法称为条件控制法。4.4.3 循环程序设计 4.4.3 循环程序设计例4-5 设计一个程

42、序,完成从1连加到100(1+2+99+100)的操作,结果存SUM。DATA SEGMENT SUM DW ? ;存放结果DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX4.4.3 循环程序设计例4-5 设计一个程序,完成从1连加到100(1+2+9;循环初始化 SUB AX, AX ;工作寄存器清零 MOV CX, 100 ;计数器赋初值 CLC ;清除进位标志;循环体开始LP: INC AX ADC SUM, AX LOOP LP ;循环控制 MOV AH, 4CH INT 21H

43、CODE ENDS END START4.4.3 循环程序设计;循环初始化4.4.3 循环程序设计例4-7 将由小写字母组成的字符串welcome转换为大写字母,并在屏幕上显示。DATAS SEGMENT MSG DB welcome,$ DATAS ENDSCODES SEGMENT ASSUME CS:CODES, DS:DATASSTART: MOV AX, DATAS MOV DS, AX MOV BX,0 BX0指向第一个字母4.4.3 循环程序设计例4-7 将由小写字母组成的字符串welcome转换为大LOOP1: SUB MSGBX, a-A ;小写减20H转换为大写 INC BX ;指向下一个字母 CMP MSGBX,$ ;不是$则继续转换 JNZ LOOP1 MOV DX,OFFSET MSG ;调用9号功能 MOV AH,9 INT 21H MOV AH,4CH INT 21HCODES ENDS END START4.4.3 循环程序设计LOOP1: SUB MSGBX, a-A 例4-8 从自然数1开始累加,直到累加和大于1000为止,统计被累加的自然数的个数,并把统计的个数送入单元n中,把累加和送入单元sum中。开始AX=0, CX=0,BX=0BX=BX+1A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论