汇编语言程序设计46~68节_第1页
汇编语言程序设计46~68节_第2页
汇编语言程序设计46~68节_第3页
汇编语言程序设计46~68节_第4页
汇编语言程序设计46~68节_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

4.6.1顺序结构程序设计顺序结构程序也称为简单程序,这种结构的程序是按顺序执行下来的,程序本身的逻辑很简单,只要能正确安排有关语句的顺序,即可解决问题。4.6汇编语言程序设计在汇编语言程序中,主要有四种结构:顺序程序、分支程序、循环程序、子程序。顺序程序分支程序循环程序子程序图4-3四种基本程序结构的示意图例4-10编程实现123*456→M MDD? MOVAX,123 MOVBX,456 MULBX MOVM,AX MOVM+2,DX4.6.1顺序结构程序设计例4-11从键盘上键入0至9中任一个自然数,求其立方值。数据段定义如下:DATASEGMENTINPUTDB‘PLEASEINPUTX(0~9):$’TABDW0,1,8,27,64,125,216,343,512,729XDB?XXXDW?DATAENDS4.6.1顺序结构程序设计程序段如下:

INT 21H;用9号功能显示字符串MOV AH,1INT 21H;从键盘输入一个字符ALAND AL,0FHMOV X,AL;将ASCII码转换成真值

ADD AL,ALMOV BL,ALMOV BH,0;计算在表中的偏移量送BXMOV AX,TAB[BX];查表获得立方值

MOV XXX,AX;将立方值保存在XXX单元

4.6.1顺序结构程序设计4.6.2分支结构程序设计N分支1YNY分支2条件

1.利用比较与条件转移实现分支

例4-13求两个无符号数差的绝对值,结果存放在D1单元中。DATASEGMENT

D1 DB?

D2 DB0F5H,68HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA BX,D2MOV AL,[BX];取第1个数

INC BX4.6.2分支结构程序设计MOV CL,[BX];取第2个数CMP AL,CL;两个数比较JAE BIGR;大于等于,则转BIGRSUB CL,AL;否则,第2个数减第1个数MOV D1,CL;两数差的绝对值存D1单元JMP RSTBIGR:SUB AL,CL;第1个数减去第2个数MOV D1,ALRST:MOV AH,4CHINT 21HCODEENDSEND START4.6.2分支结构程序设计例4-14设在A、B、C字型变量中存放着3个数,若3个数均不为0,则求出它们的和(不考虑溢出)存入D单元。DATASEGMENTA DW108B DW0C DW45D DW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX4.6.2分支结构程序设计MOV BH,0;BH淸0MOV D,0;变量D淸0CMP A,0;判断变量A是否为0JNE NT1;A非0则转去判断变量BINC BH;A为0则BH加1NT1:CMPB,0 ;判断变量B是否为0JNE NT2;B非0则转去判断变量CINC BH;B为0则BH加1NT2:CMPC,0;判断变量C是否为0JNE NT3;C非0则转去判断寄存器

INCBH4.6.2分支结构程序设计NT3:CMPBH,0;判断寄存器BH是否为0JNE EXIT;BH非0则程序结束

MOV AX,A;BH为0则求和并存入D单元

ADD AX,BADD AX,CMOV D,AXEXIT:MOVAH,4CHINT 21HCODEENDSENDSTART4.6.2分支结构程序设计2利用跳转表实现分支

条件分支1分支2分支n……例4-15某工厂有n+1种产品R0、R1、R2、...、Rn的加工程序,分别存放在PR0、PR1、PR2、...PRn为首地址的内存区域中。而这n+1个首地址的偏移量连续存放在以BASE为基地址的跳转表中。已知产品编号存放在NUM单元中,要求编写程序,能够根据产品编号转至相应的处理程序。DATASEGMENTBASEDWPR0,PR1,PR2,...,PRn

;定义跳转表NUM DB4DATAENDS4.6.2分支结构程序设计CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXXORAX,AX;清AXMOVAL,NUM;取加工的产品编号iADDAX,AX;2*i,获得偏移量

MOVBX,OFFSETBASE;获得跳转表首地址

ADDBX,AX;获得对应的单元地址

JMPBX;转入相应的加工子程序

MOVAH,4CH;程序结束

INT21H4.6.2分支结构程序设计PROPROC NEAR;加工子程序

...PR0ENDP

;PR1PROC NEAR...PR1ENDP

