当前位置:文档之家› 汇编语言程序例题

汇编语言程序例题

【例5.1】试编写一程序计算以下表达式的值。

w=(v-(x*y+z-540))/x式中x、y、z、v均为有符号字数据。

设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中,程序的流程图如图5.1所示。

DATA SEGMENTX DW 200Y DW 100Z DW 3000V DW 10000W DW 2 DUP(?)DATA ENDSSTACK SEGMENT STACKDB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK START: MOV AX,DATAMOV DS,AX ;DATA→AXMOV AX,XIMUL Y ;(X)*(Y)→DX:AXMOV CX,AXMOV BX,DX ;(DX:AX)→(BX:CX)MOV AX,ZCWD ;(Z)符号扩展ADD CX,AXADC BX,DX;(BX:CX)+(DX:AX)→(BX:CX)SUB C X,540SBB BX,0 ;(BX:CX)-540→(BX:CX)MOV AX,VCWD ;(V)符号扩展SUB AX,CXSBB DX,BX;(DX:AX)-(BX:CX)→(DX:AX)IDIV X ;(DX:AX)/XMOV W,AX ;商→WMOV W+2,DX ;余数DX→W+2MOV AH,4CHINT 21HCODE ENDS ;退出DOS 状态END START【例5.2】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB 表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。

编写程序如下:STACK SEGMENT STACKDB 200 DUP(0)STACK ENDSDATA SEGMENTTAB DB 80,85,86,71,79,96DB 83,56,32,66,78,84 NO DB 10ENGLIST DB ?DATA ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODE BEGIN:MOV AX,DATAMOV DS ,AXLEA BX,TABMOV AL,NODEL ALXLAT TABMOV ENGLISH,ALMOV AH,4CHINT 21HCODE ENDSEND BEGIN【例5.3】已知在内存中有一个字节单元NUM,存有带符号数据,要求计算出它的绝对值后,放入RESULT单元中。

题目分析:根据数学中绝对值的概念知道,一个正数的绝对值是它本身,而一个负数的绝对值是它的相反数;要计算一个数的相反数,需要完成减法运算,即用0减去这个数。

8086/8088指令系统中有专门的求相反数的指令NEG。

DATA SEGMENTX DB -25RESULT DB ?DATA ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE START: MOV AX,DATAMOV DS,AX ;初始化MOV AL,X ;X取到AL中TEST AL,80H ;测试AL正负JZ NEXT ;为正,转NEXTNEG AL ;否则AL求补NEXT: MOV RESULT,AL ;送结果MOV AH,4CHINT 21H ;返回DOS CODE ENDSEND START【例5.4】编写计算下面函数值的程序:1 X>0Y= 0 X=0-1 X<0设输入数据为X、输出数据Y,且皆为字节变量。

程序流程图如下图所示。

DATA SEGMENTX DB -25Y DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX ;初始化MOV AL,X ;X取到AL中CMP AL,0 ;Al中内容和0比较JGE BIG ;大于等于0,转BIGMOV BL,-1 ;否则为负数,-1送BLJMP EXIT ;转到结束位置BIG: JE E E ;Al中内容是否为0,为0转EEMOV BL,1 ;否则为大于0,1送BLJMP EXIT ;转到结束位置EE:MOV BL,0 ;0送BLEXIT: MOV Y,BL ;BL中内容送Y单元MOV AH,4CHINT 21H ;程序结束CODE ENDSEND START ;汇编结束【例5.5】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。

设三个带符号数分别在三个字变量X 、Y 、Z 中存储。

程序流程图如下图所示STACKSEGMENT STACKDB 200 DUP(0)STACK ENDSDATA S EGMENTX DW 00ABHY DW –5Z DW 200MAX D W ?DATA E NDSCODE S EGMENTASSUME DS:DATA,SS:STACK,CS:CODE START:M OV AX,DATAM OV DS,AXM OV AX,XCMP AX,Y ;X>Y?J G L1MOV AX,Y ;Y>Z?CMP AX,ZJ G EXITL2:MOV AX,ZJMP E XITL1:C MP AX,Z ;X>Z?JLE L2EXIT:MOV MAX,AXMOV AH,4CHINT 21HCODE ENDSEND START【例5.6】设某程序有8路分支,试根据给定的N值(1~8),将程序的执行转移到其中的一路分支。

