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

下载本文档

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

文档简介

第5章汇编语言程序设计5.1汇编语言程序格式5.5汇编语言设计5.4DOS功能调用5.3汇编语言的编写5.2常用伪指令教学重点

本章介绍程序结构、伪指令、DOS功能调用。重点:汇编语言程序的基本结构;伪指令及其使用方法;

DOS功能调用;基本的汇编语言程序设计方法。难点:DOS功能调用的应用汇编语言程序的设计精品资料你怎么称呼老师?如果老师最后没有总结一节课的重点的难点,你是否会认为老师的教学方法需要改进?你所经历的课堂,是讲座式还是讨论式?教师的教鞭“不怕太阳晒,也不怕那风雨狂,只怕先生骂我笨,没有学问无颜见爹娘……”“太阳当空照,花儿对我笑,小鸟说早早早……”5.1汇编语言程序格式5.1.1程序结构5.1.2汇编语言语句格式5.1.3汇编语言数据表示1、汇编语言的分段结构:汇编语言源程序数据段(DATA)作用:存放程序运行所需要的数据和运行结果堆栈段(STACK)作用:执行数据的压栈和弹栈操作,以及程序中的数据保护代码段(CODE)作用:存放所编写的程序的代码5.1.1程序结构用开始语句“SEGMENT”和结束语句“ENDS”来定义一个段2、语句类型语句类型指令语句作用:产生相应的机器代码,指定CPU做什么操作。伪指令语句作用:不产生相应的机器代码,仅控制汇编过程。宏指令语句作用:由编程者按照一定的规则来定义的一种较“宏大”的指令,包括多条指令或伪指令。5.1.1程序结构例题1

DATASEGMENT

;定义DATA段

BUF1DB34H;定义第一个数据

BUF2DB2AH;定义第二个数据

SUMDB?;定义数据和单元

DATAENDS

;DATA结束STACKSEGMENTPARASTACK‘STACK’

;定义STACK段

DW200DUP(0)STACKENDS;STACK段结束SEGMENT 数据段开始ENDS数据段结束数据段堆栈段例题1(续)CODESEGMENT;定义CODE段ASSUMECS:CODE,DS:DATA,SS:STACK

;段分配START:MOVAX,DATAMOVDS,AX;填装数据段寄存器DSMOVAL,BUF1;取第一个加数

ADDAL,BUF2;和第二个加数相加

MOVSUM,ALMOVAH,4CHINT21H;返回DOS状态CODEENDS;CODE段结束

ENDSTART;整个源程序结束代码段;example2.asm(文件名)stack

segment

stack

;定义堆栈段

dw512dup(?) ;堆栈段有512字空间stack ends

;堆栈段结束data segment

;定义数据段string db’Hello,Everybody!’,0dh,0ah,’$’data endscode segment’code’ ;定义代码段

assumecs:code,ds:data,ss:stack例题2start: movax,data

;建立DS段地址

movds,axmovdx,offsetstring movah,9 int21h movax,4c00h

int21h;利用功能调用返回DOScode ends

;代码段结束

endstart

;汇编结束,同时指明程序起始点例题2(续)指令语句伪指令语句定义符号、数据,分配内存单元,不产生机器代码[名字]操作码操作数[;注释]汇编时翻译成二进制机器代码[标号:]操作码[操作数,[操作数]][;注释]指令语句标号后有冒号“:”伪指令语句名字后没有冒号指令语句、伪指令语句

5.1.2汇编语言语句格式名字由字母开头。可由下列符号组成:(1)大小写英文字母(A~Z,a~z)(2)数字(0~9)(3)特殊符号(?、@、_等)命名规则:

(1)数字不能作为名字的第一个符号。

(2)单独的问号(?)不能作为名字。

(3)最大有效长度为31位。

(4)汇编语言中有特定含义的保留字(如操作码、寄存器名等),不能作为名字使用。

