微机原理与接口技术-第4章 汇编语言程序设计(2)_第1页
微机原理与接口技术-第4章 汇编语言程序设计(2)_第2页
微机原理与接口技术-第4章 汇编语言程序设计(2)_第3页
微机原理与接口技术-第4章 汇编语言程序设计(2)_第4页
微机原理与接口技术-第4章 汇编语言程序设计(2)_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

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

文档简介

微机原理与接口技术尹作友1顺序结构;分支结构;循环结构;子程序结构;综合举例;内容提要§4-4程序设计方法§4-4程序设计方法——概述

2§4-4程序设计方法——概述

DOS系统功能调用INTn

软中断指令,该指令执行一次就调用一个相应的中断服务程序。其中:

n=0~4;8088/8086CPU占用

n=5~1FH;为BIOS的各功能子程序

n=20~3FH;为DOS的各功能子程序。其中INT21是一个具有100多个子功能的中断服务程序,分别用于设备管理,目录管理,文件管理及其它功能。3常用DOS功能表§4-4程序设计方法——概述

功能号nAH置入口参数执行INT21H分析出口参数INT21的使用方法:4§4-4程序设计方法——概述

▲一个好的程序应该具备的特点:

⑴程序结构模块化,程序易读,易调试及维护。

⑵执行速度快。

⑶占用内存空间小。概述5§4-4程序设计方法——概述

▲设计汇编语言源程序的基本步骤:

⑴分析问题抽象数学模型,确定实现算法。

⑵绘制程序流程图粗框图

细框图。图例如图5-1所示。

⑶分配存储空间、工作单元分配数据段、堆栈段、程序段的位置,确定寄存器主要作用。

⑷编写程序

⑸静态检查,上机调试

⑹程序运行,结果分析。6§4-4程序设计方法——概述

▲常用四种程序结构顺序结构,分支结构,循环结构,子程序结构。7例:通过人机对话从键盘输入一字符串,存入BUFIN为首地址的内存区,并在显示器显示该字符串。内存区长度20H实际输入字符串长度输入字符1输入字符2::输入字符n回车符$BUFINBUFIN+1BUFIN+2=BUFINI显示提示DOYOUWANTTOINPUTSTRING?(Y/N)等待键盘输入应答Y/N键盘输入Y显示提示PLEASEINPUTSTRING键盘输入字符串存入BUFIN计算输入字符串长度,并将字符串结尾加$显示输入的字符串返回DOSNDONE功能号AH

09H01H09H0AH09H4CH§4-4程序设计方法——概述

8DATA SEGMENTSTRING1 DB‘DOYOUWANTTOINPUT’DB‘STRING?(Y/N)’,0DH,0AH,‘$’STRING2 DB‘PLEASEINPUTSTRING.’ DB0DH,0AH,‘$’BUFIN DB20H,?;20H为设置长度,?为实际输入长度BUFINI DB20HDUP(?);实际输入的字符串存放区DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,ES:DATASTART PROCFARBEGING:PUSHDS MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX

§4-4程序设计方法——概述

9

MOVES,AX;定义使用DS,ES

LEADX,STRING1 MOVAH,09H INT21H;显示STRING1提示

MOVAH,01H INT21H;从键盘输入1个字符至ALCMPAL,‘Y’ JNEDONE

LEADX,STRING2 MOVAH,09HINT21H ;显示STRING2提示

LEADX,BUFIN MOVAH,0AH INT21H;从键盘输入字符串至BUFIN§4-4程序设计方法——概述

10MOVAL,BUFIN+1CBW;计算BUFIN末地址LEASI,BUFIN+2ADDSI,AX;SI指向原输入回车位置MOV[SI],‘$’;字符串结尾为$MOVAH,09HLEADX,BUFIN+2INT21H;显示输入的字符串,无长度DONE:RETSTART ENDPCODE ENDSENDBEGIN

§4-4程序设计方法——概述