...PRnPROC NEAR...PRnENDPCODEENDSEND START4.6.2分支结构程序设计PR0BASEPR0PRnPR1PR2PRn….…4.6.2分支结构程序设计

图4-5例4-15的跳转表

4.6.3循环结构程序设计1.循环程序结构可分为五个部分。(1)初始化部分设置循环的初始值,是循环的准备部分。(2)循环体部分这是循环程序的主体,用来完成主要的计算任务和操作。(3)循环修改部分修改循环工作部分的变量地址等,为下一次循环作准备。(4)循环控制部分修改循环次数计数器并判断结束条件。(5)结束部分循环结束后,用于分析和存放结果。4.6.3循环结构程序设计2循环的控制方法

(1)计数控制用于循环次数已知的情况。通常采用CX寄存器为循环计数器。循环计数控制一般用LOOP指令实现。(2)条件控制用于循环次数未知,但却已知一些循环或不循环的条件。(3)逻辑尺控制这是汇编语言循环程序设计独有的方式。所谓逻辑尺,是指具有一定长度的一串二进制数。该方式按照逻辑尺的指示,决定对循环体中某一部分的执行或不执行。

4.6.3循环结构程序设计3.循环程序设计举例

例4-16编程计算Y=a1+a2+…+a100。(其中ai为16位二进制整数,设和值不大于16位二进制整数表数范围)

DATASEGMENTTAB DWa1,a2,...,a100Y DW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX

4.6.3循环结构程序设计XOR AX,AX;初始化部分,累加和清0LEA BX,TAB ;BX指向加数首地址

MOV CX,100 ;设置减计数初值LP:ADD AX,[BX];循环体开始,累加

INC BX;修改部分,修改BX

INC BXLOOP LP;控制部分,CX减计数

MOV Y,AX;结束部分,存放结果

MOV AH,4CHINT 21HCODEENDSEND START4.6.3循环结构程序设计例4-17写一个把字符串中的所有大写字母改写为小写字母的程序。设字符串以‘$’结尾。DATASEGMENTSTRINGDB‘IamAStudent!’,’$’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV SI,OFFSETSTRING;取串首地址AGAIN:MOV AL,[SI];取一字符

CMP AL,‘$’;是否到字符串尾4.6.3循环结构程序设计JEOK;到字符串尾,跳出循环

CMPAL,‘A’;否则,判断是否为大写字母

JB NEXT;否,转继续

CMPAL,‘Z’JA NEXT;否,转继续

ORAL,20H;是大写字母,改为小写字母NEXT:INCSI;调整指针

JMPAGAIN;继续循环OK:MOVAH,4CH;结束

INT21HCODEENDSENDSTART4.6.3循环结构程序设计例4-18设计一个程序判断无符号字型数组BUFFER的若干个元素中是否含有数字0,如有则把第一个0元素所在存储单元的偏移地址送字型变量ADDR,如没有则将该变量的值置为0FFFFH。数据段定义如下:DATASEGMENTBUFFERDW23,65,89,……COUNTEQU$-BUFFER;元素个数

ADDDRDW?DATAENDS4.6.3循环结构程序设计程序段如下:

MOVBX,OFFSETBUFFER;数组地址到BXMOVCX,COUNT;置循环最大次数AGAIN:MOVAX,[BX];取一元素

CMPAX,0;与0比较

JZYES;相等则跳出循环

ADDBX,2;修改地址指针

LOOPAGAIN;循环控制

MOVADDR,0FFFFH;没找到

JMPEXITYES:MOV ADDR,BX;找到EXIT:......;结束4.6.3循环结构程序设计例4-19设字型数组X、Y分别有12个元素,试形成一个Z数组,使该数组的各元素满足以下关系:Z0=X0+Y0Z1=X1+Y1Z2=X2-Y2Z3=X3+Y3Z4=X4+Y4Z5=X5+Y5Z6=X6+Y6Z7=X7-Y7Z8=X8-Y8Z9=X9+Y9Z10=X10+Y10Z11=X11-Y11逻辑尺的定义:用0表示加运算,用1表示减运算,则12个式子的运算操作按Z11,Z10,Z9,…,Z0的顺序可表示为二进制数100110000100。为存放这个二进制数,可在内存中定义一个字变量,将二进制数作为该变量的低12位,变量的高4位无意义。