(5)见名知义。如用BUFFER表示缓冲区、SUM表示累加和等。5.1.2汇编语言语句格式标号的三种属性段属性偏移属性类型属性定义变量的段起始地址。标号偏移地址,从段起始地址到定义标号的位置之间字节数。指出该标号是在本段内引用还是在其他段中引用。段内引用属性为NEAR;段间引用属性为FAR。标号在代码段中定义。5.1.2汇编语言语句格式操作数:用来指定参与操作的数据。多于一个,之间用逗号分开。可以是常数或表达式。操作码与操作数例:MOVAX,BX5.1.2汇编语言语句格式操作码:指明操作的性质和功能,指令中的助记符都是操作码无操作数:一个操作数:两个操作数:伪指令、宏指令可有多个操作数:5.1.2汇编语言数据表示常量数值常量字符串常量

符号常数后缀:二进制B、八进制O或Q、十进制D、十六进制H。十进制数可省掉后缀十六进制数以A~F开头时,前面须加数字0字符串在计算机中以ASCII码存储。如‘A’的存储值是41H,‘AB’的存储值是41、42H等。用EQU或“=”定义的符号常量。如用COUNTEQU3或COUNT=3定义后,COUNT是一个符号常数,与数值3等价。变量段属性偏移属性类型属性定义变量的段起始地址变量所在段的段内偏移地址变量类型定义变量所占的字节数。如:BYTE(DB,1字节)、WORD(DW,2字节)、DWORD(DD,4字节)、QWORD(DQ,8字节)、TBYTE(DT,10字节)。5.1.2汇编语言数据表示运算符及表达式算术运算符逻辑运算符关系运算符分析运算符

+、—、*、/、MOD与数学运算符的意义相同。取模是取余数。例:82MOD16; 结果为220HMOD7; 结果为4

AND、OR、NOT、XOR

运算结果是一个常数.EQ、NE、LT、GT、LE、GE两个表达式比较时,表达式表示方法/性质要相同关系成立,结果为全1;不成立时,为全0例如:指令MOVBX,32EQ45等价于MOVBX,0;综合运算符

SEG、OFFSET、LENGTH、SIZE、TYPE把存储单元地址分解为段地址和偏移地址THIS、PTR

规定存储单元的性质5.1.2汇编语言数据表示常用伪指令等值伪指令等号伪指令解除定义伪指令定义变量伪指令定位伪指令5.2常用伪指令

格式〈符号名〉EQU〈表达式〉功能给符号名定义一个值、别的符号名、表达式或助记符。注

不能给一个符号重复定义与EQU类似,但在同一个程序中,=可以对一个符号重新定义。格式

PURGE〈符号1,2…N〉功能

解除指定符号的定义,解除后,可用EQU重新定义。例

Y1EQU7;Y1的值为7PURGEY1;解除Y1的定义DB字节变量,以字节为单位分配存储单元。DW字变量,以字为单位分配存储单元。DD定义双字,以4字节为单位分配存储单元。DQ

定义4字变量,以8字节为单位分配存储单元。DT

定义5字变量,以10字节为单位分配存储单元设置当前地址计数器的值例

DATASEGMENT

ORG10HBUFF1DW2000H

ORG20H

BUFF2DW4000HDATAENDS执行后BUFF1的偏移地址值为10H,BUFF2的为20H。段定义伪指令段分配伪指令ASSUME说明段寄存器和段名之间的对应关系例ASSUMECS:CODE,DS:DATA段定义伪指令格式:

段名SEGMENT[定位类型][组合方式][类别名]·····

;指令句或伪指令句

段名ENDS5.2常用伪指令

成对使用,指定段的名称、范围和段的定位类型、组合类型和分类名。成对出现,前后必须相同在同一模块中,不同段的段名不能相同作用规定段的起始地址四种类型的起始位置分别为(X表示可为0或1):(A)BYTEXXXXXXXXXXXXXXXXXXXXB(B)WORDXXXXXXXXXXXXXXXXXXX0B(C)PARAXXXXXXXXXXXXXXXX0000B(D)PAGEXXXXXXXXXXXX00000000B

以上分别表示以字节、字、节、页的边界为起始地址。如果缺省定位方式,则以节的边界为起始地址。作用指示连接程序,把同名的段按照指定的方式组合起来形成一个新的段。组合方式NONE、PUBLIC、STACK、 COMMON、MEMORY、AT典型格式:STACKSEGMENTPARASTACK‘STACK’类别名必须用单引号括起来连接程序把类别名相同的段放在连续的存储区域,先出现的段在前,后出现的在后,但对各段不能重新组合5.3汇编程序的编写