11DATA SEGMENTSTRING1 DB‘DOYOUWANTTOINPUT’DB‘STRING?(Y/N)’,0DH,0AH,‘$’STRING2 DB‘PLEASEINPUTSTRING.’ DB0DH,0AH,‘$’BUFIN DB20H,?;20H为设置长度,?为实际输入长度BUFINI DB20HDUP(?);实际输入的字符串存放区DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,ES:DATASTART PROCFARBEGING:PUSHDS MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX

§4-4程序设计方法——概述

12

MOVES,AX;定义使用DS,ES

LEADX,STRING1 MOVAH,09H INT21H;显示STRING1提示

MOVAH,01H INT21H;从键盘输入1个字符至ALCMPAL,‘Y’ JNEDONE

LEADX,STRING2 MOVAH,09HINT21H ;显示STRING2提示

LEADX,BUFIN MOVAH,0AH INT21H;从键盘输入字符串至BUFIN§4-4程序设计方法——概述

13

MOVAL,BUFIN+1CBW;计算BUFIN末地址

LEASI,BUFIN+2ADDSI,AX;SI指向原输入回车位置

MOV[SI],‘$’;字符串结尾为$

MOVAH,09HLEADX,BUFIN+2INT21H;显示输入的字符串,无长度DONE:MOVAH,4CHINT21HRETSTART ENDPCODE ENDSENDBEGIN

§4-4程序设计方法——概述

14§4-4程序设计方法——顺序结构

简单程序,程序顺序执行,无分支、循环,也无转移,图中没有判断框。程序执行按照IP内容自动增加的顺序进行。在流程图中,处理框一个接一个执行,既无分支,也无循环和转移。是一种简单的程序结构。

一、顺序结构S1S2S315§4-4程序设计方法——顺序结构

例5-1内存中TABLE开始存放0~9的平方值,通过人机对话,当任给定一个数X(0~9),查表得X的平方值,放在AL中。解: DATA SEGMENTTABLE DB 0,1,4,9,16,25,36,49,64,81BUF DB ‘Pleaseinputonenumber(0~9):’,0DH,0AH,‘$’ DATA ENDS STACK SEGMENTPARASTACK‘STACK’TOPDB 50DUP(?)STACK ENDS 16§4-4程序设计方法——顺序结构

CODESEGMENT ASSUMECS:DATA,DS:DATA,SS:STACKSTART:MOV AX,DATA ;段初始化

MOVDS,AXMOVAX,STACKMOVSS,AX MOV SP,SIZETOP MOV BX,OFFSETTABLENEXT:MOV DX,OFFSETBUF ;9号功能调用,提示输入一个数(P158)MOV AH,9INT21H17§4-4程序设计方法——顺序结构

MOV AH,1;1号功能调用,键入数送AL INT 21H MOV AH,0 ;查表得输入数的平方值

AND AL,0FH ADD BX,AX MOV AL,[BX]MOV AH,4CH;返回操作系统

INT 21HCODE ENDS ENDSTART18§4-4程序设计方法——顺序结构

例1:两个32位无符号数的乘法ABCD*+B*D部分积1最后乘积A*D部分积2B*C部分积3A*C部分积4BBX+0+2+4+6+8+A+C+EADC*+和1积3*积1*积2+积1H*积4和2H+积1L积1H和1L和1H和2L和2H和3L和3H乘法运算过程示意图19§4-4程序设计方法——顺序结构

设地址指针被乘数的低16位B送AX乘数的低16位D送SI乘数的高16位C送DIB×D存部分积1被乘数的高16位A送AXA×D=部分积2部分积2L+部分积1H进位加至部分和1H,存内存B×C=部分积3部分积3+部分和1,存内存A×C=部分积4存进位部分积4+部分和2H+进位=和3存和3返回20§4-4程序设计方法——顺序结构

DATASEGMENTMULNUMDW0000,0FFFFH,0000,0FFFFH,4DUP(?)DATAENDSSTACKSEGMENTPARASTACK’STACK‘STAKDB100DUP(?)

TOPEQULENGTHSTAKSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATABEGIN:

MOVAX,DATA;送数据段段地址

MOVDS,AXMOVES,AXMOVAX,STACK;送堆栈段段地址

MOVSS,AXMOVSP,OFFSETTOP;堆栈段偏移量送SP21§4-4程序设计方法——顺序结构

LEABX,MULNUMMULU32:MOVAX,[BX];B送AXMOVSI,[BX+4];D送SIMOVDI,[BX+6];C送DIMULSI;B*DMOV[BX+8],AX;保存部分积1MOV[BX+0AH],DXMOVAX,[BX+2];A送AXMULSI;A*DADDAX,[BX+0AH]ADCDX,0;部分积2L与部分积1H相加

MOV[BX+0AH],AX;存和1MOV[BX+0CH],DXMOVAX,[BX];B送AXMULDI;C*B,部分积322§4-4程序设计方法——顺序结构

ADDAX,[BX+0AH];部分积3与和1相加

ADCDX,[BX+0CH]MOV[BX+0AH],AX;存和2MOV[BX+0CH],DXPUSHF;保护进位位

MOVAX,[BX+2];A送AXMULSI,;A×C,得积4POPF;恢复进位位

ADCAX,[BX+0CH];部分积4L与和2H相加

ADCDX,0MOV[BX+0CH],AXMOV[BX+0EH],DX;存和3MOVAH,4CHINT21HCODEENDSENDBEGIN

23§4-4程序设计方法——分支结构

1.分支结构:根据不同条件程序选择不同的处理方法时,运用分支结构。如图5-2所示。二、分支结构24§4-4程序设计方法——分支结构例3:在以BUF为首地址的内存,存放着一个长度为N(N<256)的字符串,编程统计其中数字,字母和其它字符的个数,统计数存放在串后三个单元中。初始化:N送CX;

0送DX;0送BX;BX为串偏移量‘0’—‘9’30H—39H‘A’—’Z’41H—5AH25§4-4程序设计方法——分支结构初始化取一字符送AL(AL)≥30H(AL)>39H(AL)≥41H(AL)>5AHDH+1DL+1(CX)=0修改BX及(CX)-1NNNNNYYYYYADH送内存ADL送内存AL=N-DH-DLAL送内存返回DOS26§4-4程序设计方法——分支结构

2.多分支:

依次测试多个条件是否满足:若满足转入相应分支入口;不满足继续向下测试,直到全部测试完。此方法编程简单直观,但速度慢。要依次检查才能进入到要求的入口地址。

例5-3有8个加工子程序,入口地址分别为P1,P2,…P8。编程实现检测键盘输入命令,使系统分别转向8个加工子程序。解:相应程序如下:27§4-4程序设计方法——分支结构

MOV AH,1 INT 21H;1号功能键调用,键盘接收(P154\156)

CMP AL,‘1’;键值为1,转1号加工子程序

JE P1;相等ZF=1

CMP AL,‘2’ ;键值为2,转2号加工子程序

JE P2 … CMP AL,‘8’ JE P8 ;键值非1~8,转向停止

JMP ST P1: … ;1号加工子程序

JMPST P2: … P3: … … P8: … ST:HLT28§4-4程序设计方法——分支结构

3.跳转表实现多分支:

好处:可以克服上述缺点,直接找到相应的跳转入口。实现:要先在存储器中建立跳转表:表中包括每个分支的入口地址、跳转指令或关键字。29§4-4程序设计方法——分支结构⑴根据表内地址分支:表中存放:每个分支程序的入口地址。要找到表地址,即可得到每个分支的入口地址。表地址=跳转表首地址+偏移地址如图4-9跳转表在内存中的存放方法P0LP0HP1LP1H.........BASE+0BASE+2P0P1LEABX,BASEANDAL,0FHADDAL,ALADDBX,AXJMPWORDPTR[BX]30§4-4程序设计方法——分支结构