4.6.3循环结构程序设计数据段定义如下:DATASEGMENTXDW3,65,96,45,86,8,50,7,76,45,75,5YDW9,45,23,6,74,8,21,45,12,4,64,87ZDW12DUP(?)RULERDW0000100110000100BDATAENDS主要程序段如下:……

MOV BX,0;置地址指针

MOV CX,12;置循环次数

MOVDX,RULER4.6.3循环结构程序设计AGAIN:MOVAX,X[BX];取数组X一元素

SHRDX,1;逻辑尺右移一位

JCSUBS;移出位为1则相减

ADDAX,Y[BX];否则相加

JMPNEXTSUBS:SUBAX,Y[BX]NEXT:MOVZ[BX],AX;将结果存入Z数组

ADDBX,2;修改地址指针

LOOPAGAIN;循环控制EXIT:MOV ......;结束4.6.3循环结构程序设计例4-20用冒泡排序法对有符号字型数组ARY按升序排列。下面是对有7个元素的无序表进行冒泡排序:表的初始状态:[36486698751328]第一遍比较之后:[364866751328]98第二遍比较之后:[3648661328]7598第三遍比较之后:[36481328]667598第四遍比较之后:[361328]48667598第五遍比较之后:[1328]3648667598第六遍比较之后:132836486675984.6.3循环结构程序设计数据段定义如下:DATASEGMENTARY DW n1,n2,n3,……N EQU ($-ARY)/2;数组元素个数DATAENDS主要程序段定义如下:……MOVCX,N-1;置外循环次数LOOP1:PUSHCX;保存外循环计数器的值MOVBX,0;置地址指针4.6.3循环结构程序设计LOOP2:MOVAX,ARY[BX];取前面元素到AXCMPAX,ARY[BX+2];与后面元素比较

JLEOK;次序正确则转到下一步

XCHGAX,ARY[BX+2];否则,交换位置

MOVARY[BX],AXOK:ADD BX,2;修改地址指针

LOOPLOOP2;内循环控制

POPCX;将CX恢复为外循环计数器值

LOOPLOOP1;外循环控制……4.6.3循环结构程序设计

4.6.4子程序设计

1.子程序的调用和返回

SP返回地址偏移CSIP返回地址偏移IPCSSP返回地址段值返回地址段值CALL指令执行后RET指令执行后要实现子程序的正确调用返回,必须注意:(1)正确定义子程序的类型。(2)CALL和RET指令必须成对出现。(3)正确使用堆栈。

4.6.4子程序设计

2.保存和恢复寄存器

典型的保护和恢复寄存器编程举例如下:子程序名PROCNEAR(或FAR)PUSHAX;保护现场PUSHBXPUSHCXPUSHDXPUSHF...

4.6.4子程序设计

...POPF;恢复现场POPDXPOPCXPOPBXPOPAXRET子程序名ENDP

4.6.4子程序设计

3.主程序和子程序之间的参数传送方法

参数传送的主要方法有以下几种:(1)通用寄存器传送参数。主程序调用子程序时,将要传送的参数装入某些指定寄存器;子程序返回时也将结果装入指定的寄存器。(2)存储单元传送参数。指定某些存储单元存放主程序与子程序之间要传递的参数。(3)堆栈传送参数。主程序把参数或参数地址压入堆栈,子程序通过访问堆栈取得参数。

4.6.4子程序设计

4.子程序说明信息

子程序的说明信息至少应该包含下面几个部分:;子程序名:‥‥‥‥‥‥;功能:‥‥‥‥‥‥;入口参数:‥‥‥‥‥‥;出口参数:‥‥‥‥‥‥;其它说明:‥‥‥‥‥‥

4.6.4子程序设计

例4-21编写一个对字型数组各元素求和的子程序(不考虑进位),并在主程序中调用该子程序分别求字型数组A1和A2的各元素之和。(1)使用通用寄存器传递参数DATASEGMENTA1DW30H,20H,10,30H,6BHN1EQU($-A1)/2;获得A1元素的个数

SUM1DW?;存放数组A1的和

A2DW45,12,-4,89,6CH,0DH,35N2EQU($-A2)/2;获得A2元素的个数

SUM2DW?;存放数组A2的和DATAENDS

4.6.4子程序设计

主要程序如下:......LEABX,A1;传送数组A1的地址到BXMOVCX,N1;传送A1的元素个数到CXLEASI,SUM1;传送SUM1的地址到SICALLARY_SUM;调用子程序对数组A1求和LEABX,A2;传送数组A2的地址到BXMOVCX,N2;传送A2的元素个数到CXLEASI,SUM2;传送SUM2的地址到SICALLARY_SUM;调用子程序对数组A2求和MOVAH,4CHINT21H