5.3.1段寄存器的填装5.3.2汇编语言程序的编写过程

1、DS、ES内容的填装例:CODESEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATA

MOVDS,AX

MOVES,AX

……

(DATA、STACK设置已省略。)5.3.1段寄存器的填装用MOV指令填装段寄存器DS、ES的值CODESEGMENT……DATAENDSSTACK1SEGMENTPARASTACK‘STACK’ DW200DUP(0)TOPLABELWORDSTACK1ENDSSTART:

……MOVAX,STACK1

MOVSS,AX

MOVSP,OFFSETTOP5.3.1段寄存器的填装设置定位类型:PARA组合类型:STACKSSSP的内容自动填充指令填装SP指令填装SS类似于DS、ES的填装2、SS段寄存器的填装

5.3.2汇编语言程序的编写过程1)用文本编辑器建立扩展名为.ASM源文件。

2)用MASM程序吧扩展名为.ASM的文件汇编成扩展名为.OBJ的文件。

3)用LINX程序把扩展名为.OBJ的文件连接成扩展名为.EXE的文件。

4)在DOS方式下直接键入文件名就可执行该程序。编辑程序DELINKTC编辑器WINDOWS文本编辑器EDIT汇编语言源程序的操作流程图源程序文件EXMP.ASMASMMASMTASM汇编程序出错文件EXMP.OBJ(EXMP.LST)(EXMP.CRF)LINK连接程序出错文件EXMP.EXE(EXMP.MAP)(EXMP.LIB)DEBUG出错5.3.2汇编语言程序的编写过程连接的是.OBJ文件执行的是.exe文件基本I/O系统BIOS主要功能:1.加电后的硬件测试程序;2.系统配置(如内存大小)的分析程序;3.显示器、打印机、键盘、异步通信和软驱的驱动程序;4.日、时钟控制程序;5.引导与装入程序。BIOS?DOS系统中设置了两层内部子程序可供用户使用:基本输入输出模块BIOSDOS层功能模块5.4DOS功能调用用途:方便高级用户通过软中断和功能调用在 MS-DOS较低层次上和操作系统打交道。BIOS的部分软中断调用指令及功能软中断调用指令INT10H供显示调用的BIOS功能INT13H供磁盘驱动器调用的BIOSINT14H供串行通信调用的BIOSINT16H供键盘输入调用的BIOSINT17H供打印机调用的BIOS5.4DOS功能调用BIOS的调用格格式MOVAH,nn1nn1为功能号,规定调用的功能INTnn2nn2为软中断调用的类型码,规定调用的类型EXAMPLE:设置显示器为80(列)×25(行)彩色方式MOVAL,03H;AL为入口参数,规定显示方式MOVAH,00H;00H为设置显示器的功能号INT10H;10H为供显示调用的类型码5.4DOS功能调用DOS系统功能调用(类型码:21H)为了使用方便,将DOS层功能模块所提供的100个子程序从00H~63H统一顺序编号,调用方法如下:1.设置入口参数2.将子程序编号送入AH寄存器3.执行中断指令 INT21H5.4DOS功能调用功能号 功能 入口参数出口参数00H程序终止 无 无01H键盘输入并回显 无AL=输入字符02H显示字符 DL=输出字符03H异步通信输入 AL=输入字符04H异步通信输出DL=输出字符05H 打印机输出 DL=输出字符06H 直接控制台I/O5.4DOS功能调用功能号功能入口参数出口参数07H 键盘输入无回显 AL=输入字符08H 同上但要检测Ctrl-Break

09H显示字符串 (见说明)0AH 字符串输入 (见说明)4CH

返回DOS操作系统

更详细情况可参见教材P333附录5.4DOS功能调用‘A’‘’‘B’‘O’‘Y’‘$’说明:①AH=09H为显示字符串功能。

例如,显示STRING中字符串:

STRINGDB‘ABOY’,’$’;

MOVDX,OFFSETSTRING;取STRING的偏移地址