⑵根据表内指令分支:表内存放:转移指令。查表后程序转到相应子程序。转移指令跳转表存放形式如图5-5。31§4-4程序设计方法——分支结构

例5-5将例5-3程序用跳转表来安排指令实现分支。解:建立跳转表:

DATA SEGMENT BASE DBE9,P1低,Pl高,E9… DBE9……E9,P8低,P8高

DATA ENDS有关程序段为: MOV AH,1 ;键入到AL INT 21H AND AL,0FH MOV AH,0 MOV BL,AL ;AL为键值

ADD AL,AL ADD AL,BL ;偏移量=键值×3 MOV BX,OFFSETBASE ;基地址

ADDBX,1 ADD BX,AX ;表地址

JMP BX

;转入转移指令(P102/103)32§4-4程序设计方法——分支结构

⑶根据关键字分支:表中存放:关键字,及相应分支地址。图5-6给出了关键字跳转表的格式;图5-7给出了关键字分支流程图。33§4-4程序设计方法——循环程序结构例4:首地址为BUFFER的数组已按升序排好,长度为N(=10),在数组中查找数M(=80),若找到则从数组中删掉,否则将它插入正确的位置,DX中记录数组最后的长度。34§4-4程序设计方法——循环程序结构9810253698908270585348AX≠CX=9AX≠CX=8AX≠CX=7AX≠CX=6AX≠CX=5AX≠CX=4AX≠CX=3AX≠CX=2AX≠CX=1AX≠CX=0AX=80CX=10DX=10AX≥BUFFER[SI]9082AX≥BUFFER[SI-2]AX≥

BUFFER[SI-2]80DX=11AX≥BUFFER[SI-2]若数组中无M寻找插入位置SI=2*(DX–1)CMPAX,BUFFER[SI]

搜索有无关键字MOVDI,OFFSETBUFFERCLDREPNESCASW元素下移MOVBX,BUFFER[SI]MOVBUFFER[SI+2],BX插入MOVBUFFER[SI+2],AX35§4-4程序设计方法——循环程序结构10253698908070585348AX≠CX=9DI=BUFFER+2AX≠CX=8DI=BUFFER+4AX≠CX=7DI=BUFFER+6AX≠CX=6DI=BUFFER+8AX≠CX=5DI=BUFFER+AAX≠CX=4DI=BUFFER+CAX≠CX=3DI=BUFFER+EAX=CX=2DI=BUFFER+10HAX=80CX=10DI=BUFFER9098BX=[DI]=(BUFFER+10H)DI-2CX-1=1BX=[DI+2]=(BUFFER+12H)DI-2CX-1=0DX=9若数组中有数M

搜索有无关键字MOVDI,OFFSETBUFFERCLDREPNESCASW

搜索到,后续元素前移MOVBX,[DI]MOV[DI-2],BXADDDI,236§4-4程序设计方法——循环程序结构初始化串扫描查找找到插在SI所指单元后关键字>[SI](CX)=0数组元素下移修改比较指针SI数组长度+1设置串尾比较指针SIDI所指元素上移修改比较指针DINYYNY数组长度-1(CX)-1=0YNN结束初始化:M送AX;N送CX,DX;地址偏移量送DI;增量修改指针CLD37§4-4程序设计方法——循环程序结构DATASEGMENTBUFFERDW5,10,32,47,53,77,89,106,115,124NDB10MEQU80DATAENDSCODESEGEMENTASSUMECS:CODE,DS:DATA,ES:DATAMAINPROCFARSTART:PUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVES,AX;

MOVAX,M;待查数送AXMOVCX,N;数组长度送CXMOVDX,NMOVDI,OFFSETBUFFERCLDREPNESCASW;串扫描查找38§4-4程序设计方法——循环程序结构

JEDEL;查到,ZF=1DECDX;未查到,插入

MOVSI,DX;关键字与最后数比较