4.6.4子程序设计

;子程序名:ARY_SUM;功能:求字型数组各元素之和。

;入口参数:BX=数组地址;CX=数组元素个数;SI=存和地址

;出口参数:无ARY_SUMPROCNEARPUSHAXXORAX,AX;AX清零

4.6.4子程序设计

AGAIN:ADDAX,[BX];对数组求和

ADDBX,2LOOPAGAINMOV[SI],AX;存和

POPAXRETARY_SUMENDPCODEENDSENDSTART

4.6.4子程序设计

(2)使用存储单元传递参数数据段定义如下:DATASEGMENTA1DW30H,20H,10,30H,6BHN1EQU($-A1)/2;获得A1数组元素的个数

SUM1DW?A2DW45,12,-4,89,6CH,0DH,35N2EQU($-A2)/2;获得A2数组元素的个数

SUM2DW?TABLEDW3DUP(?);定义参数表DATAENDS

4.6.4子程序设计

调用子程序对数组A1求和:LEABX,TABLE;将参数表地址传送BXLEA AX,A1;将数组A1参数填入参数表

MOV [BX],AXMOV AX,N1MOV [BX+2],AXLEA AX,SUM1MOV [BX+4],AXCALLARY_SUM;调用子程序对数组A1求和

4.6.4子程序设计

;子程序名:ARY_SUM;功能:求字型数组各元素之和。

;入口参数:BX=参数表地址;;参数1=数组地址;参数2=元素个数;参数3=存和地址

;出口参数:无ARY_SUMPROCNEARPUSHAXPUSHCXPUSHSIMOVSI,[BX];取参数1到SIMOVCX,[BX+2];取参数2到CXXORAX,AX

4.6.4子程序设计

AGAIN:ADDAX,[SI];对数组求和

ADDSI,2LOOPAGAINMOVSI,[BX+4];取参数3到SIMOV[SI],AX;存和

POPSIPOPCXPOPAXRETARY_SUMENDPCODEENDSENDSTART

4.6.4子程序设计

(3)使用堆栈传递参数调用子程序对数组A1求和:LEAAX,A1;数组A1的相关参数入栈

PUSHAXMOVAX,N1PUSHAXLEAAX,SUM1PUSHAXCALLARY_SUM

4.6.4子程序设计

;子程序名:ARY_SUM;功能:求字型数组各元素之和。

;入口参数:使用堆栈传递参数。;参数入栈顺序:1.数组地址;2.数组元素个数;3.存和地址

;出口参数:无ARY_SUMPROCNEARPUSHAXPUSHCXPUSHSIPUSHBPMOVBP,SPMOVSI,[BP+10];取数组地址到SIMOVCX,[BP+12];取元素个数到CX

XORAX,AXAGAIN:ADDAX,[SI];用循环语句对数组求和

ADDSI,2LOOPAGAINMOVSI,[BP+14];取存和地址到SIMOV[SI],AX;将数组和存入指定地址

POPBPPOPSIPOPCXPOPAXRET6

4.6.4子程序设计

数组地址数组元素个数存和地址IPAXCXSIBP……SPBPBP+10BP+12BP+14图4-8取得入口参数时堆栈的情形例4-22

基数转换子程序。将寄存器AX中的16位无符号二进制数转换为P进制数,并将P进制数转换成ASCII码存放。;子程序名:RADIX;功能:将寄存器AX中的16位无符号二进制数转换为P进制数;入口参数:AX=待转换的数,BX=数制基P,;SI=存放ASCII码的字节数组地址;出口参数:无4.7

实用程序设计举例RADIXPROCFARPUSHCXPUSHDXMOVCX,0LOP1:MOVDX,0DIVBX;待转换的数存放在AX,BX存放要转换

PUSHDX;的数制基数P,(AX)除以P,余数入栈

INCCX;记录余数个数

ORAX,AXJNELOP1;(AX)不等于0,转LOP1LOP2:POPAX;从堆栈中弹出一位P进制数字

CMPAL,104.7

实用程序设计举例JBL1ADDAL,7L1:ADDAL,30H;转换成ASCII码

MOV[SI],AL;保存

INCSIDECCXJNELOP2POPDXPOPCXRETRADIXENDP4.7