MOVAH,09H;

INT21H;DS:DX输出缓冲区

结束字符BACK5.4DOS功能调用AH=0AH为从键盘输入字符串。入口参数:DS:DX=输入缓冲区地址,

[DS:DX]为输入缓冲区的总长;出口参数:[DS:DX+1]为输入字符串的实长(字符个数)DS:DX+0输入缓冲区

+1+2

输入字符说明:最大的实长=总长-1总长实长BACK5.4DOS功能调用DOS功能调用举例例从键盘输入字符串并回显

算法

a.显示‘Doyouwantinputastring? (Y/N)’,回车,换行,‘$’; (09H功能)

b.从键盘输入一个字符(Y/N), 若是‘y’或‘Y’则执行c,否则到g

结束;(01H功能)

c.显示‘Pleaseinputstring.’, 回车,换行,‘$’;(09H功能)5.4DOS功能调用

算法d.输入字符串到缓冲区;在缓冲区输入的字符串后加结束符‘$’;f.回显输入的字符串;g.结束。5.4DOS功能调用DOS功能调用举例例从键盘输入字符串并回显

算法例密码输入程序算法及流程图a.提示“PleaseInputYourPassword.”

b.用输入字符不回显方式一个一个输 入密码,每输入1位密位显示一个“*” 号;密位可以1~8位,不足8位时以 “回车”结束,满8位时自动结束。

c.比较输入的密码。5.4DOS功能调用

算法e.密码错误,显示“Wrong,Again!” 重新输入输入密码。d.密码正确,转操作程序(以显示 “OK!”结束)。

f.密码输入最多3次,3次均为错误 时显示“NO!”退出。5.4DOS功能调用例密码输入程序算法及流程图主程序BL←03HSI←BUFF1偏输入密码(SUB1)比较密码(SUB2)密码对?BL-1≠0?显示“NO!”显示“OK!”显示“Wrong,Again!”ENDLOPYYNNDONEAGAIN5.4DOS功能调用流程图SUB1DI←BUFF2偏CX←08H输入字符存字符是否回车?DI←DI+1显示‘*’号CX-1≠0?RET子程序1LOP1YNYDONE1N5.4DOS功能调用流程图SUB2DI←BUFF2偏CX←取密位比较1个字符DI←DI+1是否不相同?SI←SI+1AL←00HCX-1≠0?RET子程序2LOP2YNYDONE2NAL←0FFH5.4DOS功能调用流程图5.5.0汇编语言设计基础知识5.5.1顺序结构程序设计5.5.2分支结构程序设计5.5.3循环结构程序设计5.5.4子程序结构形式与操作5.5汇编程序设计一、汇编语言程序设计的一般步骤分析课题确定算法画流程图编写程序上机调试

当接到程序设计的任务后,首先对任务进行详尽的分析,搞清楚已知的数据和想要得到的结果,程序应该完成何种的功能。汇编语言设计的一般步骤一、汇编语言程序设计的一般步骤分析课题确定算法画流程图编写程序上机调试根据实际问题的要求和指令系统的特点,确定解决问题的具体步骤。根据任务要求,对不同的计算方法进行比较,选择最适宜的算法。汇编语言设计的一般步骤一、汇编语言程序设计的一般步骤分析课题确定算法画流程图编写程序上机调试将解决问题的具体步骤用一种约定的几何图形、指向线和必要的文字说明描述出来的图形。汇编语言设计的一般步骤一、汇编语言程序设计的一般步骤分析课题确定算法画流程图编写程序上机调试经过上述各步骤后,解决问题的思路已经非常清楚,所以接下来就可以按流程图的顺序对每一个功能框选用合适的指令编写出汇编语言程序。汇编语言设计的一般步骤一、汇编语言程序设计的一般步骤分析课题确定算法画流程图编写程序上机调试在应用程序的设计中,几乎没有一个程序只经过一次编写就完全成功的,所以必须经过上机调试。汇编语言设计的一般步骤1.流程图的概念 流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。2.流程图符号表示(1)开始框:表示程序的开始。开始流程图的画法规定条件NY结束(3)判断框

(2)处理框(执行框)

