1、汇编实例例1:要求将两个5字节16进制数相加。程序如下:DATA SEGMENT DATA1 DB 0F8H , 60H , 0ACH , 74H , 3BH DATA2 DB 0C1H , 36H , 9EH , 0D5H , 20H DATA ENDS CODE SEGMENT ASSUME CS : CODE , DS : DATASTART : MOV AX , DATA MOV DS , AX MOV CX , 5 MOV SI , 0 CLC LOOPER : MOV AL , DATA2SI ADC DATA1SI , AL INC SI DEC CX JNZ LOOPER CO
2、DE ENDS END START 例2:试编制一个程序把BX寄存器内的二进制数用十六进制数形式在屏幕上显示出来。CODE SEGMENTASSUME CS:CODESTART:PUSH DSSUB AX,AXPUSH AXMOV BX,12ABH MOV CH,4ROTATE:MOV CL,4 ROL BX,CL MOV AL,BL AND AL,OFH ADD AL,30H CMP AL,3AH JL PRINTIT ADD AL,7HPRINTIT: MOV DL,AL MOV AH,2 INT 21H DEC CH JNZ ROTATE RETCODE ENDS END START例3
3、:在ADDR单元中存放着数Y的地址,试编制一程序把Y中1的个数存入COUNT单元中。DATA SEGMENT ADDR DW NUMBER NUMBER DW Y COUNT DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV CX,0 MOV BX,ADDR MOV AX,BXREPEAT: TEST AX,0FFFFH JZ EXIT JNS SHIFT INC CXSHIFT: SHL AX,1 JMP REPEATEXIT:
4、MOV COUNT,CX RETCODE ENDS END START例4:将正数N插入一个已整序的字数组的正确位置。该数组的首地址和末地址分别为ARRAY_HEAD和ARRAY_END,其中所有数均为正数且已按递增的次序排列。DATA SEGMENT ARRAY_HEAD DW 3,5,15,23,37,49,52,65,78,99 ARRAY_END DW 105 N DW 32DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV AX,N
5、 MOV ARRAY_HEAD-2,0FFFFH MOV SI,0COMPARE: CMP ARRAY_ENDSI,AX JLE INSERT MOV BX,ARRAY_ENDSI MOV ARRAY_ENDSI+2,BX SUB SI,2 JMP SHORT COMPAREINSERT: MOV ARRAY_ENDSI+2,AX RETCODE ENDS END START例5:(逻辑尺示例)设有数组X和Y。X数组中有X1,X10;Y数组中有Y1,Y10;试编制程序计算Z1=X1+Y1 Z2=X2+Y2 Z3=X3-Y3 Z4=X4-Y4 Z5=X5-Y5 Z6=X6+Y6 Z7=X7-Y7
6、 Z8=X8-Y8Z9=X9+Y9 Z10=X10+Y10。DATA SEGMENT X DW X1,X2,X3,X4,X5,X6,X7,X8,X9,X10 Y DW Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9,Y19 Z DW Z1,Z2,Z3,Z4,Z5,Z6,Z7,Z8,Z9,Z19LOGIC_RULE DW 00DCHDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV BX,0 MOV CX,10 MOV DX,LOGIN_
7、RULENEXT: MOV AX,XBX SHR DX,1 JC SUBTRACT ADD AX,YBX JMP SHORT RESULTSUBTRACT: SUB AX,YBXRESULT: MOV ZBX,AX ADD BX,2 LOOP NEXT RETCODE ENDS END START例6:编程实现:比较两个字符串STR1和STR2所含字符是否相等,若相等则显示“MATCH”,若不相等则显示“NO MATCH”。(两个字符串均在数据段给出)DATA SEGMENTSTR1 DB ABCDFECOUT1 DB $-STR1STR2 DB ABCDFCOUT2 DB $-STR2FIN
8、D DB MATCH, 0DH ,0AH , $NOFIND DB NO MATCH, 0DH ,0AH , $DATA ENDSCODE SEGMENT ASSUME CS : CODE, DS:DATA, ES: DATASTART : MOV AX , DATA MOV DS , AX MOV ES , AX MOV BL , COUT1 CMP BL , COUT2 JNE DISPNOLOOP1 : MOV CL , COUT1 MOV CH , 0 LEA SI , STR1 LEA DI , STR2 REPE CMPSB JNE DISPNO MOV AH , 09H LEA
9、DX , FIND INT 21H JMP EXITDISPNO: MOV AH , 09 LEA DX , NOFIND INT 21HEXIT: MOV AH , 4CH INT 21HCODE ENDS END START老师给的:DATA SEGMENTSTR1 DB ABCDFSTR2 DB ABCDFFIND DB MATCH, 0DH ,0AH , $NOFIND DB NO MATCH, 0DH ,0AH , $DATA ENDSCODE SEGMENT ASSUME CS : CODE, DS:DATA, ES: DATASTART : MOV AX , DATA MOV D
10、S , AX MOV ES , AXLOOP1 : LEA SI , STR1 LEA DI , STR2 MOV CX , STR2- STR1 CMP CX , FIND-STR2 JNZ DISPNO REPE CMPSB JNE DISPNO LEA DX , FIND JMP EXITDISPNO: LEA DX , NOFINDEXIT: MOV AH , 09H INT 21H MOV AH , 4CH INT 21H例7:编程实现:比较两个字符串STR1和STR2所含字符是否相等,若相等则显示“MATCH”,若不相等则显示“NO MATCH”。(其中一个字符串在数据段给出,另一
11、个用键盘输入,比较字符串是否相等)DATA SEGMENTSTR1 DB 21 DB ? DB 21 DUP(?)STR2 DB ABCCOUNT EQU $-STR2FIND DB MATCH, 0DH ,0AH , $NOFIND DB NO MATCH, 0DH ,0AH , $DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODE,ES:DATASTART: MOV AX,DATA MOV DS,AX MOV ES,AX MOV DX,OFFSET STR1 MOV AH,0AH INT 21H MOV CX,COUNT CMP CL,STR1+1 J
12、NE DISPNO LEA SI , STR1+2 LEA DI , STR2 MOV CX , COUNT REPE CMPSB JNE DISPNO MOV AH , 09H LEA DX , FIND INT 21H JMP EXITDISPNO: MOV AH , 09 LEA DX , NOFIND INT 21HEXIT: MOV AH , 4CH INT 21H MOV AH,4CH INT 21HCODE ENDS END START例8:编程实现:比较两个字符串STR1和STR2所含字符是否相等,若相等则显示“MATCH”,若不相等则显示“NO MATCH”。(两个数均用键盘
13、输入,比较字符串是否相等)老师给的:DATA SEGMENTSTR1 DB 20 DB ? DB 20 DUP(?)STR2 DB 20 DB ? DB 20 DUP(?)FIND DB MATCH, 0DH ,0AH , $NOFIND DB NO MATCH, 0DH ,0AH , $DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODE,ES:DATASTART: MOV AX,DATA MOV DS,AX MOV ES,AX MOV DX,OFFSET STR1 MOV AH,0AH INT 21H MOV DX,OFFSET STR2 MOV AH,
14、0AH INT 21H MOV AL,STR1+1 CMP AL,STR2+1 JNE DISPNO LEA SI , STR1+2 LEA DI , STR2+2 MOV CL , STR1+1 MOV CH,0 REPE CMPSB JNE DISPNO MOV AH , 09H LEA DX , FIND INT 21H JMP EXITDISPNO: MOV AH , 09 LEA DX , NOFIND INT 21HEXIT: MOV AH , 4CH INT 21H MOV AH,4CH INT 21HCODE ENDS END START例9:已知字数组A包含5个互不相等的整数
15、,字数组B包含5个互不相等的整数,编程实现:把既在A中又在B中出现的整数存放到字数组C中。DATA SEGMENT A DW 2,6,8,9,3 B DW 5,8,3,9,7 C DW 5 DUP(0)DATA ENDSCODE SEGMENT ASSUME CS : CODE , DS : DATASTART: MOV AX,DATA MOV DS , AX MOV SI , 0 MOV BX , 0 MOV CX , 5LOOP1: PUSH CX MOV DI , 0 MOV CX , 5 MOV AX , ASILOOP2: CMP BDI, AX JNE NO MOV CBX, AX
16、 ADD BX , 2NO: ADD DI , 2 LOOP LOOP2 ADD SI , 2 POP CX LOOP LOOP1 MOV AH , 4CH INT 21HCODE ENDS END START例10:编程实现:若两个指定的字节变量相等则调用ALLSAME子程序,显示“Y”,否则调用“NOTSAME”子程序,显示“N”。DATA SEGMENT VAR1 DB 1 VAR2 DB 2DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME DS:DATA,CS:CODESTART: PUSH DS SUB AX,AX PUSH AX MOV AX,DA
17、TA MOV DS,AX MOV AL,VAR1 CMP AL,VAR2 JE SAME CALL NOTSAME JMP EXITCMPSAME: CALL ALLSAMEEXITCMP: RETMAIN ENDPALLSAME PROC NEAR MOV DL,Y MOV AH,2 INT 21H RETALLSAME ENDPNOTSAME PROC NEAR MOV DL,N MOV AH,2 INT 21H RETNOTSAME ENDP RETCODE ENDS END START例11:编程:在显示器上显示HELLO字符串。DATA SEGMENT BUF DB HELLO,$D
18、ATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF MOV AH,9 INT 21H MOV AH,4CH INT 21HCODE ENDS END START例12:编程:从键盘输入一字符串(最多20个字符)到数据段中以CHAR为首地址的区域。DATA SEGMENT CHAR DB 21 DB ? DB 21 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATASTART: PUSH DS MOV A
19、X,0 PUSH AX MOV AX,DATA MOV DS,AX MOV DX,OFFSET CHAR MOV AH,0AH INT 21H RETCODE ENDS END START例13:编程实现:将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL和DL中。(不要求有输出,用debug查看结果)DATA SEGMENTX DW 1234HMEM DB 4 DUP(?)DATA ENDSCODE SEGMENT ASSUME DS : DATA , CS : CODESTART : PUSH DS MOV AX,0 PUSH AX MOV AX,DATA
20、MOV DS,AX MOV CL,4 MOV CH,4 LEA BX,MEM MOV AX,XA1: MOV DX,AX AND DX,0FH MOV BYTE PTRBX,DL INC BX SHR AX,CL DEC CH JNZ A1B1: MOV DL,MEM MOV CL,MEM+1 MOV BL,MEM+2 MOV AL,MEM+3 RETCODE ENDS END START例14:运用子程序,键盘上输入一个十进制数,用十六进制显示出来, DECIHEX SEGMENT ASSUME CS: DECIHEXMAIN PROC FARREPEAT: CALL DECIBIN CAL
21、L CRLF CALL BINIHEX CALL CRLF JMP REPEATMAIN ENDPDECIBIN PROC NEAR MOV BX,0NEWCHAR: MOV AH,1 INT 21H SUB AL,30H JL EXIT CMP AL,9D JG EXIT CBW XCHG AX,BX MOV CX,10D MUL CX XCHG AX,BX ADD BX,AX JMP NEWCHAREXIT: RETDECIBIN ENDPBINIHEX PROC NEAR MOV CH,4ROTATE: MOV CL,4ROL BX,CLMOV AL,BLAND AL,0FHADD AL
22、,30HCMP AL,3AHJL PRINTITADD AL,7HPRINTIT: MOV DL,AL MOV AH,2 INT 21H DEC CH JNZ ROTATE RETBINIHEX ENDPCRLF PROC NEAR MOV DL,0DH MOV AH,2INT 21HMOV DL,0AHMOV AH,2INT 21HRETCRLF ENDPDECIHEX ENDS END MAIN例15:8251初始化CPU发送十个字节CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100HSTART: JMP INIT BUFF DB 0123456789I
23、NIT: MOV DX,362H MOV AL,0 MOV DX,AL MOV DX,AL MOV DX,AL MOV AL,40H MOV DX,AL MOV AL,0FEH OUT DX,AL MOV AL,01H OUT DX,AL MOV SI,OFFSET BUFF MOV CX,10YYY1: MOV DX,362H IN AL,DX TEST AL,01H JE YYY1 MOV AL,SI MOV DX,360H OUT DX,AL INC SI LOOP YYY1 MOV AH,4CH INT 21HCODE ENDS END START例16:在以STR为首地址的缓冲区中,
24、有一组字符串,该字符串以“$”为结束符,编程统计该字符串的长度,结果存入RUS变量中。DATA SEGMENT STR DB ABCDE$ RUS DW ?DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV SI,0 MOV CX,0NEXT: MOV BL,STRSI CMP BL,$ JE EXIT INC CX INC SI JMP NEXTEXIT: MOV RUS,CX RETCODE ENDS END START例17:编程实现:从
25、键盘输入一系列以$为结束符的字符串,然后统计其中的非数字字符数。DATA SEGMENT BUF DB 50 DUP(?) COUNT DB 0DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART: MOV AX,DATA MOV DS,AX LEA BX,BUFINPUT: MOV AH,1 INT 21H MOV BX,AL INC BX CMP AL,$ JNZ INPUT LEA BX,BUFNEXT: MOV CL,BX INC BX CMP CL,$ JZ DISP CMP CL,30H JB CONT CMP CL,39H JBE N
26、EXTCONT: INC COUNT JMP NEXTDISP: MOV AL,COUNT MOV AH,0 MOV AH,4CH INT 21HCODE ENDS END START例18:在DAT字节单元中有一个带符号数,判断其正负,若为正数,则屏幕显示“+”,若为负数,则屏幕显示“-”,若为0,则屏幕显示“0”。老师的方法:DATA SEGMENT DAT DB 10DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART: MOV AX,DATA MOV DS,AX MOV AH,2 CMP DAT,0 JGE DY MOV DL,- INT
27、21H JMP EXITDY: JE EEQ几点注意事项:一、2号中断的前两句无先后顺序且3句话可分开写,不一定要写在一起。二、标号不具有跳转能力。三、程序中的地址是逻辑地址而非实际地址。故有数据段的时候,装入DS的方式必须有,这是找段基址要求的,否则程序在编译时有偏移量,找不到段基址出现错误。四、程序是顺序执行的。 MOV DL,+ INT 21H JMP EXITEEQ: MOV DL,0 INT 21HEXIT: MOV AH,4CH INT 21HCODE ENDS END START例19:ADDR中有Y的地址,在Y中统计“1”的个数放入COUNT中DATA SEGMENT ADDR
28、 DW NUMBER NUMBER DW 123111 COUNT DW ?DATA ENDSCODE SEGMRNT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV CX,0 MOV BX,ADDR/Y的地址给AX MOV AX,BXREPEAT: TEST AX,0FFFFH JZ EXIT JNS SHIFT INC CXSHIFT: SHL AX,1 JMP REPEATEXIT: MOV COUNT,CX RETCODE ENDS END START符号函数:0输出+ 0 输出- 求极值 统计个数 芯片上 8255信号灯 8253 通道0计数100次
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1