




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章汇编语言程序设计主要内容汇编语言程序的结构汇编语言语句类型和组成汇编语言程序设计汇编语言程序及其开发方法机器语言、汇编语言、高级语言机器语言指令和数据都用二进制代码表示;计算机能直接识别和执行汇编语言用指令的助记符,符号地址,标号等编写程序的语言;助记符就是指令的符号表示,一个助记符表示一条机器指令;汇编语言源程序就是机器语言程序的符号表示高级语言不依赖于机器的通用语言汇编语言程序及其开发方法机器语言、汇编语言、高级语言汇编语言的特点可直接利用硬件系统的特性;可直接对位、字、字节、寄存器、存储单元、I/O口进行处理;可直接利用各种寻址方式;编写的程序占用内存空间少,执行速度快;软件开发时间长,出错可能性增加;要求程序设计人员对硬件结构有比较清楚的了解主要用于:系统程序,实时通信程序,实时控制程序等,也可被其他高级语言所嵌用学习计算机硬件组成及其工作原理汇编语言程序及其开发方法机器语言、汇编语言、高级语言特征汇编语言高级语言目标程序运行时间短长程序运行时占用的存储空间小大直接访问硬件的能力强弱程序可读性和可维护性差强程序开发的复杂程序高低程序的可移植性差强对硬件环境和软件的兼容性差强汇编语言程序及其开发方法汇编语言程序的开发方法编写汇编语言源程序可以用任何文本编辑软件建立源程序,源程序文件要以ASM为扩展名(例:HELLO.ASM)对源程序进行汇编汇编是将源程序翻译成由机器代码组成的目标模块文件的过程汇编器为MASM.EXE。(例:C:\>MASMHELLO.ASM)如果源程序中没有语法错误经过汇编形成.OBJ文件还可生成列表文件.LST。列表文件是一种文本文件,含有源程序和目标代码,对我们学习汇编语言程序设计和发现错误很有用汇编语言程序及其开发方法汇编语言程序的开发方法对目标程序进行连接连接程序能把一个或多个目标文件和库文件合成一个可执行程序(.EXE、.COM文件)连接器为LINK.EXE(例:C:\>LINKHELLO.ASM)如果没有严重错误,LINK将生成一个.EXE可执行文件执行程序在DOS下,键入可执行程序的文件名就可以运行(例:C:\>HELLO)要求运行后,能正常返回DOS汇编语言程序及其开发方法汇编语言程序的开发方法调试程序为了查找程序故障需对可执行程序进行调试使用DEBUG.COM程序来进行(例:C:\>DEBUGHELLO.EXE)在DEBUG命令行提示符“-”下,键入调试命令常用命令:R、D、A、U、G、T(P)查找到错误,修改源程序,重新汇编、连接、调试汇编语言程序及其开发方法汇编语言程序的开发方法在DOS下运行程序把.EXE文件装入内存;装入时,首先为用户程序建立一个程序段前缀区(PSP),长度256个字节,用于存放用户程序的有关信息,然后是代码段内容、数据段、堆栈段;建立了PSP后,设置DS和ES的值,使它们指向PSP的开始处在PSP的开始处(偏移地址0000H),安排一条INT20H软中断指令(INT20H中断服务程序是由DOS提供的,功能是“返回DOS”);汇编语言程序及其开发方法汇编语言程序的开发方法在DOS下运行程序CS、IP、SS、SP寄存器设置为由连接程序传过来的值;将CS设置为用户程序代码段的段基址,IP设置为代码段中第一条要执行的指令的偏移地址;将SS设置为堆栈段的段基址,SP指向堆栈段的栈底运行用户程序在程序中必须给DS、ES赋值汇编语言程序及其开发方法汇编语言程序的开发方法程序结束返回DOS的方法方法一:用户组织程序时,使程序执行完后能够转去执行存放于PSP开始处的INT20H指令实现:START PROCFAR
PUSHDS XORAX,AX PUSHAX ... RETSTART ENDP汇编语言程序及其开发方法汇编语言程序的开发方法程序结束返回DOS的方法方法二:使用DOS功能调用(4CH)实现:MOVAX,4C00H(MOVAH,4CH) INT21H汇编语言源程序的结构汇编语言源程序的结构举例说明例1:计算变量X、Y的和,存入变量SUM中例2:书P87HELLO.ASM例3:书P104(返回DOS的另一种方法)汇编语言的语句格式分类及其相应语句格式有关程序分段的伪指令SEGMENTASSUMEEND例1DATA SEGMENTX DB05HY DB02HSUM DB?DATA ENDSSTACKSEGMENT PARASTACK‘STACK’ DB64DUP(?)STACK ENDSCODE SEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACKSTART PROCFAR
PUSH DS MOV AX,0 PUSH AX定义数据段,在存储器中存放供计算的数据定义堆栈段,在存储器的某个区域建立一个堆栈区定义代码段将程序定义为远过程标准序,以便返回DOS操作系统
MOV AX,DATA MOV DS,AX MOV AL,X ADD AL,Y MOV SUM,AL ADD AL,30H MOV DL,AL MOV AH,02H INT 21H RETSTART ENDPCODE ENDS
END START建立数据段的可寻址性,初始化DS求两个变量的和,并将结果存入指定的内存单元将结果转换为ASCII码,并调用2号DOS功能,在屏幕上显示结果;返回DOS操作系统;过程结束;代码段结束;整个程序汇编结束汇编语言源程序的结构汇编语言源程序的结构源程序的结构特点:因为微处理器是采用存储器分段管理方式,所以源程序都以逻辑段为基础,按段的概念来组织代码和数据源程序由若干逻辑段组成,每个逻辑段都有一个段名,由段定义语句来定义和说明一般具有代码段,数据段,堆栈段;汇编语言源程序的结构汇编语言源程序的结构源程序的结构特点在代码段的起始处,用ASSUME伪指令说明各个段寄存器与逻辑段的对应关系,并由用户通过程序本身设置段寄存器的初值;(DS,ES)每个逻辑段由若干行汇编语句组成每个汇编语句最多由4个部分组成,它们均按照一定的规则分别写在一条语句的4个区域内,每个区域之间使用空格隔开整个源程序必须以END[标号]语句结束,它通知汇编程序停止汇编,只有主程序的END语句允许有标号,该标号必须是程序运行是第一条要执行的指令的标号每个源程序在代码段中都必须含有返回到DOS操作系统的指令语句,保证程序执行完毕后,自动回到DOS汇编语言源程序的结构汇编语言的语句格式由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。每个语句由1~4个部分组成汇编语言语句分类执行语句(一般性指令语句、宏指令)对应于CPU指令系统中的一条指令,是可执行语句汇编时,汇编程序将为它产生一条对应的机器目标代码说明性语句(伪指令语句)指定汇编程序做何种操作(如何产生代码、分配存储空间等);汇编时,一般不产生机器指令代码汇编语言源程序的结构汇编语言的语句格式执行语句格式[标号:]指令助记符[操作数][;注释]标号:代表该指令的起始地址举例:COUNT:INCCX;计数值加1说明性语句格式[名字]伪指令助记符[操作数][;注释]名字:通常代表常量名、变量名、过程名、段名等举例:COSTDB3;定义一个内存变量,初始值3汇编语言中标识符的规定(书P91)汇编语言源程序的结构有关程序分段的伪指令段定义伪指令SEGMENT格式段名SEGMENT[定位类型][连接方式][‘类别名’]…….段名ENDS功能指出段名及段的各种属性,并表示段的开始和结束位置汇编语言源程序的结构有关程序分段的伪指令段定义伪指令SEGMENT定位类型:指明该段进入内存时从何种类型的边界开始存放PAGE: 段起始地址的最低8数必须为0(该地址能被256整除)PARA: 段起始地址的最低4位必须为0(默认)WORD:该段必须从字的边界开始,即段起始地址必须为偶数BYTE: 该段可以从任何地址开始汇编语言源程序的结构有关程序分段的伪指令段定义伪指令SEGMENT连接方式(组合类型):告诉连接程序本段与其它段的关系
NONE: 表示本段与其它段逻辑上不发生关系,每段都有自己的基地址(默认)PUBLIC: 与其他同名同‘类别’的段连接在一起,使用一个共同的基地址STACK: 与PUBLIC同样处理,但作为堆栈段。COMMON:与其他同名同‘类别’的段相互重叠在一起,使用一个共同的基地址AT表达式:把本段装在表达式值所指定的16位段地址上(不能指定代码段)MEMORY:把本段定位在所有其他段之上,若有多个则只有连接时遇到的第一个有效,其余按COMMON处理)
汇编语言源程序的结构有关程序分段的伪指令段定义伪指令SEGMENT类别名:为连接程序所使用。连接程序把类别名相同的段放在连续的存储区间内类别名一般有‘STACK’、‘CODE’、‘DATA’
举例:堆栈段的定义方式STACK SEGMENTSTACK'STACK' DB100Hdup(?)STACK ENDS汇编语言源程序的结构有关程序分段的伪指令段寻址伪指令ASSUME格式ASSUME段寄存器:段名[,段寄存器:段名,……]功能通知汇编程序段寄存器与源程序中所定义的段名之间的对应关系举例ASSUMECS:CODE,DS:DATA,SS:STACK汇编语言源程序的结构有关程序分段的伪指令段寻址伪指令ASSUME使用注意事项ASSUME伪指令必须写在代码段中,一般需放在代码段定义语句之后ASSUME伪指令只给出了对应关系,但并没有真正给段寄存器赋值汇编语言源程序的结构有关程序分段的伪指令段寻址伪指令ASSUME使用注意事项将真实段地址装入段寄存器还需用汇编指令来实现(见书P87例4-1)当程序运行时,由于DOS的装入程序负责把CS初始化成正确的代码段地址,SS初始化为正确的堆栈段地址,因此用户在程序中不必对它们进行设置在DOS装入程序中DS及ES寄存器由于指向了程序段前缀PSP),因此若用户程序需使DS与ES指向自己定义的段,则必须对它们进行初始化汇编语言源程序的结构有关程序分段的伪指令汇编结束伪指令END格式END[表达式]功能它是汇编语言源程序最后一条语句,汇编程序碰到它时将停止对源程序的汇编举例:ENDSTART使用说明表达式为可选项,它表示该汇编程序的起始执行地址,可以为过程名或标号只有主模块须指定常用伪指令伪指令用来指定汇编程序做何种操作,一般不生成机器代码介绍几条常用伪指令符号定义伪指令EQU、=数据定义伪指令DB、DW、DD过程定义伪指令PROC定位伪指令ORG常用伪指令符号定义伪指令EQU格式符号名EQU表达式功能给符号定义一个值。在程序中,凡是出现该符号的地方,汇编时均用所给的值代替表达式可以是:常数,求出常数值的表达式,寄存器名,指令助记符举例PORT1EQU312HPORT2EQUPORT1+1TIMESEQU50COUNTEREQUCX常用伪指令符号定义伪指令=格式符号名=表达式功能同EQU,不同之处在于用“=”定义的符号名在同一程序中可以重复定义,而EQU不行举例COUNT=100 ;COUNT=100COUNT=COUNT+100;COUNT=200常用伪指令数据定义伪指令伪指令名DB、DW、DDDB:定义字节,即每个数据是1个字节;DW:定义字,即每个数据占1个字(2个字节),低字节部分放在低地址处;DD:定义双字,即每个数据占2个字。低字部分在低地址,高字部分在高地址功能用来分配存储空间及定义所存数据的长度,同时也可对所分配的存储空间赋初值常用伪指令数据定义伪指令格式格式1:[名字]伪指令名表达式1,表达式2,…
名字为可选项表达式数值表达式问号表达式,只用来分配存储空间,但不对该空间初始化字符串表达式(一般用DB定义、若用DW定义字符串中只能包含两个字符、字符串定界符:‘
’)常用伪指令数据定义伪指令格式格式1:[名字]伪指令名表达式1,表达式2,…
举例:ONEDB10HTWODW100HTHREEDD12345678HFOURDB1,2,3,4,5FIVEDW1,2,3,4,5RESULT1DB?,?RESULT2DW?,?常用伪指令数据定义伪指令格式格式1:[名字]伪指令名表达式1,表达式2,…
举例:STRING1DB‘thisisastring.’书P87例4-1S1 DB‘ABCDEF’S2 DW‘AB’,‘CD’,‘EF’S3 DD‘AB’,‘CD’常用伪指令数据定义伪指令指令格式格式2:[名字]伪指令名表达式1DUP(表达式2)该种格式用于定义一些重复的数据或分配一数据块空间举例:BUFFERDB100DUP(?)ARRAY1DW10DUP(10)ARRAY2DB2DUP(0,1,?)BUF1DB16DUP(‘ABCD’)常用伪指令数据定义伪指令举例:根据下列数据段的定义,画出内存分配示意图DATASEGMENT DATA1DB5,50H,‘ABC’ DB2DUP(‘123’)DATA2DW2DUP(0FFH) DATA3DWDUP(?) DATAENDS思考:若在DATA1前面加入一条如下伪指令,内存分配是否改变?TIME1EQU50常用伪指令过程定义伪指令可将具有一定功能的程序段看成为一个过程(相当于一个子程序),它可以被别的程序调用格式:过程名PROC[类型]
过程体
RET过程名ENDP功能定义一个过程,并指明过程名及过程的属性类型:NEAR(默认)、FAR常用伪指令过程定义伪指令说明调用过程的格式为:CALL﹤过程名﹥NEAR:(近过程)段内调用FAR:(远过程)段间调用过程体内一般应有一条RET指令,以便返回被调用处举例:书P96例4-17定义用于延时的过程DELAY调用该过程时使用语句:CALLDELAY常用伪指令定位伪指令格式:ORG<表达式>功能:规定了在某一段内程序代码或数据存放的起始偏移地址举例:画出如下定义数据段内存分配示意图DATA SEGMENT BUF1 DB23,56H,‘EOF’ ORG2000HBUF2 DB‘STRING’DATA ENDS常数、变量及标号任何一个程序都要使用数据汇编语言中的数据项有常数、变量及标号三种类型常数、变量及标号常数在汇编时已经确定其值且程序运行期间不变化的量为常量,如:指令语句中的立即数,端口地址等汇编语言语句中出现的常数可以有如下几种二进制:10111001B十进制:1234D或1234八进制:255Q或255O十六进制:3A5DH,第1位为字母时前面加数字0(与变量区别)字符串常数:用单引号括起来的一个或多个字符组成一个字符串常数,‘ABCD’,字符汇编成相应的ASCII码值常数、变量及标号变量变量实际代表着内存单元,存放在这些内存单元的数据在程序运行期间随时可以改变变量的定义数据定义伪指令DB、DW、DD变量的使用变量常常以变量名的形式出现在程序中变量名是存放数据的存储单元的符号地址常数、变量及标号变量变量的属性段属性(SEG):表示变量存放在那一个段中对变量进行存取时要先将它们所在段的段基值放在DS中偏移属性(offset):表示变量在段中离段起点的字节数变量的段属性和偏移属性构成了变量的逻辑地址
类型属性(type):表示变量占用存储单元的字节数字节、字、双字举例:书P97例4-19常数、变量及标号标号标号是一条指令的目标代码的符号地址常用作转移指令(或子程序调用指令)的操作数标号的定义标号的属性段属性是该标号的段地址偏移属性是该标号的偏移地址类型属性NEAR属性(该标号只能在定义它的段内被引用)
FAR属性(该标号除能在定义它的段内被引用外,也可在其它段内被引用)常数、变量及标号关于标识符使用场合变量名、标号、段名、过程名、符号常数等规则组成:字母A~Z或a~z;数字:0~9;特殊字符:?、·
、@、一、$数字不能作标号的第一个字符,而圆点仅能用作第一个字符标号或名字最长为31个字符,大小写不敏感不能用宏汇编中的保留字指令助记符、所有寄存器名、伪指令名及其它特殊用途的符号表达式和运算符表达式是由运算符和操作数(常数、变量和标号)等组成的序列,在汇编时将产生一个确定的值这个值可以仅表示一个常量,也可以表示一个存储单元的偏移地址举例:MOVAL,3*2+5MOVAL,BUFFER+3表达式和运算符常用运算符算术运算符+、-、*、/、MOD(取余)、SHL(左移)、SHR(右移)举例:32MOD5;结果为221HSHL2;结果为84H逻辑运算符AND、OR、XOR、NOT举例:MOVAL,24HAND0FH表达式和运算符常用运算符关系运算符EQ、NE、LT、LE、GT、GE比较时,若关系不成立,则结果为“0”;若关系成立,则结果为“1”;举例:PORTEQU10MOVBX,PORTLT5;汇编成MOVBX,0FFFFHMOVAL,((PTGT60)AND50)OR((PTLE60)AND70)表达式和运算符常用运算符取值运算符SEG和OFFSET运算符SEG用来返回标号或变量的段地址OFFSET用来返回标号或变量的偏移地址举例:书P99例4-23TYPE运算符返回一个数字值,表示存储器操作数的类型;对于变量,返回的是类型的字节长度(1、2、4);对标号返回的是类型代码:NEAR(-1)、FAR(-2)举例:书P100例4-24表达式和运算符常用运算符取值运算符LENGTH和SIZE运算符用LENGTH,SIZE只对用DUP定义的存储器操作数有意义LENGTH返回分配给指定存储器操作数元素的个数SIZE返回的是分配给该存储器操作数的总字节数SIZE(X)=(LENGTHX)*(TYPEX)对用非DUP定义的存储器操作数,LENGTH返回值1举例:书P100例4-25举例:设DATA是从实际地址02000H开始的数据段,定义如下:DATASEGMENTVAR1DB20,30VAR2DW2000H,3000HVAR3DD22003300H,33002200HVAR4DB4DUP(1)VAR5DW2DUP(?)DATAENDS则:MOVBX,SEGVAR1;BX=0200HMOVDX,SEGVAR3;DX=0200HMOVAX,OFFSETVAR1;AX=0MOVAX,OFFSETVAR2;AX=2MOVAX,OFFSETVAR3;AX=6MOVCX,TYPEVAR1;CX=1MOVCX,TYPEVAR2;CX=2MOVCX,TYPEVAR3;CX=4MOVBX,LENGTHVAR2;BX=1MOVBX,LENGTHVAR5;BX=2MOVBX,LENGTHVAR4;BX=4MOVBX,SIZEVAR4;BX=4MOVBX,SIZEVAR5;BX=4表达式和运算符表达式和运算符常用运算符取值运算符HIGH和LOW运算符用来将一个16位数或表达式的高字节,低字节分离出来举例:书P100例4-26表达式和运算符常用运算符取值运算符‘$’运算符‘‘$’运算符当用于伪指令的参数字段时,返回汇编程序的汇编地址计数器的当前值$出现在表达式中,它的值为下一个能分配的存储单元的偏移地址举例:书P100例4-27COUNT的含义?DATA SEGMENTBUFFERDW0,1,-5,10,256,-128,-100,45 DW39,-67,20,-1668 COUNTEQU ($-BUFFER)/2DATA ENDS表达式和运算符常用运算符取值运算符‘$’运算符举例:画出内存示意图DATASEGMENTORG$+2VAR1DB2,3,4 ORG$+3 VAR2DW1234HDATAENDS表达式和运算符常用运算符取值运算符‘$’运算符当$用于指令中时,返回该指令的首地址举例:设在内存1000:2543处存有指令:JNE$+6,则转移地址(偏移量)是2549H表达式和运算符常用运算符属性运算符PTR运算符用来给指令中的操作数指定一个临时属性,以满足不同的访问要求,类型改变仅在当前所在的指令中有效格式新类型或属性PTR表达式类型:BYTE,WORD,DWORD,NEAR,FAR举例:书P100表达式和运算符常用运算符属性运算符THIS运算符用于定义一个变量或标号,使它们具有多重名字和属性格式标号或变量EQUTHIS类型类型:BYTE,WORD,DWORD,NEAR,FAR举例:书P100例4-33表达式和运算符常用运算符属性运算符段超越运算符强迫当前指令的操作数的寻址不按默认的段进行,而由段超越运算符指定的段来寻址格式段寄存器名:举例:MOVAX,ES:[BX]SHORT运算符用于通知汇编器,转移目标在-128-+127范围内举例:JMPSHORTF1基本结构程序设计程序设计步骤分析问题确定算法画流程图内存空间分配编写程序静态检查上机调试基本结构程序设计程序的基本结构顺序结构分支结构循环结构子程序结构基本结构程序设计顺序结构顺序结构的程序是没有分支、没有循环和转移、只能顺序运行的程序在汇编环境下,编写顺序结构程序时,要注意汇编源程序的特点不仅注意程序的逻辑上的正确,还要随时和CPU的寄存器,内存单元的状态相联系注意运算位数的一致应用举例查表程序表达式程序基本结构程序设计顺序结构举例例1:用查表法计算0~9的平方值分析:建立平方表,通过查表完成计算确定算法:表格是字节表,可以直接使用XLAT指令其它类型表格,关键是根据待查的值计算出所对应的偏移地址画流程图内存分配分配存放平方表的单元分配存放待查数据的单元分配存放查表结果的单元基本结构程序设计顺序结构举例例1:用查表法计算0~9的平方值编写程序:书P103例4-36注意几点AH寄存器清0计算偏移地址时注意操作数位数一致提问如果采用XLAT指令,程序如何修改?如果要查的是0~9的立方表,内存如何分配?程序如何修改?基本结构程序设计顺序结构举例:例2:编写计算(W-(X*Y+Z-200))/X的程序W、X、Y、Z都是16位有符号数(变量);结果的商存入RESULT、余数存入RESULT+2单元。基本结构程序设计
MOV AX,X IMUL Y MOV CX,AX ;暂存32位乘积
MOV BX,DX MOV AX,Z CWD ;对Z进行扩展
ADD CX,AX ;加Z ADC BX,DX ;加进位
SUB CX,220 ;减220 SBB BX,0 ;减借位
MOV AX,W CWD ;对W进行扩展
SUB AX,CX ;减低16位
SBB DX,BX ;减高16位
IDIV X MOV RESULT,AX ;存商
MOV RESULT+2,DX ;存余数有关程序段基本结构程序设计分支结构基本思想:根据逻辑判断的结果来形成程序的分支实现基本方法使用能设置状态标志的指令
(算数运算逻辑、移位指令
CMP,TEST等)使用条件转移指令实现分支
(条件满足,改变走向,否则顺序执行)分支后,须汇合时,使用无条件转移指令基本结构程序设计分支结构举例例1:书P103例4-37例2:书P104例4-38例3:书P105例4-39基本结构程序设计分支结构补充:多分支结构的实现方法利用跳转表实现分支将各分支程序的入口地址按照一定的顺序存放在数据段内存区域中根据一定的算法计算出分支程序地址在表中的位置,从而得到相应的分支程序的入口地址使用间接转移指令,转去执行该分支程序,从而实现了多个分支使用无条件转移指令,跳转到汇合点基本结构程序设计分支结构补充:多分支结构的实现方法举例:根据键盘输入0~9中任一数字,转移到10个不同的分支程序,即实现多个分支的转移数据段定义的地址表ADRTABDWR0,R1,R2,R3,R4,R5,R6,R7,R8,R9这里的R0~R9是程序中的10个标号如果是段间转移,则地址表中每个地址由两个16位地址构成,低16位是偏移地址,而高16位是转移所到的段的段地址CSADRTAB DWOFFSETR0,SEGR0,OFFSETR1,…基本结构程序设计分支结构补充:多分支结构的实现方法程序段 MOV AH,01 INT 21H ;输入一个字符
MOV AH,0 AND AL,0FH ;变为二进制数
ADD AL,AL ;AL*2 MOV BX,OFFSETADRTAB ;表首地址-〉BX
ADD BX,AX ;形成查表地址
JMP WORDPTR[BX] ;转移到相应标号R0: ….R1: ….基本结构程序设计循环结构两种结构形式“先执行后判断”(DO-UNTIL)循环体至少执行一次;适用于循环次数已知的情况“先判断后执行”(DO-WHILE)循环体有可能一次也不执行适用于循环次数未知,须根据条件真假来控制循环或实时检测到的状态来控制循环的情况基本结构程序设计循环结构组成循环初始化部分:用于对相关内存单元及寄存器设置初始值例如设置地址指针、循环次数、某些标志位等循环体:为要求重复执行的程序段部分对应于要求重复执行的操作循环控制部分为下一轮处理修正地址指针及循环次数等判断循环结束的条件是否满足,若满足则退出循环用计数控制循环、用条件控制循环等循环结束部分:用于保存循环运行的结果等基本结构程序设计循环结构举例例1:书P107例4-40例2:书P108例4-41例3:书P109例4-42基本结构程序设计循环结构举例例1:书P107例4-40例2:书P108例4-41例3:书P109例4-42循环可嵌套当循环体中的处理部分也是循环结构时,构成循环嵌套应用举例软件延时程序气泡排序(简单说明)基本结构程序设计循环结构循环可嵌套应用举例软件延时程序MOVBL,100DELAY:MOVCX,2801WW:LOOPWWDECBLJNZDELAY基本结构程序设计子程序结构把一些固定的、经常使用的功能做成子程序(在8086/8088宏汇编中称为过程)的形式使用该结构源程序及目标程序大大缩短,提高程序设计的效率和可靠性基本结构程序设计子程序结构主程序与子程序的连接子程序以过程的形式存放在代码段;
过程名PROC[NEAR/FAR]
……. (子程序主体)
…….
过程名ENDP主程序与子程序的连接由CALL和RET指令来完成基本结构程序设计子程序结构现场的保护与恢复若子程序中要用到主程序已使用的某些寄存器或存储单元,而这些内容在子程序运行后主程序还要继续使用,则必须将它们压入堆栈加以保护通常将PUSH和POP成对地安排子程序的开始和结束基本结构程序设计子程序结构主程序和子程序间的参数传递参数是主程序和子程序之间的数据通道入口参数:子程序需从主程序获取的参数出口参数:子程序需返回给主程序的参数参数传递的方法利用寄存器:把所需传递的参数直接放在寄存器中特点:简单、快捷,但仅适合于参数较少的情况利用数据/代码段存储单元利用堆栈:把要传递的参数放在堆栈中适用于参数较多、子程序有嵌套及递归调用的情况基本结构程序设计子程序结构主程序和子程序间的参数传递利用寄存器举例例1:书P111例4-43例2:求数组ARY中所有元素的和并存于SUM单元STACKSEGEMENTPARASTACK‘STACK’ DB100DUP(?)STACKENDSDAT SEGMENT ARYDB34,56H,89,32H,57,63H COUNTDB$-ARY SUM DW?DATENDS基本结构程序设计CODSEGMENTASSUMECS:COD,DS:DATSTART:MOVAX,DAT MOVDS,AX LEASI,ARY MOVCX,COUNT CALLSUM1 MOVSUM,AX MOVAH,4CH INT21H;入口参数准备,将需要的传递的参数送入寄存器,;子程序求和,返回值在AX中
SUM1PROCNEAR CMPCX,0 JZEXIT MOVAX,0AGAIN:ADDAL,[SI] ADCAH,0 INCSI LOOPAGAINEXIT:RETSUM1ENDPCODENDS ENDSTART;子程序名:SUM1;入口参数:SI=数组首址,CX=数组长度出口参数:AX=数组和基本结构程序设计子程序结构主程序和子程序间的参数传递使用数据存储单元(1)CODSEGMENTASSUMECS:COD,DS:DATSTART:MOVAX,DAT MOVDS,AX CALLSUM1 MOVAH,4CH INT21H
SUM1PROCNEAR LEASI,ARY MOVCX,COUNT MOVAX,0AGAIN:ADDAL,[SI] ADCAH,0 INCSI LOOPAGAIN MOVSUM,AXRETSUM1ENDPCODENDS ENDSTART基本结构程序设计子程序结构主程序和子程序间的参数传递使用数据存储单元(2)STACKSEGEMENTPARASTACK‘STACK’ DB100DUP(?)STACKENDSDAT SEGMENT ARY DB34,56H,89,32H,57,63H COUNTDB$-ARY SUM DW? TABLEDW3DUP(?) ;定义地址表DATENDS基本结构程序设计CODSEGMENTASSUMECS:COD,DS:DATSTART:MOVAX,DATMOVDS,AX MOVTABLE,OFFSETARY MOVTABLE+2,OFFSETCOUNT MOVTABLE+4,OFFSETSUM ;参数地址送地址表
LEABX,TABLE ;地址表首址→BX CALLSUB1 MOVAH,4CH INT21H基本结构程序设计;子程序名:SUM1;入口参数:BX为地址表首地址,参数地址在地址表中,;出口参数:和在SUM单元中,;使用寄存器:AX,CX,BP,SI,DISUM1PROCNEAR PUSHAX
…… PUSHDI ;保护现场
MOVSI,[BX] ;数组首地址→SIMOVBP,[BX+2] ;数组长度单元地址→BP MOVCX,DS:[BP] ;数组长度→CX MOVDI,[BX+4] ;存储和单元地址→DI MOVAX,0
…….. ;循环求和
MOV[DI],AX ;存储和
POPDI
…… ;恢复现场
RET基本结构程序设计子程序结构主程序和子程序间的参数传递使用堆栈传递的方法在主程序中通过PUSH指令将要传递的参数送入堆栈,在子程序中从堆栈中适当地址取出参数现场保护后,被传参数位于“高地址”,这时不能用POP指令弹出;可以使BP指向栈顶,以BP加位移量的形式指向参数所在的单元,再用MOV指令取出参数在使用BP前,一般都先将BP的值先送入堆栈保护基本结构程序设计子程序结构主程序和子程序间的参数传递使用堆栈传递的方法注意对于CALL指令是远调用还是近调用,取参数时使用的位移量的差别通过堆栈传送参数的子程序结束时,应该使用RETn来退出子程序;其中的n是所传送参数的数目的2倍举例:例1:书P112例4-44例2:求数组ARY中所有元素的和并存于SUM单元基本结构程序设计子程序结构主程序和子程序间的参数传递使用数据存储单元(2)STACKSEGEMENTPARASTACK‘STACK’ DB100DUP(?)STACKENDSDAT SEGMENT ARY DB34,56H,89,32H,57,63H COUNTDB$-ARY SUM DW?DATENDS基本结构程序设计COD1SEGMENT ASSUMECS:COD,DS:DATSTART:MOVAX,DAT MOVDS,AX LEABX,ARY PUSHBX ;地址参数1进栈
LEABX,COUNT PUSHBX ;地址参数2进栈
LEABX,SUM PUSHBX ;地址参数3进栈
CALLSUB1 ;段间调用,求和
MOVAH,4CH INT21H基本结构程序设计;子程序名:SUB1,功能:求数组和;入口参数:数组,数组长度及存和单元的地址在栈中;出口参数:和在SUM单元中;使用的寄存器:AX,BX,CX,BPSUB1PROCFAR PUSHAX PUSHBX PUSHCX PUSHBP MOVBP,SP MOVBX,[BP+14] MOVCX,[BX] MOVBX,[BP+12] MOVSI,[BP+16] MOVAX,0AD1:ADDAX,[SI]ADDSI,2LOOPAD1MOV[BX],AXPOPBPPOPCXPOPBXPOPAXRET6SUB1 ENDPCOD1 ENDS ENDSTART基本结构程序设计子程序结构子程序嵌套与子程序递归调用子程序嵌套:一个子程序可以调用另一个子程序;嵌套的层次称为嵌套深度,它只受堆栈空间的限制;子程序递归调用如果一个子程序调用的子程序就是它本身,称这种调用为递归调用;举例:书P114例4-45数据的输入与输出(DOS功能调用)
数据的输入与输出在显示器上看到程序运行的结果从键盘上输入一些程序所需的数据方法BIOS调用举例:MOVAH,1INT16H执行后会设置零标志位(ZF):若ZF=1,则无键盘输入;否则ZF清0,且AL中含所键入字符的ASCII码数据的输入与输出(DOS功能调用)
方法DOS功能调用DOS为编程人员提供丰富的服务程序,这些服务程序用户在编程时,可以直接调用;DOS提供的这些服务程序就称为DOS功能调用DOS功能使用起来很简单所有的功能调用都是通过软中断指令实现的INT21H称为系统功能调用DOS功能的使用在AH寄存器中设置系统功能调用号;在指定寄存器中设置入口参数;执行指令INT21H;根据出口参数分析功能调用执行的情况数据的输入与输出(DOS功能调用)
DOS功能调用字符(串)输入/输出DOS功能调用输入单个字符DOS功能号:01H;出口参数:AL=所输入字符的ASCII码;功能:等待用户从键盘输入一个字符,输入字符后返回。同时在屏幕上显示所输入的字符。如按Ctrl-Break或Ctrl-C则退出举例:MOVAH,1INT21H数据的输入与输出(DOS功能调用)
DOS功能调用字符(串)输入/输出DOS功能调用输入字符串DOS功能号:0AH入口参数:DS:DX指向字符串缓冲区首地址,该缓冲区的第1字节须填入最多欲接收的字符个数(包括回车字符);出口参数:前述缓冲区的第2字节将存放实际输入的字符个数(不包括回车符);第3字节开始将存放输入的字符串。实际输入的字符数多于所定义的数时,多出的字符被丢掉,且响铃执行该功能调用时,等待用户按键输入字符,字符串输入以回车结束数据的输入与输出(DOS功能调用)
DOS功能调用字符(串)输入/输出DOS功能调用输出单个字符举例:定义缓冲区BUFFERDB81 DB0 DB81DUP(0)MOVDX,OFFSETBUFFERMOVAH,0AHINT21H数据的输入与输出(DOS功能调用)
DOS功能调用字符(串)输入/输出DOS功能调用显示单个字符DOS功能号:02H入口参数:DL=待显示字符的ASCII码功能:在显示器当前光标位置显示给定的字符,且光标右移一个字符位置。如果按Ctrl-Break或Ctrl-C则退出举例:MOVAH,02HMOVDL,’?’INT21H数据的输入与输出(DOS功能调用)
DOS功能调用字符(串)输入/输出DOS功能调用显示字符串DOS功能号:09H入口参数:DS:DX指向字符串在内存中的首地址,要求字符串以$(24H)结束;功能:在显示器上输出指定的字符串举例:定义字符串STRINGDB‘hello!’,0DH,0AH,’$’MOVAH,09HMOVDX,OFFSETSTRINGINT21H数据的输入与输出(DOS功能调用)DOS功能调用字符(串)输入/输出DOS功能调用显示字符串举例:编写字符串处理程序,找字符串中的第一个非空格字符,并去掉字符串的前导空格。分别显示原字符串和处理后的字符串数据的输入与输出(DOS功能调用)数据段: DATASEGMENT stringDB‘abcdefghij’,‘$’ COUNEQU$-string str2DBCOUNTDUP(?) str3DB0dh,0ah,’$’ DATAENDS数据的输入与输出(DOS功能调用)部分程序代码:LEA DI,stringMOV CX,COUNTMOV AL,’’REPE SCASBINC CXMOV BX,COUNTSUB BX,CXLEA DI,str2LEA SI,stringADD SI,BXREP MOVSBLEA DX,stringMOV AH,9INT 21HLEA DX,str3MOV AH,9INT 21HLEA DX,str2MOV AH,9INT 21H数据的输入与输出(DOS功能调用)
DOS功能调用磁盘输入输出功能调用书P118表4-7-1举例:书P118例4-50程序结束返回DOSINT20HMOVAH,4CHINT21H高级汇编语言技术
宏汇编若程序中经常要用到一个程序段,可以将其定义成一条宏指令(宏定义)在源程序中可用这条宏指令代替所定义的程序段(宏调用)当汇编程序处理到宏指令时,会自动用宏体代换它而扩展成原来的程序段(宏扩展)用途:简化源程序书写,接收参数能力强,功能更
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国有线通讯器材市场调查研究报告
- 2025年中国带锁笔记本市场调查研究报告
- 2025年中国山梨糖醇市场调查研究报告
- 2025年中国固体多用酸洗缓蚀剂市场调查研究报告
- 2025年中国卷筒式纱窗外套市场调查研究报告
- 离婚协议书的公证与法律保障
- 2025-2030无源元件行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 2025-2030新能源客车市场前景分析及投资策略与风险管理研究报告
- 2025-2030数码摄像行业市场发展分析及发展趋势与投资战略研究报告
- 2025-2030影视广告行业竞争格局分析及投资前景与战略规划研究报告
- 消防更换设备方案范本
- 合伙开办教育培训机构合同范本
- 嵌入式机器视觉流水线分拣系统设计
- 《电力建设工程施工安全管理导则》(nbt10096-2018)
- 江苏省盐城市东台市第一教育联盟2024-2025学年七年级下学期3月月考英语试题(原卷版+解析版)
- 湖南省2025届高三九校联盟第二次联考历史试卷(含答案解析)
- 2024年全国职业院校技能大赛(高职组)安徽省集训选拔赛“电子商务”赛项规程
- 2025年中考数学复习:翻折问题(含解析)
- (统编版2025新教材)语文七下全册知识点
- 家具全屋定制的成本核算示例-成本实操
- 第二单元第1课《精彩瞬间》第2课时 课件-七年级美术下册(人教版2024)
评论
0/150
提交评论