(4)结束框结构程序设计程序的每个部分都由有限结构结合中的单元组成,并且只有单一的入口和单一的出口。基本结构有:顺序结构(线性结构)选择结构(分支结构)循环结构三种结构可以任意组合和嵌套构成复杂的程序。程序的基本结构这三种结构可归纳为五种逻辑结构:(1)顺序结构(2)双分支结构……(3)多分支结构YN条件条件程序的基本结构YN(4)DO_UNTIL循环结构NY(5)DO_WHILE循环结构程序的逻辑结构格式程序的基本结构顺序程序:一种无分支的程序,

CPU从第一条指令开始依次执行每一条指令,直到最后一条指令。特点:指令顺序执行,无分支、无循环、无转移。拆字程序程序的基本结构例题开始设置数据段和堆栈段地址设置堆栈指针取数据截取高四位右移四位例:设内存DATA单元存放一个无符号字节数据,编制程序将其拆成两位十六进制数,并存入HEX和HEX+1单元的低4位,HEX存放高位十六进制数,HEX+1单元存放低位十六进制数解: 分析命题确定算法画流程图拆字程序取原数据结束保留高位十六进制数截取低四位保存地位十六进制数保存结果 MOV SS,AX MOV SP,LENGTHSTK

MOV AL,DATA MOV AH,AL AND AL,0F0H MOV CL,04 SHR AL,CL MOV HEX,AL AND AH,0FH MOV HEX+1,AH MOV AX,4C00H INT 21HCSEGENDS END DISC例:设内存DATA单元存放一个无符号字节数据,编制程序将其拆成两位十六进制数,并存入HEX和HEX+1单元的低4位,HEX存放高位十六进制数,HEX+1单元存放低位十六进制数解: 分析命题确定算法画流程图编写程序上机调试拆字程序SSEG SEGMENTSTACKSTK DB 20DUP(0)SSEG ENDSDSEG SEGMENTDATA DB 0B5HHEX DB 0,0DSEG ENDSCSEG SEGMENT ASSUMECS:CSEG,DS:DSEG ASSUMESS:SSEGDISC:MOV AX,DSEG MOV DS,AX MOV AX,SSEG条件转移JCC和无条件转移JMP指令用于实现程序的分支结构。分支程序设计单分支if-then双分支if-then-else判定:程序的逻辑根据某一条条件表达式为真或假时,执行两个不同处理之一时,便是双分支结构形式判定:有其中一个处理为空时,就是单分支形式;如果分支处理中又嵌套有分支,或者说具有多个分支走向时,即为逻辑上的多分支形式。5.52分支程序设计例:写一个实现把一位十六进制数转化为对应ASCII码的程序。

分析命题确定算法十六进制数码与对应的关系:0123………BCDEF30H31H32H33H42H43H44H45H46H这种对应关系可表示为一个分段函数:YX+30H(0<=X<=9)X+37H(0A<=X<=0FH)5.52分支程序设计分析命题确定算法画流程图开始取十六进制数X+30H0<=X<=9YN0A<=X<=0FHX+37H结束YN5.52分支程序设计例:写一个实现把一位十六进制数转化为对应ASCII码的程序。

分析命题确定算法画流程图编写程序上机调试 JMP LAB2LAB1:ADDAL,37HLAB2:MOVASCII,AL MOVAH,4CH INT21HCODEENDSENDSTART DATA SEGMENTXXDB4ASCIIDB?DATAENDSDATA DB 0B5HCODESEGMENT ASSUME CS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAL,0FH CMPAL,9 JALAB1 ADDAL,30H5.52分支程序设计例:写一个实现把一位十六进制数转化为对应ASCII码的程序。

DOWHILE结构图循环初始状态循环控制条件循环体NY5.5.3循环程序设计DOUNTIL结构图循环初始状态循环体循环控制条件YNDOWHILE结构把对循环控制条件的判断放在循环的入口,先判断条件,满足条件就执行循环体,否则就退出循环DOUNTIL结构先执行一次循环体,然后再判断控制条件,不满足条件则继续执行循环操作,一旦满足条件则退出循环5.5.3循环程序设计注意:循环次数等于0,选择DOWHILE结构,否则使用DOUNTIL结构。循环程序都可由如下四部分组成:(1)循环初始化部分(2)循环体(3)循环修改(4)循环控制最常见的循环结束有:①用计数器控制循环;②按问题的条件控制循环;③用开关量控制循环;2.循环程序设计实现(1)单重循环程序设计

