1、汇编语言小程序例子汇编语言小程序例子1. 编写统计AX中1、0个数的源程序。1的个数存入CH,0的个数存入CL。CODE SEGMENTASSUME CS:CODESTART: MOV CX, 0MOV DX,17AA1: SUB DX, 1JZ AA3SHL AX, 1JNC AA2INC CHJMP AA1AA2: INC CLJMP AA1AA3: MOV AH,4CHINT 21HCODE ENDSEND START2. 编写比较两个字符串STRING1和STRING2所含字符是否完全相同的源程序,若相同则显示“MATCH”,若不相同则显示“NO MATCH”。程序:DATA SEGM
2、ENTR1 DB MATCH,0AH,0DHR2 DB NO MATCH,0AH,0DHSTRING1 DB XXXXXN1 EQU $-STRING1STRING2 DB YYYYYN2 EQU $-STRING2DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV AX,N1CMP AX,N2JNZ AA1ADD AX,1LEA SI,STRING1LEA DI,STRING2AA2: MOV BL,SIMOV BH,DIINC SIINC DISUB AX,1JZ AA3CMP BL,BHJZ
3、AA2JMP AA1AA3: LEA BX,R1MOV CX,7AA4: MOV DL,BXINC BXMOV AH,2INT 21HLOOP AA4JMP EAA1: LEA BX,R2MOV CX,10AA5: MOV DL,BXINC BXMOV AH,2INT 21HLOOP AA5E: MOV AH,4CHINT 21HCODE ENDSEND START3. 从键盘读入一个四位的十六进制数,CRT显示等值的二进制数.由于每个十六进制数位对应4个二进制,所以每读入一个十六进制位后,即可将其对应的4个二进制位依次输出。由于数字 的ASC码为30H39H,字母af与 AF的ASC码为61
4、H66H 与41H46H ,因此,如果输入的字母为数字,则其低位即为对应的二进制位;如果输入的字符为字母或,则需要减,然后通过移位将低位依次输出。汇编程序如下:DATA SEGMENTMSG1 DB Hex:,$MSG2 DB 0DH,0AH,Binary:,$COUNT EQU 4BUF DB 4 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX, DATAMOV DS, AXLEA DX, MSG1MOV AH, 9INT 21HMOV CX, COUNTMOV SI, 0INPUT: ;通过四次循环从键盘读入四位
5、十六进制数MOV AH, 1INT 21HMOV BUFSI, ALDEC CXINC SICMP CX, 0JNZ INPUTNEXT3: LEA DX, MSG2MOV AH, 9INT 21HMOV CX, COUNTMOV SI, 0NEXT2: MOV BL, BUFSICMP BL , 9JBE OK ; 读入的字符转向OK:SUB BL, 7 ;读入字符= 9 减7OK: PUSH CXMOV CL ,4SHL BL, CL ; 逻辑左移4位,低4位高4位MOV CX, 4 ; 4次循环将当前处理字符的4位二进制输出NEXT1: MOV DL, 0SHL BL, 1JNC SKI
6、PINC DLSKIP: MOV AH, 2INT 21HLOOP NEXT1POP CX ;INC SILOOP NEXT2 ; 4次循环将4位十六进制数,每位转换为对应的4位二进制EXIT: MOV AH, 4CHINT 21HCODE ENDSEND START4. 设从STRING开始存放一个以$为结束标志的字符串,试编写把字符串中的字符进行分类的源程序,数字字符送入NUM开始的内存中,大写字母送入BCHAR开始的内存区中,小写字母存入LCHAR开始的内存中,其他字符存入OTHER开始的内存区中。DATA SEGMENTSTRING DB abc123ABC,$N EQU $-STRI
7、NGNUM DB N DUP(?)BCHAR DB N DUP(?)LCHAR DB N DUP(?)OTHER DB N DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA BX,STRINGDEC BXLEA SP,BCHARLEA CX,LCHARLEA DX,OTHERLEA SI,NUMAA1:INC BXMOV AL,BX /判断是否为$,是否结束CMP AL,$JZ AA5CMP AL,30H /判定数字字符JC AA4CMP AL,39HJA AA2MOV SI,ALINC
8、 SIJMP AA1AA2:CMP AL,41H /判定大写字母JC AA4CMP AL,5AHJA AA3MOV DI,SPMOV DI,ALINC SPJMP AA1AA3:CMP AL,61H /判定小写字母JC AA4CMP AL,7AHJA AA4MOV DI,CXMOV DI,ALINC CXJMP AA1AA4:MOV DI,DX /判定其他MOV DI,ALINC DXJMP AA1AA5:MOV AH,4CH / 返回DOS 结束INT 21HCODE ENDSEND START5. 试编写找出首地址为BUF数据块中的最小偶数(该数据块中有100个带符号字节数),并以十六进制
9、的形式显示在CRT上的源程序。答:DATA SEGMENTBUF DB 100 DUP(?) ;要比较的数DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA BX,BUF ;BUF首地址送BXMOV CL,101 ;循环控制MOV DL,126 ;DL存放最小偶数MOV AH,0 ;标志是不是有偶数LOOP1:DEC CL ;循环计数减1JZ TOEND ;ZF标志0则跳转MOV AL,BX ;BX内存内容送ALINC BX ;BX指向下一内存单元SHR AL,1 ;AL逻辑右移一位JC LOOP1
10、;是基数则接着循环SHL AL,1 ;是偶数,因为上面右移了 左移得到原数值MOV AH,1 ;能进行这一步 则说明数值中有偶数CMP AL,DL ;与CH比较大小JGE LOOP1 ;AL大DL小 则循环MOV DL,AL ;保证DL存放最小偶数JMP LOOP1 ;CL不为0 继续循环TOEND:CMP AH,1JC L ;有借位则说明数值中无偶数直接返DOSMOV BL,DLSHR DL,1SHR DL,1SHR DL,1SHR DL,1AND DL,0FHCMP DL,10JB L4ADD DL,7L4:ADD DL,30H ;显示高四位对应的十六进制的ascii码MOV AH,2IN
11、T 21HMOV DL,BLAND DL,0FHCMP DL,10JB L6ADD DL,7L6:ADD DL,30H ;显示低四位对应的十六进制的ascii码MOV AH,2INT 21HMOV DL,H ;显示HMOV AH,2INT 21HL:MOV AH,4CH ;返回DOSINT 21HCODE ENDSEND START6. 已知数据块BUFA中存放15个互不相等的字节数据,BUFB中存放20个互不相等的字节数据,试编写将既在BUFA中出现,又在BUFB中出现的数据存放到BUFC开始的缓冲区中的源程序。答:DATA SEGMENTBUFA DB 41H,42H,43H,44H,45
12、H,46H,47H,48H,49H,4AH,4BH,4CH,4DH,4EH,4FHBUFB DB 31H,32H,33H,41H,42H,43H,44H,45H,46H,47H,48H,49H,4AH,4BH,4CHDB 50H,51H,52H,53H,54HBUFC DB 15 DUP (0)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXLEA SI,BUFALEA BX,BUFCMOV CX,15 ;外层循环计数AA1: MOV AH,20 ;内层循环20次MOV AL,SILEA DI,BUFB
13、AA2: CMP AL,DI :比较BUFA , BUFB内容JNZ AA3 ;内容不同,跳至AA3MOV BX,AL ;内容相同,将其存入BUFC单元INC BXJMP AA4 ;找到相同内容,结束本次内层循环AA3: INC DIDEC AH ;内层循环计数减一JNZ AA2 ;内层循环结束AA4: INC SILOOP AA1 ;外层循环结束MOV CX,15 ;此行以下将BUFC中的内容输出LEA BX,BUFCBB1: MOV DL,BXINC BXMOV AH,2INT 21HLOOP BB1MOV AH,4CHINT 21HCODE ENDSEND START7. 试编写由键盘输
14、入一个以回车作为结束的字符串,将其按ASCII码由大到小的顺序输入到CRT上的源程序。答:DATA SEGMENT;数据段BUF DB 200 DUP(?)DATA ENDSCODE SEGMENT;代码段ASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV DI,0;记录输入的字符串个数MOV BX,OFFSET BUFAA1: MOV AH,1;键盘输入字符INT 21HCMP DI,201;是否超出缓冲区JNC AA6 ;超过缓冲区大小CMP AL,0DH;是否为回车,回车表输入结束JZ AA6;是回车MOV BX,AL;将字符存入缓冲
15、区INC BXINC DIJMP AA1AA6: MOV DX,DICMP DI,0;没有字符则无输出JZ AA7CMP DI,1;有一个字符则直接输出JZ AA8DEC DX;外循环计数初值,即遍数,数据个数减1AA2: MOV BX,OFFSET BUFMOV CX,DIDEC CX;内循环计数初值,即比较次数,数据个数减1AA3: MOV AL,BXCMP AL,BX+1;比较JNC AA4;前大后小转XCHG AL,BX+1;前小后大交换MOV BX,ALAA4: INC BXLOOP AA3DEC DXJNZ AA2AA8: MOV BX,OFFSET BUF;输出字符MOV CX,
16、DI;循环计数初值AA5: MOV DL,BXMOV AH,2INT 21HINC BXLOOP AA5AA7: MOV AH,4CHINT 21HCODE ENDSEND START8. 设从BUFFER开始存放若干个以$为结束标志的带符号字节数据,试编写将其中的正数按由大到小的顺序存入PLUS开始的缓冲区中的源程序。答:方法一思路:将正数先存到目标地址,然后再排序。DATA SEGMENTBUFFER DB 1,2,3,4,5,6,7,-8,9,2,-1,-2,-3,-4,-5,-6,-7,-8,-9,1,$PLUS DB (?)DATA ENDSCODE SEGMENTASSUME CS
17、: CODE,DS: DATASTART: MOV AX,DATAMOV DS,AXMOV DI,-1 ;初始化外循环计数器LEA BX,BUFFERLEA SI,PLUSL1: MOV AL,BXXOR AL,$ ;判断当前字符是否为$JNZ L2 ;不是$转移JMP L4L2: MOV AL,BX ;判断当前字符是否为正数ROL AL,1JNC L3 ;是正数转移INC BXJMP L1L3: ROR AL,1 ;恢复数据MOV SI,AL ;将数据存入目标地址INC DIINC SIINC BXJMP L1L4: CMP DI,0JG L5 ;正数个数=2则开始排序MOV AH,4CHI
18、NT 21H ;正数个数为0或1均跳出L5: LEA SI,PLUS ;以下为使用冒泡排序的方法对数据排序MOV CX,DIL6: MOV AL,SICMP AL,SI+1JNC L7XCHG AL,SI+1MOV SI,ALL7: INC SILOOP L6DEC DIJNZ L5MOV AH,4CHINT 21HCODE ENDSEND START方法二思路:在数据存放的原地址将数据进行由小到大的冒泡排序,则每次那循环可得到本次排序中的最大数,将其存入目的地址,直到得到一个非正的数后跳出。DATA SEGMENTBUFFER DB 1,2,3,4,5,6,7,-8,9,2,-1,-2,-3
19、,-4,-5,-6,-7,-8,-9,1,$PLUS DB (?)DATA ENDSCODE SEGMENTASSUME CS: CODE,DS: DATASTART: MOV AX,DATAMOV DS,AXMOV DI,-1 ;初始化外循环计数器LEA SI,PLUSLEA BX,BUFFERL1: MOV AL,BXXOR AL,$ ;检查当前字符是否为$JNZ L2JMP L3L2: INC DIINC BXJMP L1L3: LEA BX,BUFFER ;开始排序MOV CX,DIL4: MOV AL,BXCMP AL,BX+1JLE L5 ;前小后大转移XCHG AL,BX+1MO
20、V BX,ALL5: INC BXLOOP L4MOV AL,BX ;得到本次循环的最大数ROL AL,1JNC AA4 ;检验是否为正数,是则转移MOV AH,4CHINT 21HL6: MOV DL,BXMOV SI,DL ;保存数据INC SIDEC DIJNZ L3 ;进入下一次循环MOV AH,4CHINT 21HCODE ENDSEND START9. 试编写一源程序,要求将一个包含有20个数据的数组M分成两个数组:正数数组P和负数组N,并分别把这两个数组中数据的个数在CRT上显示出来。答:DATA SEGMENTORG 100HM DB 12,23,58,15,36,55,44,
21、89,45,-23,-56,-47,-21,-65,32,69,82,58,29,-14 ;待处理数组P DB 20 DUP(?) ;正数数组PN DB 20 DUP(?) ;负数数组NDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXLEA SI,P ;P的首址送SILEA DI,N ;N的首址送DILEA BX,M ;M的首址送BXXOR AX,AX ;AX清0XOR DX,DX ;DX清0,DL/DH分别用于正/负数计数MOV CX,20 ;分别处理M的20个数据L1: MOV AL,BX ;取一个
22、数组元素TEST AL,80H ;AL,80H按位与JZ L2 ;结果为0,则AL为正,转L2MOV DI,AL ;AL为负,送负数数组NINC BX ;BX+1,准备取M的下一个元素INC DI ;负数数组N写位置后移一位INC DH ;负数计数DH+1JMP L3 ;本次处理结束L2: MOV SI,AL ;AL为正,送正数数组PINC BXINC SI ;正数数组P写位置后移一位INC DL ;正数计数DL+1L3: LOOP L1 ;跳转进入下一次循环MOV CX,2 ;二次输出循环,分别显示正负数的个数L5: MOV BL,DL ;保存DL,实质是暂时保存DL的低4位SHR DL,1
23、SHR DL,1SHR DL,1SHR DL,1 ;逻辑右移4位,即取高4位CMP DL,10JB L4 ;DL=10时,DL+7,9的ASCII码为39H,A的ASCII码为41H,相差8L4: ADD DL,30HMOV AH,2 ;输出DL,正/负数个数的高位INT 21HMOV DL,BL ;BL送DL,准备显示正/负数个数的低位AND DL,0FH ;DL高4位置0,因为DL的高4位已显示CMP DL,10JB L6ADD DL,7L6: ADD DL,30HMOV AH,2INT 21HMOV DL,0AH ;换行MOV AH,2INT 21HMOV DL,0DH ;回车MOV A
24、H,2INT 21HMOV DL,DH ;DH送DL,准备显示负数的个数LOOP L5MOV AH,4CH ;返回DOSINT 21HCODE ENDSEND START10. 试编写一源程序,要求能从键盘接收一个个位数N,然后响铃N次(响铃的ASCII码为07)。答:CODE SEGMENTASSUME CS:CODESTART: MOV AH,1 ;输入一个个位数NINT 21HCMP AL,30HJC START ;小于0,要求重新输入CMP AL,3AHJNC START ;大于9,要求重新输入AND AL,0FHXOR CX,CX ;CX清0MOV CL,AL ;循环响铃N次MOV
25、DL,07H ;响铃的ASCII码为07AA1:MOV AH,2INT 21HLOOP AA1 ;循环响铃MOV AH,4CHINT 21HCODE ENDSEND START11. 在STRING到STRING+99单元中存放着一个字符串,试编制一程序测试该字符串中是否有数字。如有,则把CL置0FFH,否则将CL置0。答:DATAS SEGMENTSTRING DB XYZIL12LWR; 内可以是任意字符串N EQU $-STRING;字符串长度DATAS ENDS;CODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,
26、AXMOV CX,NLEA BX,STRINGAA1:MOV AL,BXCMP AL,30H;字符ASCII码小于30H,转移JB AA2CMP AL,39H;字符ASCII码大于39H,转移JA AA2JMP AA3;数字,符合条件AA2:INC BXLOOP AA1MOV CL,0JMP AA4AA3:MOV CL,0FFHAA4:MOV AH,4CHINT 21HCODES ENDSEND START12. 试编制一源程序,把DX中的十六进制数转换为ASCII码,并将对应的ASCII码依次存放到MEM数组中的4个字符中.例如,当DX=2A49H时,程序执行完后,MEM中的4个字节内容为3
27、9H、34H、41H、和32H。答:DATA SEGMENTSOURCE DW 2A49HMEM DB 4 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA;START:MOV AX,DATAMOV DS,AX;MOV DX,SOURCELEA BX,MEM;set the loopMOV CX,4;the loop bodyLB: MOV AX,DXAND AX,000FHCMP AL,10JC AD;ADD AL,7;AD: ADD AL,30HMOV BX,ALINC BX;SHR DX,1SHR DX,1SHR DX,1SHR DX,1LOOP LB;the loop end, return to dosMOV AH,4CHINT 21HCODE ENDSEND START13. 下面程序段是实现从键盘输入10个1位10进制数后累加。最后累加和以非压缩BCD码形式存放在AH(高位)和AL(低位)中。答:XOR DX,DXMOV CX 10LOP1: MOV AH,01H;键盘字符输入INT 21HMOV AH,DHADD AL,DLAAAMOV DX,AXLOOP LOP1
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1