程序流程如图下所示。

DATA SEGMENTTAB DW P1,P2,P3,P4,P5,P6,P7,P8N DB 5DATA ENDSSTACK SEGMENTDB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODE START:M OV AX,DATAMOV DS,AX┆MOV AL,NDEL ALADD AL,ALMOV BL,ALMOV BH,0JMP T AB[BX]P1:……┆JMP E XITP2:……┆JMP E XITP2:……┆JMP E XITP3:……┆JMP E XIT┆P8:……┆EXIT:MOV AH,4CHINT 21HCODE ENDSEND START【例5.7】已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数。

显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。

其程序流程图如下图所示。

例5.8】编写程序完成求1+2+3+……N的累加和,直到累加和超过1000为止。

统计被累加的自然数的个数送CN单元,累加和送SUM。

流程图如下图所示。

DATA SEGMENTSUM DW ?CN DW ? DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAM OV DS,AX ;初始化M OV AX,0 ;0送AXMOV BX,0 ;0送BXLP: INC BX ;BX加1ADD AX,BX ;求累加和CMP AX,1000 ;比较JBE LP ;≤1000转MOV SUM,AXMOV CN,BX ;送结果MOV AH,4CHINT 21H ;返回DOSCODE ENDSEND START ;汇编结束【例5.9】在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。

我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。

可以看出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三遍只需比较(N-3)次,……整个排序过程最多需(N-1)遍。

如下面的4个数即是采用冒泡排序比较的例子。

数10 8 16 90 32第一遍10 16 90 32 8第二遍16 90 32 10 8第三遍90 32 16 10 8程序流程图如图5.9所示。

DATA SEGMENTBUF DW 3,-4,6,7,9,2,0,-8,-9,-10,20 N=($-BUF)/2DATA ENDSSTACK SEGNMENT STACKDB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATAMOV DS,AXMOV CX,NDEC C XLOOP1:MOV DX,CXMOV BX,0LOOP2:MOV AX,BUF[BX]CMP AX,BUF[BX+2]JGE LXCHG AX,BUF[BX+2]MOV BUF[BX],AXL:ADD BX,2DEC C XJNE LOOP2MOV CX,DXLOOP LOOP1MOV AH,4CHINT 21HCODE ENDSEND START程序运行后,BUF区中的内容如下:20,9,7,6,3,2,0,-4,-8,-9,-10若要对N个无符号数按由大到小的顺序排列,只需将指令“JGE L”改为“JAE L”即可。

【例5.10】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。

如二进制数10010011转换成字符串为‘10010011’。

要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。

入口参数:DX存放待转换的二进制数CX存放待转换数的位数(8位或16位)DI存放ASCII码首地址出口参数:转换后的字符串存放在以DI作指针的字节存贮区中程序清单:DATA SEGMENTNUM8 DB 93HNUM16 DW 0ABCDHASCBUF DB 20 DUP(0)DATA ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV DX,0MOV DL,NUM8 ;转换二进制数送DXMOV CX,8 ;置位数8LEA DI,ASCBUF ;字符串首址→DICALL BTASC ;调用子程序BTASCMOV [DI],BYTE PTR 0DHMOV [DI+1],BYTE PTR 0AHMOV [DI+2],BYTE PTR ‘$’LEA DX,ASCBUFMOV AH,9INT 21HMOV DX,NUM16MOV CX,16 ;置位数16LEA DI,ASCBUFCALL BTASCMOV [DL],BYTE PTR 0DHMOV [DL+1],BYTE PTR 0AHMOV [DL+2],BYTE PTR ‘$’;显示转换后的字符串LEA DX,ASCBUFMOV AH,9INT 21HBTASC PROCPUSH AX ;保存AXMOV AL,0CMP CX,8 ;比较8位数JNE L1 ;直接转换16位数MOV DH,DL ;8位数转换送DH L1:R OL D X,,1 ;DX最高位移入CF RCL AL,1 ;CF移入AL最低位ADD AL,30HMOV [DI],ALINC DILOOP L1POP AXRETBTASC ENDPCODE ENDSEND START感谢下载!欢迎您的下载,资料仅供参考。

相关主题