例5-8

设计程序,完成从1累加到50(即1+2+...+49+50),结果保存在数据段SUM单元。5.5.3循环程序设计DATA SEGMENT SUM DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,0 ;工作寄存器清零

MOV CX,50 ;计数器赋初值

MOV BX,0 LP: INC BX ;循环体入口

ADD AX,BX DEC CX ;循环计数器修改

JNZ LP ;循环控制

MOV AH,4CH INT 21HCODE ENDS END START5.5.3循环程序设计例5-9

分类统计字数组ARRAY中正数、负数和零的个数,并分别存入内存字变量BUF1、BUF2和BUF3中,数组元素个数保存在数组的第一个字中。

DATA SEGMENTARRAY DW10 ;数据元素个数

DW230,-1437,26,-31,0,3458,0,10,-1,2350 POST DW0 NEGA DW0 ZERO DW0DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA5.5.3循环程序设计START: MOV AX, DATA MOV DS, AX MOV AX, 0 ;用AX作为正数的计数器

MOV BX, 0 ;用BX作为负数的计数器

MOV DX, 0 ;用DX作为零的计数器

MOV DI, OFFSETARRAY

MOV CX,[DI] ;用CX来进行循环计数

ADD DI, 2 ;用指针DI来访问整个数组AGAIN: CMP WORDPTR[DI],0;与0做比较

JG HIGH ;大于0,为正数

JE EQUAL ;等于0

INC BX ;小于0,为负数,负数个数增1

JMP NEXT5.5.3循环程序设计HIGH: INC AX ;正数个数增1 JMP NEXTEQUAL: INC DX ;0的个数增1NEXT: INC DI INC DI LOOPAGAIN ;未完循环DONE: MOV BUF1, AX ;把统计数保存到内存单元中

MOV BUF2, BX MOV BUF3, DX MOV AH, 4CH ;结束程序返回DOS INT 21HCODE ENDS END START5.5.3循环程序设计例5-10

假设在以BUF为首址的存储单元中存放着一串字符,找出其中ASCII码值最大的字符,并存入MAX单元中。程序存储单元与寄存器分配:

CX:循环次数控制变量,初值为字符串的长度﹣1,每次减1。

BX:BUF存储区地址指针,初值指向BUF,每次加1。AL:用来求最大值的工作单元,保持某个时刻的最大值。

MAX:用来保存最终结果的字节单元。5.5.3循环程序设计图5.8求最大字符的程序流程图5.5.3循环程序设计STACK SEGMENTPARASTACK DB 200 DUP(0)STACK ENDSDATA SEGMENT BUFDB ‘ABCD5678bdcaMN’ N EQU $-BUF MAX DB ?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOV AX,DATA MOV DS,AX MOV BX,OFFSETBUF ;BX指向字串首5.5.3循环程序设计

MOV AL,[BX];取出第一个字符

MOV CX,N-1;比较次数送CXNEXT1:INC BX ;BX指向下一字符

CMP AL, [BX] ;比较

JNCNEXT2 MOV AL,[BX]

;大数送ALNEXT2:LOOPNEXT;循环次数(CX

≠0)继续循环

MOVMAX,AL ;MAX←最大数

MOVAH,4CH INT 21H CODE ENDS END BEGIN5.5.3循环程序设计(2)多重循环程序设计

多重循环即循环体内又嵌套循环。 基本思想和单重循环程序设计一致,但实现起来更复杂。 应分别考虑各重循环的控制条件及其程序实现,相互之间不能混淆,即内外层循环必须是嵌套的形式,不能出现交叉。5.5.3循环程序设计(2)多重循环程序设计例5-11