ADDSI,DXL1:CMPAX,BUFFER[SI]JLL2;关键字比数组中某个字小,转L2MOVBUFFER[SI+2],AX;大,则插在后面

JMPL3L2:

MOVBX,BUFFER[SI];数组下移一位

MOVBUFFER[SI+2],BXSUBSI,2JMPL1L3:ADDDX,1;修改长度

JMPNEXT1DEL:JCXZNEXT;找到,删此元素DEL1:MOVBX,[DI];其后元素依次前移

MOV[DI-2],BXADDDI,2LOOPDEL1NEXT:

DECDX;改变数组长度NEXT1:

RETMAINENDPCODEENDSENDSTART39§4-4程序设计方法——循环程序结构1.循环程序的两种结构形式:▲“先执行后判断”进入循环后至少要执行一次循环体,再判断循环是否结束。适合于循环次数固定的程序。▲“先判断后执行”进入循环后,先判断循环结束条件,再决定是否执行循环体,可能循环体一次也不执行。适合于循环次数不固定的程序。如图5-8所示。三、循环程序结构40§4-4程序设计方法——循环程序结构41§4-4程序设计方法——循环程序结构两种循环结构都包括四部分:⑴初始化设置循环计数值,设置变量初值。⑵循环体循环部分的核心:循环的全部执行指令。⑶修改参数修改操作数地址,为下次循环作准备。⑷循环控制修改计数器值,判断循环控制条件,决定是否跳出循环。42§4-4程序设计方法——循环程序结构

例4-59将BX中的16进制数转换为ASCII码,存放到BUF开始的内存单元中去,并在屏幕显示出数值。

解:本程序编写采用“先执行后判断”的结构。流程图如图5-9所示。43§4-4程序设计方法——循环程序结构DSEGSEGMNETBUFDB4DUP(?)DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEG MOVDS,AXLEA SI,BUF ;设置内存地址

MOV CH,4 ;计数初值=4 NEXT:

MOVCL,4 ROL BX,CL ;最高位移到右边

MOV AL,BL ;一个数转换成ASCII码

AND AL,0FH ADD AL,30H 44§4-4程序设计方法——循环程序结构

CMP AL,3AH;字符为A~F吗?

JL STOREADD AL,7STORE:MOV [SI],AL ;字符存入内存

MOV AH,2;调用屏幕显示(P161) MOV DL,AL INT 21H INC SI ;修改计数并判断

DEC CH JNZ NEXT;循环判断

MOVAH,4CH ;循环结束,返回DOSINT21HCSEGENDSENDSTART45§4-4程序设计方法——循环程序结构

例5-9AX寄存器中有一个16位二进制数,编程统计其中1的个数,结果放到CL寄存器。解:相应程序如下

…… MOVCX,16 ;初始化

MOVDL,0 L1:

SAL AX,1 ;循环体

JNCL2;CF=0跳转

INC DL;CF=1,DL+1 L2:

LOOPL1 ……46§4-4程序设计方法——循环程序结构

…… MOVCL,0 ;初始化

L1:

AND AX,AX ;控制循环

JZ STOP;AX=0,跳出

SAL AX,1 ;循环体

JNCL2;CF=0跳转

INC CL;CF=1,CL+1 L2:

JMP L1 STOP:……47例:存储在BLOCK为首地址内存中10个16bit带符号数,找出最大值后存在MAX单元中。§4-4程序设计方法——循环程序结构AX大数CMPCMP大数BLOCK取一次比较9次交换(待定)48§4-4程序设计方法——循环程序结构DATASEGMENT;数据段说明开始

BLOCKDW65C8H,-35,694AH,……,0A398HCOUNTDW10MAXDW?;设置MAX的内存空间DATAENDS;数据段说明结束CODESEGMENT;代码段说明开始

ASSUMECS:CODE,DS:DATABEGIN:MOVAX,DATAMOVDS,AX;设置本程序的DS

LEABX,BLOCK;本程序的运行程序开始

