《汇编语言程序例题》由会员分享,可在线阅读,更多相关《汇编语言程序例题(11页珍藏版)》请在金锄头文库上搜索。
1、【例5.1】试编写一程序计算以下表达式的值。=(v-(*+-540)/x 式中x、v均为有符号字数据。 设、的值存放在字变量、V中,结果存放在双字变量之中,程序的流程图如图5.1所示。DATA SEGMENTXDW200YDW100ZDW3000VDW10000WDW2 DUP(?)DATA ENDSSTACK SEGMENT STACK DB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACKSTART:MOVAX,DATAMOVDS,AX;DATAAXMOVAX,X IMUL Y;(X)*(Y)DX:AXMOVCX
2、,AXMOVBX,DX;(DX:AX)(BX:CX)MOVAX,ZCWD;(Z)符号扩展ADDCX,AXADCBX,DX;(BX:CX)+(DX:AX)(BX:CX)SUBCX,540SBBBX,0;(BX:CX)-540(BX:CX)MOVAX,V CWD;(V)符号扩展SUB AX,CXSBB DX,BX;(DX:AX)-(BX:CX)(DX:AX)IDIV X;(DX:AX)/XMOV W,AX;商WMOV W+2,DX;余数DXW+2MOV AH,4CHINT 21HCODE ENDS;退出DOS 状态END START 【例5.2】已知某班学生的英语成绩按学号(从1开始)从小到大的顺
3、序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下:STACK SEGMENT STACKDB200 DUP(0)STACK ENDSDATA SEGMENTTABDB 80,85,86,71,79,96 DB 83,56,32,66,78,84NODB 10ENGLISTDB ?DATA ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODEBEGIN:MOVAX,DATAMOVDS ,AXLEABX,TAB MOVAL,NODELALXLATTABMOVENGLISH,ALMOVAH,4CHINT21H
4、CODE ENDSENDBEGIN【例5.3】已知在内存中有一个字节单元NUM,存有带符号数据,要求计算出它的绝对值后,放入RESULT单元中。 题目分析:根据数学中绝对值的概念知道,一个正数的绝对值是它本身,而一个负数的绝对值是它的相反数;要计算一个数的相反数,需要完成减法运算,即用0减去这个数。8086/8088指令系统中有专门的求相反数的指令NEG。DATASEGMENT X DB -25 RESULT DB ?DATAENDSCODESEGMENT ASSUME DS:DATA,CS:CODESTART:MOVAX,DATA MOVDS,AX ;初始化 MOVAL,X ;X取到AL中T
5、EST AL,80H ;测试AL正负 JZ NEXT ;为正,转NEXT NEG AL ;否则AL求补NEXT:MOV RESULT,AL;送结果 MOV AH,4CH INT 21H ;返回DOSCODEENDS END START【例5.4】编写计算下面函数值的程序: 1X0Y=0X=0 -1X0 设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如下图所示。DATA SEGMENT X DB -25 Y DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX ;初始化 MOV AL,X ;
6、X取到AL中CMPAL,0;Al中内容和0比较JGEBIG;大于等于0,转BIGMOVBL,-1;否则为负数,1送BLJMPEXIT;转到结束位置BIG: JEEE;Al中内容是否为0,为0转EEMOVBL,1;否则为大于0,1送BLJMPEXIT;转到结束位置EE:MOVBL,0;0送BLEXIT: MOV Y,BL;BL中内容送Y单元 MOV AH,4CH INT 21H;程序结束CODE ENDS END START;汇编结束【例5.5】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如下图所示STACKS
7、EGMENT STACK DB 200 DUP(0)STACKENDSDATASEGMENTX DW 00ABHY DW 5Z DW 200MAXDW ?DATAENDSCODESEGMENTASSUME DS:DATA,SS:STACK,CS:CODE START:MOVAX,DATA MOVDS,AX MOVAX,X CMPAX,Y;XY? JGL1 MOVAX,Y;YZ? CMPAX,Z JGEXITL2: MOVAX,Z JMPEXITL1:CMPAX,Z;XZ?JLEL2EXIT:MOVMAX,AX MOVAH,4CH INT21HCODEENDSENDSTART【例5.6】设某程序
8、有8路分支,试根据给定的N值(18),将程序的执行转移到其中的一路分支。程序流程如图下所示。DATASEGMENTTABDW P1,P2,P3,P4,P5,P6,P7,P8N DB 5DATAENDSSTACKSEGMENT DB 200 DUP(0)STACKENDSCODESEGMENT ASSUME DS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAL,NDELALADDAL,ALMOVBL,ALMOVBH,0JMPTABBXP1:JMPEXITP2:JMPEXITP2:JMPEXITP3: JMPEXITP8:EXIT:MOVAH,
9、4CH INT21HCODEENDS ENDSTART【例5.7】已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数。显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。其程序流程图如下图所示。例5.8】编写程序完成求123N的累加和,直到累加和超过1000为止。统计被累加的自然数的个数送CN单元,累加和送SUM。流程图如下图所示。DATA SEGMENT SUM DW ? CN DW ?DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX ;初始化 MOV A
10、X,0 ;0送AXMOV BX,0 ;0送BXLP: INC BX ;BX加1 ADD AX,BX ;求累加和 CMP AX,1000;比较 JBE LP ;1000转 MOV SUM,AX MOV CN,BX ;送结果 MOV AH,4CH INT 21H ;返回DOSCODE ENDS END START ;汇编结束【例5.9】在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。可以看出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三遍只需比较(N-3)次,整个排序过程最多需(N-1)遍。如下面的4个数即是采用冒泡排序比较的例子。数108169032第一遍101690328第二遍169032108第三遍903216108程序流程图如图5.9所示。DATASEGMENTBUFDW 3,-4,6,7,9,2,0,-8,-9,-10,20N=(-BUF)/2DATAENDSSTACKSEGNMENT STACKDB 200 D