在变量BUF中有n个无符号数x1,x2,…,xn,将它们按由大到小的顺序排列在BUF中,试编程实现。5.5.3循环程序设计采用选择排序时,存储单元和寄存器分配如下:SI:用来控制外循环的循环计数器,初值为1,终值为N﹣1,每次递增1。DI:用来控制内循环的循环计数器,初值(SI)+1,终值为N,每次递增1。AL:用来存放比较数据的寄存器。BUF:存放要排序数据的变量。N:存放要排序数据的个数。5.5.3循环程序设计STACK SEGMENT STACK DB 200 DUP(0)STACK ENDSDATA SEGMENT BUF DB 0AH,8,15H,36H,6,20H,12H N EQU $-BUF;N为要排序数据的个数 DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN: MOV AX, DATA MOV DS, AX MOV SI, 1 ;给外循环计数器赋初值15.5.3循环程序设计NEXT1: MOV DI,SI INC DI MOV AL, [BUF+SI-1]NEXT2: CMP AL, [BUF+DI-1] JAE NEXT3 XCHG [BUF+DI-1],AL MOV [BUF+SI-1],ALNEXT3: INC DI ;(DI)←(DI)+1 CMP DI,N ;若(DI)<N转NEXT2,继续执行内循环开始

5.5.3循环程序设计JBE NEXT2 ;否则退出内循环,本循环结束准备进入下一轮循环 INC SI ;(SI)←(SI)+1 CMP SI,N-1 ;比较(SI)与N﹣1 JBE NEXT1 ;若(SI)≤N-1转NEXT1继续循环,否则退出 MOV AH,4CH INT 21HCODE ENDSEND BEGIN5.5.3循环程序设计5.5.4子程序结构形式与操作1.子程序的定义程序设计中,把多次重复出现、具有通用性、能够完成特定处理任务的程序段编写成独立的程序模块。特性:(1)重复性;(2)通用性;(3)浮动性;(4)模块化;主程序与子程序调用关系主程序K:调用子程序ADK:……J:调用子程序ADJ:…………子程序A……返回主程序5.5.4子程序结构形式与操作例5-12

调用程序和子程序在同一代码段中。

MAIN PROC FAR;主程序

…… CALL SUBR1

…… RET MAIN ENDP SUBR1 PROC NEAR;子程序(NEAR可省略)…… RET SUBR1 ENDPMAIN及其子程序SUBR1在同一代码段中,SUBR1定义为NEAR属性。如果调用程序和子程序不在同一个代码段中,则使用FAR属性程序的主程序看作DOS调用的一个子程序,因而DOS对MAIN的调用以及MAIN中的RET就是FAR属性。5.5.4子程序结构形式与操作CALL和NEAR为调用指令基本功能:

将子程序的返回地址(即CALL指令的下一条指令的地址,简称断点地址,包括段地址和偏移地址)压入堆栈,以便执行完子程序后能返回主程序,并从断点处继续往下执行,然后按照某种寻址方式转向子程序的入口地址去执行子程序。子程序定义的语法格式:

<子程序名>PROCAttributeRET<子程序名>ENDPSUBT PROC PUSH AX ;现场保护PUSH BXPUSH CXPUSH DX…… ;子程序体POP DX ;现场恢复POP CXPOP BXPOP AXRETSUBT ENDP例5-13PUSH指令把子程序所需要使用的寄存器内容保存在堆栈中POP指令把寄存器内容恢复原状5.5.4子程序结构形式与操作注意:子程序中用到的寄存器是应该保护的。如果使用寄存器在主程序和子程序之间传送参数,这种寄存器就不一定需要保护,特别是向主程序回送结果的寄存器,更不应该因保存和恢复寄存器而破坏了应该向主程序传送的信息。例5-14

假设在A、B、C、D四个字变量中各存放一个正整数,试编写程序分别求出A与B的最大公约数M,C与D的最大公约数N,再求出M与N之和,将结果存入RESULT字变量中。 本程序需两次调用求最大公约数子程序,将两次返回结果求和再存入RESULT字变量中。

5.5.4子程序结构形式与操作STACKSEGMENT PARASTACK DB 200 DUP(0)STACKENDSDATA SEGMENT A DW 720B DW 81C DW 1150D DW 125 RESULTDW

温馨提示

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

评论

0/150

提交评论