MOVAX,[BX]INCBXINCBXMOVCX,COUNT49AGAIN:CMPAX,[BX]JGNEXTMOVAX,[BX]NEXT:INCBXINCBXLOOPAGAINMOVMAX,AX;本程序运行结束

MOVAH,4CH;调用内部中断返回DOSINT21HCODEENDS;代码段结束说明

ENDBEGIN;编译结束说明§4-4程序设计方法——循环程序结构501.在DAT1单元开始存放10字节(字)的有符号(无符号数),统计正数(负数)、奇数(偶数)个数、求和、平均值,结果存在DAT2单元2.在DATA1单元开始存放10个字符串,统计大写(小写、数字)的个数,结果存在DATA2单元3.将一个字数据(AX)的十六进制数转换为对应的ASIIC码,结果存在DATA单元。51§4-4程序设计方法——循环程序结构

2.多重循环:即循环体当中又有循环,循环中包含另一个循环。每一循环都有各自的循环计数器和终点判断。多重循环程序的设计方法与单循环程序相同,但应注意:各重循环的初始条件的控制;内循环可以嵌套在外循环中,也可以几个内循环并列在外循环中,但各层循环之间不能交叉,内循环可以跳到外循环中,不可以从外循环直接跳进内层循环;不能让循环回到初始条件,以免出现死循环。52如果一个循环程序的循环体内还包含有一个或多个循环结构的程序,那么这个程序称为双重或多重循环结构程序。我们先用软件延时程序来说明多重循环程序的结构。

SOFTDLY: MOV BL,10DELAY:

MOV CX,2801WAIT0: LOOP WAIT0;内循环延时

DEC BL

JNZ DELAY此程序每次内循环时,CX由2801减至零,BL维持不变。外循环进行10遍。此程序虽然简单,但是其结构是双重循环。§4-4程序设计方法——循环程序结构53

内存DATA开始存放100个单字节数据。编写程序统计这些数据内“0”和“1”个数相等的数据有多少,将结果存入NUMB单元。完成此例需要一个数据一个数据地检查0和1是否相等,相等时则计数加1,直到100个数据检查完毕。§4-4程序设计方法——循环程序结构54

DSEGSEGMENTDATADB 15H,27H,94H;共100个数

DB 11H,3B,48H,...NUMBDB 0DSEGENDSCSEGSEGMENT ASSUME CS:CSEG,DS:DSEGSTART:MOV AX,DSEG MOV DS,AX MOV SI,OFFSETDATA MOV CL,100 XOR AL,AL§4-4程序设计方法——循环程序结构55

RPT2: MOV CH,08H XOR BH,BH MOV AH,[SI]RPT1: ROR AH,1 JNC CHT1 INC BHCHT1:DEC CH JNZ RPT1 CMP BH,04 JNZ CHT2 INC ALCHT2:INC SI DEC CL JNZ RPT2 MOV DNUMB,AL MOV AH,4CH INT 21HCSEG ENDS END START§4-4程序设计方法——循环程序结构ADCBH,056§4-4程序设计方法——子程序结构1.子程序使用:子程序:将多次使用的程序段写成一个相对独立的程序段,称为子程序或过程。子程序结构的定义:使用过程定义语句PROC…ENDP。属性:调用程序和过程在同一代码段中,则用NEAR属性;调用程序和过程不在同一代码段中,使用FAR属性。主过程定义为FAR属性,看作DOS调用的一个子过程。四、子程序结构57子程序说明:⑴功能描述:名称,功能及性能⑵寄存器,存储单元⑶入口参数,出口参数⑷调用其它子程序的名称§4-4程序设计方法——子程序结构例5-11有一个子程序说明如下:;名称:BCD2BIN;功能:将一个字节的BCD码转换成二进制数;所用寄存器:CX;入口参数:AL存放两位BCD码;出口参数:AL存放二进制数;调其它子程序:无子程序形式如下;58§4-4程序设计方法——子程序结构BCD2BIN PROC NEAR(或FAR) PUSH CX