实用程序设计举例例4-23有一个100个字节的数据表(有符号数),存放在数据段中,表内各数已按升序排列好,现给定一元素,试编写程序从表内查找给定元素,若有则结束,否则将该元素顺序插入表中,并修改表长。DATASEGMENTLTHDB100;表长

TABDB02H,12H,14H,...;100个字节的升序表

TEMDBX;给定元素DATAENDS4.7

实用程序设计举例CODESEGMENTASSUMECS:CODE,DS:DATASATRT:MOVAX,DATAMOVDS,AXLEABX,TABMOVAL,TEMMOVCX,LTHLOP:CMPAL,[BX];在表中查找

JESOP;找到则结束

JLINST;若给定元素小于表内元素,转INSTINCBX;大于则取下一个元素进行比较

LOOPLOPMOV[BX],AL;给定元素一直大于表内元素

JMPJUST;插入表末INST:MOVAH,[BX];暂存表中元素暂存入AHMOV[BX],AL;表中插入给定元素

MOVAL,AHINCBXLOPI:MOVAH,[BX];暂存表中下一个元素

MOV[BX],AL;将前一个暂存的元素存入表中

MOVAL,AHINCBXDECCXJNZLOPIJUST:INCLTH;修改表长SOP:MOVAH,4CHINT21HCODEENDSENDSTART例4-24编程实现:先接受一个字符串,然后分别统计其中数字字符和英文字符的个数,最后用十进制数的形式显示它们。

DATASEGMENTBUFFDB255;缓冲区长度

DB?;键入字符实际长度

DB255DUP(0)MESS0DB0DH,0AH,‘PLEASEINPUT:$’MESS1DB0DH,0AH,‘LENGTH=$’MESS2DB0DH,0AH,‘DIGITAL=$’MESS3DB0DH,0AH,‘CHARACT=$’DATAENDS4.7

实用程序设计举例CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,OFFSETMESS0;显示提示信息0CALLDISPMESSMOVDX,OFFSETBUFF;接收一个字符串

MOVAH,10INT21HMOVBH,0;清数字计数器

MOVBL,0;清字符计数器

MOVCL,BUFF+1;取字符串长度4.7

实用程序设计举例MOVCH,0JCXZCOK;若长度为0,不统计

MOVSI,OFFSETBUFF+2;指向字符串首址

AGAIN:MOVAL,[SI]INCSICMPAL,‘0’;判断是否数字字符

JBNEXTCMPAL,‘9’JANODECINCBH;字符计数器加1JMPSHORTNEXT;提前结束本次循环4.7

实用程序设计举例

NODEC:ORAL,20H;转换为小写

CMPAL,‘a’;判断是否英文字母

JBNEXTCMPAL,‘z’JANEXTINCBL;字母计数器加1NEXT:LOOPAGAIN

COK:MOVDX,OFFSETMESS1;显示字符串长度

CALLDISPMESSMOVAL,BUFF+1XORAH,AHCALLDISPL4.7

实用程序设计举例MOVDX,OFFSETMESS2;显示数字字符个数

CALLDISPMESSMOVAL,BHXORAH,AHCALLDISPLMOVDX,OFFSETMESS3;显示字母个数

CALLDISPMESSMOVAL,BLXORAH,AHCALLDISPLMOVAH,4CH

INT21H4.7

实用程序设计举例;子程序名:DISPL;功能:8位无符号二进制数转换为十进制数并显示;入口参数:AL=待转换的8位数;出口参数:无DISPLPROCPUSHDXPUSHCXMOVDL,10;置除数

MOVCX,0DISP1:XORAH,AHDIVDLPUSHAX;保存商和余数

INCCX;统计除10的次数4.7

实用程序设计举例CMPAL,0JNZDISP1DISP2:POPAX;取商和余数到AXADDAH,30H;将余数转换成字符并显示

MOVDL,AHMOVAH,2INT21HLOOPDISP2POPCXPOPDXRETDISPLENDP4.7

实用程序设计举例;子程序名:DISPMESS;功能:显示提示信息;入口参数:DX=提示信息地址;出口参数:无

DISPMESSPROCPUSHAXMOVAH,9INT21HPOPAXRETCODEENDSENDSTART4.7

实用程序设计举例4.8.1上机开发过程(1)建立汇编源程序文件(.ASM)用编辑程序,例如

温馨提示

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

评论

0/150

提交评论