第四章汇编语言程序设计课件.ppt

上传人(卖家):晟晟文业 文档编号:4142842 上传时间:2022-11-14 格式:PPT 页数:69 大小:205.33KB
下载 相关 举报
第四章汇编语言程序设计课件.ppt_第1页
第1页 / 共69页
第四章汇编语言程序设计课件.ppt_第2页
第2页 / 共69页
第四章汇编语言程序设计课件.ppt_第3页
第3页 / 共69页
第四章汇编语言程序设计课件.ppt_第4页
第4页 / 共69页
第四章汇编语言程序设计课件.ppt_第5页
第5页 / 共69页
点击查看更多>>
资源描述

1、第四章第四章 汇编语言程序设计汇编语言程序设计 第一节第一节 汇编语言源程序汇编语言源程序汇编语言是用指令的助记符、符号地址、标汇编语言是用指令的助记符、符号地址、标号和伪指令等来书写程序号和伪指令等来书写程序 一、汇编语言源程序的结构一、汇编语言源程序的结构一个完整的汇编语言源程序通常由若干个逻一个完整的汇编语言源程序通常由若干个逻辑段辑段(SEGMENT)组成,包括代码段、数据组成,包括代码段、数据段、附加段和堆栈段,它们分别映射到存段、附加段和堆栈段,它们分别映射到存储器中的物理段上储器中的物理段上 例例4-1 两个字(两个字(A6B8H,206DH)相加相加的完整的汇编语言程序的完整的

2、汇编语言程序 DATA SEGMENT ;定义数据段定义数据段DATA1DW 0A6B8H ;定义被加数定义被加数DATA2 DW 206DH ;定义加数定义加数SUM DW 2 DUP(?);定义和定义和 DATAENDS ;数据段结束数据段结束CODESEGMENT ;定义代码段定义代码段ASSEME CS:CODE,DS:DATA;段寄存器说明段寄存器说明 START:MOVAX,DATAMOVDS,AX ;初始化初始化DSLEA SI,SUM ;存放结果的偏移地址送存放结果的偏移地址送SIMOVAX,DATA1 ;取被加数取被加数ADDAX,DATA2 ;两数相加两数相加MOVSI,A

3、X ;和送入和送入SUMMOV AH,4CH INT21H ;返回返回DOSCODEENDS ;代码段结束代码段结束ENDSTART ;源程序结束源程序结束 二、汇编语言语句类型及格式二、汇编语言语句类型及格式指令性语句的格式:指令性语句的格式:标号标号:前缀前缀 操作码操作码 操作数操作数,操作数操作数 ;注释注释 例如指令性语句:例如指令性语句:START:MOV AX,DATA ;将立即数将立即数DATA送累加器送累加器AX指示性语句的格式:指示性语句的格式:名字名字 伪操作伪操作 操作数操作数,操作数操作数,;注释注释 例如指示性语句:例如指示性语句:DATA1 DB 56H,78H,

4、9AH ;定义字节型数据,定义字节型数据,“DB”是伪操作是伪操作 指令性语句与指示性语句在格式上的区别指令性语句与指示性语句在格式上的区别:指令性语句中的指令性语句中的“标号标号”表示指令的符号地址,表示指令的符号地址,其后面通常要加上其后面通常要加上“:”。指示性语句中的指示性语句中的“名字名字”通常表示变量名、段名和通常表示变量名、段名和过程名等,其后不加过程名等,其后不加“:”。名字在多数情况下表。名字在多数情况下表示的是变量名,用来表示存储器中一个数据区的示的是变量名,用来表示存储器中一个数据区的地址。地址。指令性语句中的操作数最多为两个操作数,也可指令性语句中的操作数最多为两个操作

5、数,也可以没有操作数。以没有操作数。而指示性语句中的操作数可根据需要有多个,当操而指示性语句中的操作数可根据需要有多个,当操作数有不止一个时,相互之间用逗号隔开。作数有不止一个时,相互之间用逗号隔开。汇编语言语句中的操作数汇编语言语句中的操作数 三、数据项及表达式三、数据项及表达式操作数可以是寄存器、存储器单元或数据项。操作数可以是寄存器、存储器单元或数据项。而数据项又可以是常量、标号、变量和表达式而数据项又可以是常量、标号、变量和表达式 1常量常量 二进制常量二进制常量 十进制常量十进制常量 十六进制常量十六进制常量 字符串常量字符串常量 2标号标号 指令的标号是由编程者确定的,它不能与指令

6、的标号是由编程者确定的,它不能与指令助记符或伪指令重名,也不允许由数指令助记符或伪指令重名,也不允许由数字开头,标号的字符个数不超过字开头,标号的字符个数不超过31个。个。指令性语句中的标号指令性语句中的标号代表存放一条指令的代表存放一条指令的存储单元的符号地址存储单元的符号地址,其后通常加一个冒,其后通常加一个冒号。号。标号具有标号具有3种属性:种属性:段、偏移量和类型段、偏移量和类型。标号的段属性是就是标号所在段的段地址。标号的段属性是就是标号所在段的段地址。标号的偏移量就是标号所在段的起始地址到定义标号的偏移量就是标号所在段的起始地址到定义该标号的地址之间的字节数(即偏移地址)。偏该标号

7、的地址之间的字节数(即偏移地址)。偏移量是一个移量是一个16位无符号数。位无符号数。标号的类型有标号的类型有NEAR和和FAR两种。前一种标号称两种。前一种标号称为近标号,只能在段内被引用,地址指针为为近标号,只能在段内被引用,地址指针为2个字个字节。后一种标号称为远标号,可以在其他段被引节。后一种标号称为远标号,可以在其他段被引用,地址指针为用,地址指针为4个字节。个字节。3变量变量 变量名由字母开头,长度不超过变量名由字母开头,长度不超过31个字符。个字符。变量是存储变量是存储器中某个数据区的名字器中某个数据区的名字,因为数据区中的内容是可以改,因为数据区中的内容是可以改变的,因此变量的值

8、也可以改变。变的,因此变量的值也可以改变。变量在指令中可以作变量在指令中可以作为存储器操作数引用为存储器操作数引用。变量也具有变量也具有3种属性,即:段、偏移量和类型。种属性,即:段、偏移量和类型。变量的段属性就是它所在段的段地址。因为变量一般在存储器的数据变量的段属性就是它所在段的段地址。因为变量一般在存储器的数据段或附加段中,所以变量的段值在段或附加段中,所以变量的段值在DS或或ES寄存器中。寄存器中。变量的偏移量属性是该变量所在段的起始地址到变量地址之间的字节变量的偏移量属性是该变量所在段的起始地址到变量地址之间的字节数。数。变量的类型有变量的类型有BYTE(字节字节)、WORD(字字)

9、、DWORD(双字双字)、QWORD(四字四字)、TBYTE(十个字节十个字节)等,表示数据区中存取操作对等,表示数据区中存取操作对象的大小。象的大小。使用变量时需注意以下两点:使用变量时需注意以下两点:变量的类型与指令的要求要相符。例如指令变量的类型与指令的要求要相符。例如指令MOV AX,VAR中,要求中,要求VAR必须定义为字类型变必须定义为字类型变量。量。在定义变量时,在定义变量时,变量名对应的是数据区的首地址变量名对应的是数据区的首地址。如果数据区中有多个数据,则对其他数据操作时,如果数据区中有多个数据,则对其他数据操作时,需修改地址。例如:需修改地址。例如:BUFFER DB 56

10、H,78H,9AH MOVAL,BUFFER+2 ;将将9AH送送(AL)4表达式表达式表达式是由常数、操作数、操作符和运算符组合而成表达式是由常数、操作数、操作符和运算符组合而成 表达式中常用的运算符有以下几种:表达式中常用的运算符有以下几种:算术运算符算术运算符算术运算符有算术运算符有(加加)、(减减)、*(乘乘)、/(除除)、MOD(取余取余)等等 逻辑运算符逻辑运算符逻辑运算符包括逻辑运算符包括AND(与与)、OR(或或)、NOT(非非)、XOR(异异或或)例如:指令例如:指令MOV AL,0A6H XOR 0CEH等价于等价于MOV AL,68H 关系运算符关系运算符关系运算符包括关

11、系运算符包括EQ(等于等于)、NE(不等于不等于)、LT(小小于于)、GT(大于大于)、LE(小于等于小于等于)、GE(大于等于大于等于)。关系运算符连接的必须是两个数值,或同一段中的关系运算符连接的必须是两个数值,或同一段中的两个存储单元地址。关系运算符的运算结果是一两个存储单元地址。关系运算符的运算结果是一个逻辑值,当关系不成立(为假)时,结果为个逻辑值,当关系不成立(为假)时,结果为0;当关系成立(为真)时,结果为当关系成立(为真)时,结果为0FFFFH 取值运算符取值运算符取值运算符用来分析一个存储器操作数的属性取值运算符用来分析一个存储器操作数的属性 OFFSET利用运算符利用运算符

12、OFFSET可以得到一个标号或变量的偏移地址可以得到一个标号或变量的偏移地址。例如:。例如:MOV SI,OFFSET DATA1 ;将变量将变量DATA1的偏移地址送的偏移地址送SI该指令等同于以下指令:该指令等同于以下指令:LEA SI,DATA1 SEG利用运算符利用运算符SEG可以得到一个标号或变量的段地址可以得到一个标号或变量的段地址。例如:。例如:MOV AX,SEG DATA ;将变量将变量DATA的段地址送的段地址送AX MOV DS,AX ;(DS)(AX)属性运算符属性运算符属性运算符属性运算符PTR用来指定其后的存储器操作数的类型。用来指定其后的存储器操作数的类型。例如:

13、例如:MOV AX,WORD PTRSI ;将将SI和和SI+1所指所指向的两个存储单元送向的两个存储单元送AX 段超越运算符段超越运算符运算符运算符“:”跟在某个段寄存器名(跟在某个段寄存器名(DS、ES、SS或或CS)之之后表示段超越,用来指定一个存储器操作数的段属性。后表示段超越,用来指定一个存储器操作数的段属性。例如:例如:MOV AX,ES:BX ;将将ES段中由段中由BX指向的字指向的字操作数送操作数送(AX)第二节第二节 伪指令伪指令 一、数据定义伪指令一、数据定义伪指令数据定义伪指令用来定义一个变量的类型,给存储数据定义伪指令用来定义一个变量的类型,给存储器赋初值,或给变量分配

14、存储空间器赋初值,或给变量分配存储空间 1定义字节定义字节(DB)DB(Define Byte)用来定义一个变量,并初始化其内存单元。用来定义一个变量,并初始化其内存单元。格式:格式:变量名变量名 DB 表达式表达式表达式可以是以下情况之一:表达式可以是以下情况之一:一个常数表达式;一个常数表达式;问号问号(?)作为非确定的初始值;作为非确定的初始值;一个或多个字符的字符串;一个或多个字符的字符串;重复子句:重复子句:重复次数重复次数 DUP(表达式表达式)例如:例如:DATA1 DB 11H,22H,33,44H,55H ;定义了定义了5个字节常个字节常数数 STRING1 DB A ;定义

15、了一个字符定义了一个字符 STRING2 DB How Are You?;定义了一个字符串定义了一个字符串SUMDB?;预置了一个不确定的值(变量)预置了一个不确定的值(变量)BUFFER DB 10 DUP(?);预置了预置了10个具有不确定值的单个具有不确定值的单元元 2定义字定义字(DW)DW(Define Word)定义一个字(两个单元)。定义一个字(两个单元)。DW伪操作后面的每个操作数都占用两个字节,伪操作后面的每个操作数都占用两个字节,在内存中存放时,低字节在前,高字节在后。在内存中存放时,低字节在前,高字节在后。DW的格式和表达式与的格式和表达式与DB类似。例如:类似。例如:D

16、ATA2 DW 1234H,5678H,9ABCH BUFFERDW 50 DUP(?)数据定义伪指令还有数据定义伪指令还有DD、DQ、DT 二、符号定义伪指令二、符号定义伪指令符号定义伪指令符号定义伪指令EQU用于给一个表达式赋予一个名用于给一个表达式赋予一个名字。字。以后在程序中凡是用到该表达式的时候,就以后在程序中凡是用到该表达式的时候,就用这个名字来代替;在需要修改该表达式的值时,用这个名字来代替;在需要修改该表达式的值时,只需在赋予名字的地方修改即可。其格式为:只需在赋予名字的地方修改即可。其格式为:名字名字 EQU 表达式表达式格式中的表达式可以是一个常数、符号、数值表达格式中的表

17、达式可以是一个常数、符号、数值表达式、地址表达式,甚至可以是指令助记符。式、地址表达式,甚至可以是指令助记符。例如:例如:COUNT EQU 100 ;常量常量 VAREQU 64*1024 ;数值表达式数值表达式 ADDR EQU DS:BP+8 ;地址表达式地址表达式 GOTO EQU JMP ;指令助记符指令助记符 EQU指令不能对同一个符号重复定义。若希望对同一个符号指令不能对同一个符号重复定义。若希望对同一个符号重复定义,可以用重复定义,可以用“”伪指令。例如:伪指令。例如:EMP=60H ;EMP代表数值代表数值60H EMP=80H ;在此将在此将EMP重新赋值,重新赋值,EMP

18、代表数值代表数值80H 三、段定义伪指令三、段定义伪指令段定义语句可使编程者按段组织程序和使用存储器。段段定义语句可使编程者按段组织程序和使用存储器。段定义伪指令有定义伪指令有SEGMENT和和ENDS 段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别类别 段名段名 ENDS 1定位类型:表示此段的起始边界要求,可以是定位类型:表示此段的起始边界要求,可以是PAGE,PARA,WORD和和BYTE。它们表示如下的地址要求:它们表示如下的地址要求:PAGE=BPARA=B(隐含值)WORD=BBYTE=B分别称它们为以页、节、字、字节为边界。若该项省略,分别称它们为以页、节、字

19、、字节为边界。若该项省略,则其默认值位则其默认值位PARA。2组合类型:用来告诉连接程序本段与其他段的关系,分组合类型:用来告诉连接程序本段与其他段的关系,分别为别为NONE,PUBLIC,COMMON,AT表达式以及表达式以及STACK和和MEMORY。四、设定段寄存器伪指令四、设定段寄存器伪指令伪指令伪指令ASSUME告诉汇编程序一个段属于哪个段寄告诉汇编程序一个段属于哪个段寄存器。存器。当汇编程序遇到一个段名时,它就自动地当汇编程序遇到一个段名时,它就自动地引用给出的段寄存器将段名加以汇编。引用给出的段寄存器将段名加以汇编。格式为:格式为:ASSUME 段寄存器名段寄存器名:段名段名,段

20、寄存器名段寄存器名:段名段名,格式中的段寄存器名可以是格式中的段寄存器名可以是CS、DS、ES或或SS。在一个源程序中,在一个源程序中,ASSUME伪指令要放在可执行程序开始位伪指令要放在可执行程序开始位置的前面。置的前面。例如,以下程序是一个完整代码段的定义方法。例如,以下程序是一个完整代码段的定义方法。CODESEGMENT PARA PUBLIC CODEASSUME CS:CODE,DS:DATA,ES:EDATA,SS:STACKMOVAX,DATAMOVDS,AXMOVAX,EDATAMOVES,AXMOVAX,STACKMOVSS,AX CODEENDS 五、过程定义伪指令五、过

21、程定义伪指令过程就是子程序。过程就是子程序。调用过程和从过程返回的指令是调用过程和从过程返回的指令是CALL和和RET。过程定义伪指令的格式为:过程定义伪指令的格式为:过程名过程名PROC NEAR/FARRET过程名过程名ENDP例例4-2 编写一个软件延时的子程序编写一个软件延时的子程序。DELAYPROC ;定义一个过程定义一个过程PUSH BX ;保护保护BX原来的内容原来的内容PUSH CX ;保护保护CX原来的内容原来的内容MOV BL,50 ;外循环次数外循环次数NEXT:MOV CX,2000 ;内循环次数内循环次数WAITS:LOOP WAITS ;(CX)0则循环则循环DE

22、CBL ;修改外循环计数值修改外循环计数值JNZNEXT ;(BX)0则继续外循环则继续外循环POPCX ;恢复恢复CX原来的内容原来的内容POPBX ;恢复恢复BX原来的内容原来的内容RET ;过程返回过程返回DELAYENDP ;过程结束过程结束 六、结束伪指令六、结束伪指令END伪指令表示程序到此为止,告诉汇编程伪指令表示程序到此为止,告诉汇编程序汇编任务到此结束。其格式为:序汇编任务到此结束。其格式为:END 标号标号END伪操作后面的标号表示程序的开始地址。伪操作后面的标号表示程序的开始地址。第三节第三节 DOS功能调用功能调用 所有的所有的DOS系统功能调用都是利用软中断指令系统功

23、能调用都是利用软中断指令INT 21H来实现的。来实现的。INT 21H是一个具有是一个具有90多个子多个子功能的中断服务程序,这些子功能大致可分为设功能的中断服务程序,这些子功能大致可分为设备管理、目录管理、文件管理和其他等四个方面。备管理、目录管理、文件管理和其他等四个方面。INT 21H对每一个子功能都进行了编号称为功对每一个子功能都进行了编号称为功能号。能号。DOS系统功能调用的方法为:系统功能调用的方法为:AH功能号;功能号;在其他寄存器中放入该功能所要求的入口参数;在其他寄存器中放入该功能所要求的入口参数;INT 21H;INT 21H的几个最常用的功能的几个最常用的功能 1键盘输

24、入单字符键盘输入单字符功能号功能号1和功能号和功能号8都可以接收键盘输入的单字符,都可以接收键盘输入的单字符,输入的字符以输入的字符以ASCII码的形式放在累加器码的形式放在累加器AL中。中。其中其中1号功能有回显,即键盘输入的内容在放入累号功能有回显,即键盘输入的内容在放入累加器加器AL的同时,在显示其上也显示出来;的同时,在显示其上也显示出来;8号功号功能无回显。能无回显。键盘输入单字符的键盘输入单字符的功能功能常用来回答程序中的提示信常用来回答程序中的提示信息,或选择菜单中的可选项以执行不同的程序段息,或选择菜单中的可选项以执行不同的程序段。例4-3 从键盘输入“Y”或“N”来选择程序的

25、走向 SECLE:MOV AH,01H INT21H CMP AL,Y JEYES CMP AL,N JENOJMPSECLEYES:NO:2键盘输入字符串键盘输入字符串键盘输入字符串通过键盘输入字符串通过0AH号功能来实现。该功能要求用号功能来实现。该功能要求用户定义一个输入缓冲区来存放输入的字符串户定义一个输入缓冲区来存放输入的字符串 在调用本功能前,应把键入缓冲区的起始地址预置入在调用本功能前,应把键入缓冲区的起始地址预置入DX寄存器。寄存器。例例4-4 从键盘上输入字符串从键盘上输入字符串HOW ARE YOU?,并在串尾加结束标志并在串尾加结束标志$。DATA SEGMENTSTRI

26、NGDB 20,?,20 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA DX,STRING MOV AH,0AH INT21H MOV CL,STRING+1 XOR CH,CH ADD CX,2ADD DX,CX MOV BX,DXMOV BYTE PTRBX,$MOV AH,4CH INT 21HCODE ENDS END START 3显示器显示单字符显示器显示单字符 2号功能用于在显示器上显示单个字符。其程序段如下:号功能用于在显示器上显示单个字符。其程序段如下:MOV

27、DL,;待显示字符的待显示字符的ASCII码必须放在码必须放在DL中中MOV AH,02H ;功能号功能号02HAHINT21H ;执行系统功能调用执行系统功能调用 4显示器显示字符串显示器显示字符串9号功能用于在显示器上显示一个字符串,要求被显示的字号功能用于在显示器上显示一个字符串,要求被显示的字符串必须以符串必须以“”字符作为结束符,否则会引起屏幕混字符作为结束符,否则会引起屏幕混乱。显示时如果希望光标能自动换行,则应在字符串结乱。显示时如果希望光标能自动换行,则应在字符串结束前加上回车及换行的束前加上回车及换行的ASCII码码0DH和和0AH MOV DX,;要显示字符串的首地址送要显

28、示字符串的首地址送DXMOV AH,09H ;功能号功能号09HAHINT21H ;执行系统功能调用执行系统功能调用例例4-5 在数据段内定义两句话:在数据段内定义两句话:“PRESS ANY KEY IN THE KEYBOARD.”,“THE RESULT WILL DISPLAY IN SCREEN”。将这两句话在屏幕上分两行显示出来将这两句话在屏幕上分两行显示出来 DATA SEGMENTSTRING DB PRESS ANY KEY IN THE KEYBOARD.,0DH,0AH DB THE RESULT WILL DISPLAY IN SCREEN.,0DH,0AH,$DATA

29、 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVDX,OFFSET STRING MOVAH,09H INT21H MOVAH,4CH ;返回返回DOS INT 21H CODEENDS END START 5.返回返回DOS一个程序执行完后,应使程序正常退出并返一个程序执行完后,应使程序正常退出并返回到回到DOS,可使用可使用DOS系统功能调用的系统功能调用的4CH号功能。号功能。用用4CH号功能返回号功能返回DOS的程序段如下;的程序段如下;MOV AH,4CH ;功能号送功能号送AH INT21H

30、;返回返回DOS第四节第四节 汇编语言程序设计基础汇编语言程序设计基础设计汇编语言源程序的基本步骤为:设计汇编语言源程序的基本步骤为:分析实际问题,并抽象出描述问题的数学模型,分析实际问题,并抽象出描述问题的数学模型,确定解决问题的算法与思路;确定解决问题的算法与思路;画程序流程图(简单程序可省略此步);画程序流程图(简单程序可省略此步);为数据和程序代码分配内存单元和寄存器;为数据和程序代码分配内存单元和寄存器;编写源程序;编写源程序;上机调试与修改,进行结果分析。上机调试与修改,进行结果分析。在进行汇编语言源程序设计时,通常用到四种基本在进行汇编语言源程序设计时,通常用到四种基本程序结构:

31、顺序程序、分支程序、循环程序、子程序结构:顺序程序、分支程序、循环程序、子程序。程序。1顺序程序顺序程序顺序程序是最常见、最基本的程序结构,其特点顺序程序是最常见、最基本的程序结构,其特点是程序顺序地执行,无分支,无循环与转移。是程序顺序地执行,无分支,无循环与转移。CPU按照指令的排列顺序逐条执行。按照指令的排列顺序逐条执行。例例4-6 内存中自内存中自TABLE开始存放开始存放09的平方值,的平方值,通过人机对话方式,对任意输入的数通过人机对话方式,对任意输入的数x(09),),查表得到查表得到x的平方值,将其放在的平方值,将其放在AL中。中。DATA SEGMENTTABLEDB 0,1

32、,4,9,16,25,36,49,64,91BUFDB PLEASE INPUT ONE NUMBER(09):,0DH,0AH,$DATA ENDSSTACKSEGMENT PARA STACK STACKDB 100 DUP(?)STACKENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVBX,OFFSET TABLE ;TABLE的偏移地址送的偏移地址送BX MOVDX,OFFSET BUF ;9号功能调用,显示字符串号功能调用,显示字符串MOVAH,

33、09H ;提示输入一个数提示输入一个数INT 21HMOVAH,01H ;1号功能调用,键入数送号功能调用,键入数送ALINT21HMOVAH,0 ;AH清零清零ANDAL,0FH ;屏蔽高屏蔽高4位位ADDBX,AX ;得到输入数的平方在表中的地址得到输入数的平方在表中的地址MOVAL,BX ;输入数的平方送输入数的平方送ALMOVAH,4CH ;返回返回DOSINT21HCODE ENDSENDSTART 2分支程序分支程序除最基本的顺序程序外,经常会碰到根据不同的除最基本的顺序程序外,经常会碰到根据不同的条件而转移到不同程序段去执行的各种分支程序。条件而转移到不同程序段去执行的各种分支程

34、序。分支结构程序通常采用条件转移指令来实现。分支结构程序通常采用条件转移指令来实现。例例4-7 变量变量x的符号函数如下所示:的符号函数如下所示:1 当当x0 y=0 当当x=0 1 当当x0转转PLUSMOVBX,0FFFFH ;x0令令bx=1JMPDONEZERO:MOVBX,0JMPDONEPLUS:MOVBX,1DONE:MOVy,BX ;存放结果存放结果 MOVAH,4CH ;返回返回DOSINT21HCODEENDS ENDSTART 3循环程序循环程序凡是程序中需要重复做的工作,都可以用循环结构凡是程序中需要重复做的工作,都可以用循环结构程序来实现。包括以下四个部分:程序来实现

35、。包括以下四个部分:初始化:初始化:为循环作准备,设置循环计数值,设置为循环作准备,设置循环计数值,设置变量初值。变量初值。循环体:循环体:循环部分的核心,包括循环的全部指令。循环部分的核心,包括循环的全部指令。修改参数:修改参数:修改操作数地址,为下次循环作准备。修改操作数地址,为下次循环作准备。循环控制:循环控制:修改计数器值,判断循环控制条件,修改计数器值,判断循环控制条件,决定是否跳出循环。决定是否跳出循环。例例4-8例例4-8 把从把从TABLE单元开始的单元开始的100个个16位无符位无符号数按从大到小的顺序排列。号数按从大到小的顺序排列。本题是一个排序问题。因为是无符号数的比较,

36、本题是一个排序问题。因为是无符号数的比较,所以可直接用所以可直接用比较指令比较指令CMP和和条件转移指令条件转移指令JNC来实现。来实现。本题用双重循环。先使第一个数与下一个数比本题用双重循环。先使第一个数与下一个数比较,若大于则其位置不变,若小于则使两数交较,若大于则其位置不变,若小于则使两数交换位置。换位置。以上完成了一次排序工作。再通过第二重的以上完成了一次排序工作。再通过第二重的99次循环,即可实现次循环,即可实现100个无符号数的大小排序。个无符号数的大小排序。DATA SEGMENT TABLEDW 100 DUP(?)DATA ENDS CODE SEGMENT ASSUME C

37、S:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEADI,TABLE ;DI指向要排序的数的首址指向要排序的数的首址 MOV BL,99 ;外循环需外循环需99次次 ;外循环从此开始外循环从此开始NEXT1:MOV SI,DI ;SI指向当前要比较的数指向当前要比较的数 MOV CL,BL ;CL为内循环计数器,循环次数每次少为内循环计数器,循环次数每次少1 ;以下为内循环以下为内循环NEXT2:MOV AX,SI ;取第一个数取第一个数Ni ADDSI,2 ;指向下一个数指向下一个数Nj CMP AX,SI ;NiNj?JNCNEXT3 ;若大于,则不

38、交换若大于,则不交换 MOVDX,SI ;否则,交换否则,交换Ni和和Nj MOVSI-2,DX MOVSI,AXNEXT3:DECCL ;内循环结束?内循环结束?JNZNEXT2 ;若未结束,则继续若未结束,则继续;内循环到此结束内循环到此结束DEC BL ;外循环结束?外循环结束?JNZNEXT1 ;若未结束,则继续若未结束,则继续;外循环结束外循环结束MOVAH,4CH ;返回返回DOSINT21HCODEENDSENDSTART 4子程序子程序在使用子程序时应注意以下几点:在使用子程序时应注意以下几点:参数传递。参数传递可通过寄存器、存储器、堆栈等方参数传递。参数传递可通过寄存器、存储

39、器、堆栈等方式进行。式进行。相应寄存器内容的保护与恢复。为保护调用程序中寄存相应寄存器内容的保护与恢复。为保护调用程序中寄存器的内容,在子程序的入口处,将子程序中将要用到寄器的内容,在子程序的入口处,将子程序中将要用到寄存器的原来的内容压入堆栈保存;在子程序结束之前,存器的原来的内容压入堆栈保存;在子程序结束之前,将压入堆栈寄存器的原来内容恢复出来。将压入堆栈寄存器的原来内容恢复出来。子程序嵌套。每一个子程序都包括在过程定义伪指令子程序嵌套。每一个子程序都包括在过程定义伪指令PROCENDP中间。中间。与子程序调用有关的与子程序调用有关的CPU指令为指令为CALL和和RET。例例4-9 某一外

40、设的某一外设的状态端口为状态端口为0378H,数据端数据端口为口为03F8H。当状态端口的第当状态端口的第1位位(Bit1)为为0时,时,表示外设忙;为表示外设忙;为1则表示外设可以接收数据。编则表示外设可以接收数据。编写一个子程序,将当前段中从写一个子程序,将当前段中从BUFFER开始的连开始的连续续100个字节的内容个字节的内容从数据端口输出从数据端口输出到外设。到外设。通过接口向外设输出数据时,要判断外设是否处通过接口向外设输出数据时,要判断外设是否处于忙的状态,只有外设不忙时,才能进行输出。于忙的状态,只有外设不忙时,才能进行输出。SENDATAPROCFAR ;定义为远过程定义为远过

41、程PUSH AX ;保护子程序中用到寄存器的原来内容保护子程序中用到寄存器的原来内容PUSHDX PUSHSIPUSHCXLEASI,BUFFER ;数据的起始地址送数据的起始地址送SIMOVCL,100 ;要输出的字节数要输出的字节数AGAIN:MOVDX,0378H ;I/O状态端口状态端口WAITING:INAL,DX ;读入读入I/O状态端口状态端口TESTAL,02H ;外设忙?外设忙?(测试测试Bit1)JZWAITING ;若外设忙若外设忙(Bit1=0),则循环等待则循环等待MOVAL,SI ;否则,取一个数准备输出否则,取一个数准备输出MOVDX,03F8H ;I/O数据端口

42、数据端口OUTDX,AL ;输出一个字节输出一个字节INCSI ;指向下一个字节指向下一个字节DECCL ;计数器减计数器减1JNZAGAIN ;若未输出完,则循环若未输出完,则循环POPCX ;恢复寄存器原来的内容恢复寄存器原来的内容POPSIPOPDXPOPAXRET ;返回主程序返回主程序SENDATAENDP ;过程定义结束过程定义结束 在主程序中调用这个子程序的语句为:在主程序中调用这个子程序的语句为:MOVAX,DATAMOVDS,AXCALLSENDATA第五节第五节 常见程序设计举例常见程序设计举例 例例4-10 统计一个数据区中负数的个数。统计一个数据区中负数的个数。DATA

43、SEGMENTMEMDB 1,0,1,55,100,23,2,10 ;带符号数带符号数 DB 36,1,2,0,125,101,66,99LENEQU$MEM ;数的个数数的个数RESULTDW?;存放结果存放结果DATAENDSSTACK SEGMENT PARA STACKDW 100 DUP(?)STACK ENDSCODE SEGMENTASSEME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOVDS,AXMOVAX,STACKMOCSS,AX MOVBX,OFFSET MEMMOVCX,LENMOVDX,0 ;结果的初值结果的初值AGAIN:

44、MOV AL,BXCMPAL,0JGEDOINCDXDO:INCBXLOOPAGAINMOVRESULT,DX ;负数的个数送负数的个数送RESULTMOVAH,4CH ;返回返回DOSINT21HCODE ENDSENDSTART 例例4-11 把用把用ASCII码形式表示的数转换为二进制码。码形式表示的数转换为二进制码。ASCII码存放在以码存放在以MASC为首地址的存储单元中,转为首地址的存储单元中,转换结果放在换结果放在MBIN。分析:分析:通常从键盘上输入的数都是以通常从键盘上输入的数都是以ASCII码的形式存放码的形式存放在内存中的。另外数据区中以字符形式定义的数(用在内存中的。另

45、外数据区中以字符形式定义的数(用单引号括起来的数),在内存中也是以其对应的单引号括起来的数),在内存中也是以其对应的ASCII码存放的。码存放的。对对16进制数来说,进制数来说,09的的ASCII码分别为码分别为30H39H。所以对这十个数,只需将其所以对这十个数,只需将其ASCII码减去码减去30H,就可得到对应的二进制数。就可得到对应的二进制数。AF的的ASCII码分别为码分别为41H46H,所以要减去所以要减去37H。若取的数不在若取的数不在0FH范围内,则出错。范围内,则出错。DATASEGMENTMASC DB 6,3,B,2 ;要转换的要转换的ASCII码码MBIN DB 2 DU

46、P(?)DATAENDSCODE SEGMENTASSEMU CS:CODE,DS:DATABEGIN:MOVAX,DATAMOVDS,AXMOVCL,4 ;循环次数送循环次数送CLMOVCH,CL ;保存循环次数保存循环次数LEASI,MASC ;ASCII码单元首地址送码单元首地址送SICLD ;按地址增量方向按地址增量方向XORAX,AX ;中间结果清零中间结果清零XORDX,DX NEXT1:LODS MASC ;装入一个装入一个ASCII码到码到ALAND AL,7FH ;得到得到7位位ASCII码码CMP AL,0JLERROR ;若若(AL)9,则转则转NEXT2SUBAL,30

47、H ;若为数字若为数字09,则转换为二进制数,则转换为二进制数JMPNEXT3NEXT2:CMP AL,AJLERROR ;若若(AL)F,则转则转ERRORSUBAL,37H ;若为数字若为数字AF,则转换为二进制数则转换为二进制数 NEXT3:ORDL,AL ;一个数的转换结果送一个数的转换结果送DLRORDX,CL ;整个转换结果在整个转换结果在(DX)中依次存放中依次存放DECCHJNZNEXT1 ;未转换完则转未转换完则转NEXT1MOVWORD PTR MBIN,DX ;最后结果送最后结果送MBINMOVAH,4CH ;返回返回DOSINT21HCODE ENDSENDBEGIN例

48、例4-12 把在内存变量把在内存变量NUMBER中的中的16位二进制数的每一位转换位二进制数的每一位转换为相应的为相应的ASCII码,并且存入串变量码,并且存入串变量STRING中。中。DATA SEGMENTNUMBERDW 5E8AHSTRINGDB 16 DUP(?)DATA ENDSSTACKSEGMENT PARA STACK STACKDB 100 DUP(?)STACKENDSCODESEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AX LEADI,ST

49、RINGMOV CX,16PUSH DIPUSH CXMOV AL,30H ;使缓冲区全置为使缓冲区全置为0REPSTOSB POPCXPOPDIMOVAL,31HMOVBX,NUMBER AGAIN:RCLBX,1 ;左移左移BX,相应位进入相应位进入CF标志标志 JNCNEXT ;若为零则转至若为零则转至NEXT MOV DI,AL ;若为若为“1”,则把,则把“1”置入置入缓冲区缓冲区NEXT:INC DI LOOP AGAIN MOV AH,4CH ;返回返回DOS INT 21HCODEENDSENDSTART 例例4-13 在键盘上输入一个字符串,并在内存中已有的一在键盘上输入一个

50、字符串,并在内存中已有的一张表中查找该字符串,若找到则在屏幕上显示张表中查找该字符串,若找到则在屏幕上显示“OK!”,否则显示否则显示“NO!”,若输入字符长度大于表长度,则显示若输入字符长度大于表长度,则显示“WRONG!”。分析:分析:在查找前,首先要判断输入字符串的长度是否大于已有表在查找前,首先要判断输入字符串的长度是否大于已有表的 长 度。若 大 于 则 表 示 输 入 的 字 符 串 太 长,显 示的 长 度。若 大 于 则 表 示 输 入 的 字 符 串 太 长,显 示“WRONG!”。否则才能进行比较。否则才能进行比较。先在表中查找字符串的第一个字符,若找到,再比较字符先在表中

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

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

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


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

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


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