MOV CH,AL AND CH,0FH ;存低8位

MOV CL,4 SHR AL,CL;高8位右移4位后乘10 MOV CL,10 MUL CL ADD AL,CH;高8位加低8位

POP CX RETBCD2BIN ENDP59§4-4程序设计方法——循环程序结构例:把二进制数码串中每一字节的两位十六进制数转换为ASCII码。高位在高地址,低位在低地址。BUFFERSTRINGA42C533B413443323335423360§4-4程序设计方法——循环程序结构主程序输入参数:1、待转换的二进制数AL2、存放ASCII码的地址指针输出参数:1、转换的ASCII码放入SI间址的内存2、修改后的SI指针16进制数首地址→BXASCII码首地址→SI16进制数长度→CXASCII码长度→L2取待转换数→

AL→DL分离出低4位分离出高4位右移四位调用CHANGE子程序(CX)-1=0结束AGAINN调用CHANGE子程序Y(AL)<10(AL)+07H→AL(AL)+30H→AL(AL)→(SI)(SI)+1→SI返回DOSADD_0CHANGE子程序框图YN61DATA SEGMANTSTRING DB34H,98HBUFFERDB2*2DUP(?);设置4字节存放空间DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA§4-4程序设计方法——循环程序结构62BEGIN:MOVAX,DATA MOVDS,AX;置本程序的DS MOVCX,2 LEABX,STRING;置源操作数指针

LEASI,BUFFER;置目的操作数指针

AGAIN:MOVAL,[BX];取源操作数,存入ALDL MOVDL,AL ANDAL,0FH;使高4为0,底4位保留

CALLCHANGE;调子转换为ASCII存入内存§4-4程序设计方法——循环程序结构63

MOVAL,DL;恢复原操作数

PUSHCX;因移位使用CL原CX入栈保护

MOVCL,4;原高4位到低4

SHRAL,CL;高4位为0 POPCX;原CX恢复

CALLCHANGE;调子转换为ASCII存入内存

INCBX;修改源操作数指针

LOOPAGAIN,判循环终点

MOVAH,4CHINT21H§4-4程序设计方法——循环程序结构64CHANGEPROC; CHANGE子程序说明

CMPAL,10 JLADD_0 ADDAL,7;操作数可用表达式,其中’’表示ASCII码,结果是加07HADD_0:ADDAL,30H MOV[SI],AL;送结果

INCSI RETCHANGEENDPCODE ENDSENDBEGIN§4-4程序设计方法——循环程序结构65§4-4程序设计方法——子程序结构注意:⑴保护调用程序的断点(CSIP):由CALL指令本身完成。要注意堆栈的使用,防止弹出地址值错误。⑵保护某些寄存器内容:在子程序开头,用一组PUSH指令,保护的寄存器原来的内容;在子程序结尾,用一组POP指令,将寄存器原来的内容恢复。注意PUSH和POF指令组的使用次序。⑶主程序与子程序相互之间参数的传递:参数传递的方法有3种:①用寄存器传递参数:适合参数较少,速度较快。②用存储器传递参数:适合参数较多,需事先在存储器中建立参数表。③用堆栈传递参数:适合参数较多,多用在子程序嵌套与递归调用中。664-5程序设计方法七、参数传递技术(一)利用寄存器传递参数例如在某子程序中要对两个长度相同的数据缓冲区进行操作,可在主程序中把缓冲区的长度和首址存入寄存器中。MOVCX,LENGTHMOVBX,OFFSETBUFFER1MOVSI,OFFSETBUFFER2CALLSUBR§4-4程序设计方法——子程序结构67例:编程实现数组段分别求和(不计溢出)。DATASEGMENTARY1DW100DUP(?)SUM1DW?ARY2DW100DUP(?)SUM2DW?DATAENDSSTACKSEGMENTSTACKSADW50DUP(?)TOPEQULENGTHSASTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOV

温馨提示

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

评论

0/150

提交评论