【例】试编写一程序计算以下表达式的值。
w = (v- (x * y + z -540 )) /x式中x、y、z、v均为有符号字数据。
设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中,程序的流程图如图所示。
DATA SEGMENTX DW 200Y DW 100Z DW 3000V DW 10000W DW 2 DUP (?)DATA ENDSSTACK SEGMENT STACKDB 200 DUP (0)STACK ENDSCODESEGMENTASSUME DS DATA CS: CODE SS: STACKSTART MOV AX DATAMOV DS AX ; DATA>AXMOV AX XIMUL Y ; (X) * (DX AXMOV CX AXMOV BX,DX ;(DX AX)TBX:CX)MOV AX,ZCWD ;(Z)符号扩展ADD CX,AXADC BX,DX;(BX: CX)+( DX:AX)BX:CX)SUB CX,540SBB BX,0 ;( BX:CX) - 5 40~BX:CX)MOV AX,VCWD ;(V)符号扩展SUB AX,CXSBB DX,BX ;( DX:AX)-((BX CX DX: AX)IDIV X ;( DX:AX)/XMOV W,AX ;商5MOV W+2 DX ;余数D©W+2MOV AH,4CHINT 21HCODEENDS ;退出DOS 状态END START【例】已知某班学生的英语成绩按学号(从 1 开始)从小到大的顺序排列在要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。
编写程序如下: STACK SEGMENT STACKDB 200 DUP(0)STACK ENDSDATA SEGMENTTAB DB 80 ,85,86,71,79,96DB 83 ,56,32,66,78,84NO DB 10ENGLIST DB ?DATA ENDSCODE SEGMENTASSUME DS: DATA,SS: STACK,CS: CODEBEGIN: MOV AX,DATAMOV DS,AXLEA BX,TABMOV AL,NODEL ALXLAT TABMOV ENGLIS,H ALMOV AH,4CHINT 21HCODEENDSTAB表中,END BEGIN【例】已知在内存中有一个字节单元NUM存有带符号数据,要求计算出它的绝对值后, 放入RESULT^元中。
题目分析:根据数学中绝对值的概念知道,一个正数的绝对值是它本身,而一个负数的绝对值是它的相反数;要计算一个数的相反数,需要完成减法运算,即用0减去这个数。
8086/8088指令系统中有专门的求相反数的指令NEG初奶化 [柏X中的迥禅HX TJ A】一中DATA SEGMENTX DB -25RESULT DB ?DATA ENDSCODE SEGMENTASSUME DS:DATA,CS:CODESTART: 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 ;返回DOSCODE ENDSEND START【例】编写计算下面函数值的程序:1 X>0Y= 0 X=0-1 X<0设输入数据为X 、输出数据Y ,且皆为字节变量。
程序流程图如下图所示。
DATA SEGMENT X DB -25 Y DB ? DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AX ;初始化 MOV AL,X ;X 取到AL 中CMP AL,0 ; Al中内容和0比较JGE BIG ;大于等于0,转BIG MOV BL,-1 ;否则为负数,—1送BL JMP EXIT;转到结束位置 BIG: JE EE ; Al中内容是否为0,为0转EEMOV BL,1;否则为大于0, 1送BLJMP EXIT;转到结束位置 EE:MOV3L,0 ; 0 送 BL EXIT: MOV Y,BL;BL 中内容送Y 单元MOV AH,4CHINT 21H ;程序结束CODE ENDSEND START;汇编结束 【例】试编一程序,求三个带符号字数据中的最大值,并将最大值存入例程忌沆尸国MAX 字单元中。
设三个带符号数分别在三个字变量X、Y、Z 中存储。
程序流程图如下图所示STACK SEGMENT STACKDB 200 DUP (0)STACK ENDSDATA SEGMENTX DW 00ABHY DW - 5Z DW 200MAX DW ?DATA ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART :MOV AX,DATAMOV DS,AXMOV AX,XCMP AX , Y ; X> Y?JG L1MOV AX ,Y ;Y> Z?CMP AX ,ZJG EXITL2:MOV AX,ZJMP EXITL1:CMP AX,Z ;X> Z?JLE L2EXIT: MOV MAX AXMOV AH, 4CHINT 21HCODE ENDSEND START【例】设某程序有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 CODESTART MOV AX DATAMOV DS AXMOVAL NDEL ALADD AL, ALMOV BL ALMOVBH 0JMP TAB[BX]P1:JMP EXITP2: ……JMP EXIT P2: ……JMP EXIT P3: ……JMP EXITP8: ……EXIT:1MOV AH 4CHINT 21HCODE ENDSEND START【例】已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数。
显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。
其程序流程图如下图所示。
例】编写程序完成求1+ 2 + 3+……N的累加和,直到累加和超过1000为止。
统计被累加的自然数的个数送CN单元,累加和送SUM流程图如下图所示。
DATA SEGMENT SUM DW ? CN DW ?DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AX ;初始化 MOV AX,0; 0 送 AXMOV BX,0 ; 0 送 BXLP:INC BX; BX 加 1ADD AX,BX ;求累加和CMP AX,1000 ;比较 JBE LP; <1000 转MOV SUM,AX MOV CN,BX ;送结果MOV AH,4CH INT 21H;返回 DOS CODE ENDSEND START;汇编结束【例】在以BUF 为首址的字存储区中存放有 N 个有符号数, 在BUF 存储区中,试编写其程序。
现需将它们按大到小的顺序排列 例化K f?序说程囲我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较, 如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。
可以看出,第一遍需比较( N-1 )次,此时,最小的数已经放到了最后; 第二遍比较只需考虑剩下的 (N-1)个数,即只需比较(N-2)次; 第三遍只需比较(N-3)次,……整个排序过程最多需( N-1 )遍。
如下面的4个数即是采用冒泡排序比较的例子。
数10 816 90 32第一遍 1016 90 32 8第二遍 16 90 32 10 8 第三遍 90 32 16 10 8 程序流程图如图所示。
S45視厚法租图」DATASEGMENTBUF DW 3, -4 , 6, 7, 9, 2, 0, -8 , -9 , -10 , 20 N= ($ -BUF ) /2 DATAENDSSTACK SEGNMENT STACK DB 200 DUP (0) STACK ENDS CODESEGMENTtcK 1? -Dy. 0 - E 乩(CK) -1- CXASSUME CS:COD,E DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV CX,NDEC CXLOOP1: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 CXJNE LOOP2MOV CX,DXLOOP LOOP1MOV AH,4CHINT 21HCOD E NDSEND START程序运行后,BUF区中的内容如下:20 ,9,7,6 ,3 ,2,0 ,-4 ,-8 ,-9 ,-10若要对N个无符号数按由大到小的顺序排列,只需将指令“ JGE L”改为“ JAE L”即可。
【例】将一个给定的二进制数按位转换成相应的ASCII 码字符串,送到指定的存储单元并显示。
如二进制数转换成字符串为‘'。
要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16 倍二进制数的转换。
入口参数:DX存放待转换的二进制数CX存放待转换数的位数(8位或16位)DI 存放ASCII 码首地址出口参数:转换后的字符串存放在以DI 作指针的字节存贮区中程序清单:DATASEGMENTNUM8 DB 93HNUM16 DW 0ABCDHASCBUF DB 20 DUP(0)DATAENDSCODESEGMENTASSUME DS:DATA,CS:CODE,SS:STACK START:MOV AX,DATAMOV DS,AXMOV DX,0MOV DL,NUM8 ;转换二进制数送DXMOV CX,8 ;置位数8LEA DI , ASCBUF ;字符串首址DICALL BTASC ;调用子程序BTASCMOV [DI] ,BYTE PTR 0DH MOV [DI+1] ,BYTE PTR 0AH MOV[DI+2] ,BYTE PTR ‘$' LEA DX,ASCBUFMOV AH,9INT 21HMOV DX,NUM16MOV CX,16 ;置位数16LEA DI,ASCBUF CALL BTASCMOV [DL] ,BYTE PTR 0DH MOV [DL+1],BYTE PTR 0AH MOV [DL+2],BYTE PTR ‘$';LEA DX,ASCBUF显示转换后的字符串MOV AH,9INT 21HBTASC PROCPUSH AX ;保存AXMOV AL,0 CMP CX,8 ;比较8 位数JNE L1 ;直接转换16 位数MOV DH,DL ; 8 位数转换送DHL1 : ROL DX,, 1 ; DX最高位移入CFRCL AL, 1 ; CF移入AL最低位ADD AL, 30HMOV [DI] , ALINC DI LOOP L1 POP AXRETBTASC ENDP COD E NDS END START。