1、微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815假设有一字节型数组ARRAY,编写完整的汇编语言程序求该数组中负数的个数。其中,在该数组的第一个字节存放的是数组中所包含的数据的个数,第二个字节用来存放结果,即数组中负数的个数,数组中的第三个字节开始存放的是数组中的数据。 1 写出编程思想;2 编写完整的源程序。1. 编程思想为统计数组中负数的个数,需要逐个判断数组中的每个数据,然后将所有数据中凡是符号位为1的数据的个数累加起来,便是数组中所包含的负数的个数。2完整的源程序STACK SEGMENT STACK DB 256 DUP(?)STACK ENDSDATA SEGMEN
2、T ARRAY DB 200 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX LEA DI,ARRAY MOV SI,DI MOV CL,DI XOR CH,CH MOV BL,CH INC DI INC DI AGAIN:TEST BYTE PTRDI,80H JZ POSI INC BL POSI: INC DI LOOP AGAIN MOV SI+1,BL MOV AH,4CH INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设
3、计第32讲第38讲0.80.815编一个完整的汇编语言程序,完成从键盘输入一个字符,若输入的是1字符,则在屏幕上显示你的英文名字;若输入的是2字符,则在屏幕上显示你的学号。若输入的不是1或者2字符,则重新输入。STACK SEGMENT STACK DB 256 DUP(?)STACK ENDSDATA SEGMENT STRING1 DB DO YOU WANT TO INPUT STRING?(Y/N):$ CRLF DB 0DH,0AH,$ STRING2 DB PLEASE INPUT STRING.,0DH,0AH,$ NAME DB ZHANG SAN. ,0DH,0AH,$ NU
4、MBER DB 020701053. ,0DH,0AH,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX LEA DX,STRING1 MOV AH,09H INT 21H MOV AH,01H INT 21H CMP AL,Y JE INPUT CMP AL,y JNE DONE INPUT: LEA DX,CRLF MOV AH,09H INT 21H LEA DX,STRING2 MOV AH,09H INT 21H AGAIN: MOV AH,01H INT 21H C
5、MP AL,1 JE DISPNAME CMP AL,2 JE DISPNUMBER JMP AGAINDISPNAME: LEA DX,NAME MOV AH,09H INT 21H JMP DONEDISPNUMBER:LEA DX,NUMBER MOV AH,09H INT 21H DONE: MOV AH,4CH INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815假设有一字节型数组ARRAY,编写完整的汇编语言程序求该数组中小于80H的数的个数。其中,在该数组的第一个字节存放的是数组中所包含的数据的个数,第二个字节用来存
6、放结果,数组中的第三个字节开始存放的是数组中的数据。1. 写出编程思想;2. 编写完整的源程序。1.编程思想将数组中的每个数逐个与80H比较,根据大小关系方可统计出数组中小于80H的数的个数2.完整的源程序STACK SEGMENT STACK DB 256 DUP(?)STACK ENDSDATA SEGMENT ARRAY DB 200 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX LEA DI,ARRAY MOV SI,DI MOV CL,DI XOR CH
7、,CH MOV BL,CH INC DI INC DI AGAIN:CMP BYTE PTRDI,80H JAE L1 INC BL L1: INC DI LOOP AGAIN MOV SI+1,BL MOV AH,4CH INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815在存储器DATABUF以下连续的单元存放着由字符0 9或A F组成的一串字符(字符个数自定义或用其它方法求解),试编写完整的8086汇编语言程序,将其转换成数字存回原处。(如某单元的字符为1,即31H,就转换成01H;为A, 即41H,就转换成0AH)1. 写
8、出编程思想;2. 编写完整的源程序。1.编程思想 将存储器DATABUF以下连续的单元中的每个数与39H(1字符的ASCLL码)比较,若该数小于等于39H,则将该数减去30H,否则将该数减去37H,其结果就是该字符对应的数字。2. 完整的源程序STACK SEGMENT STACK DB 256 DUP(?)STACK ENDSDATA SEGMENT DATABUF DB 1234ABCDdcsa56 COUNT EQU $-DATABUFDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV
9、DS,AX MOV SI,OFFSET DATABUF MOV CX,COUNT NEXT: MOV AL,SI CMP AL,39H JBE L1 SUB AL,7 L1: SUB AL,30H MOV SI,AL INC SI LOOP NEXT MOV AH,4CH INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815在当前数据段,偏移地址为DATAB开始的顺序80个单元中,存放着某班80个同学某门课考试的成绩,编写程序统计高于等于90分,80分89分,70分79分,60分69分,低于60分的人数各为多少,将结果放在同一数据
10、段、偏移地址为BTRX开始的顺序单元中。1. 写出编程思想。2. 编写完整的源程序。1. 编程思想将偏移地址为DATAB开始的顺序80个单元中的数分别与90、80、70、60比较,根据比较的大小关系就可统计出高于等于90分,80分89分,70分79分,60分69分,低于60分的人数。2. 完整的源程序STACK SEGMENT STACK DB 256 DUP(?)STACK ENDSDATA SEGMENT DATAB DB 80 DUP(?) BTRX DB 5 DUP(00H)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK ST
11、ART: MOV AX,DATA MOV DS,AX MOV SI,OFFSET DATAB MOV DI,OFFSET BTRX XOR BX,BX XOR DX,DX MOV CX,80 NEXT: MOV AL,SI CMP AL,90 JB C80 INC BH ;90分的人数 JMP AAA C80: CMP AL,80 JB C70 INC BL ;80分的人数 JMP AAA C70: CMP AL,70 JB C60 INC DH ;70分的人数 JMP AAA C60: CMP AL,60 JB AAA INC DL ;60分的人数 JMP AAA AAA: INC SI L
12、OOP NEXT MOV AL,80 SUB AL,BH SUB AL,BL SUB AL,DH SUB AL,DL ;50分的人数 MOV DI,BH MOV DI+1,BL MOV DI+2,DH MOV DI+3,DL MOV DI+4,AL MOV AH,4CH INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815编写完整的汇编语言程序,实现从键盘输入一串字符,并在屏幕上显示出来。1. 写出编程思想。2. 编写完整的汇编语言程序。1. 编程思想用DOS 0AH号功能完成从键盘输入一串字符,用DOS 09H号功能完成屏幕的显
13、示。2. 完整的汇编语言程序STACK SEGMENT STACK DB 256 DUP(?)STACK ENDSDATA SEGMENTSTRING1 DB DO YOU WANT TO INPUT STRING?(Y/N):$ CRLF DB 0DH,0AH,$ STRING2 DB PLEASE INPUT STRING.,0DH,0AH,$ BUFIN DB 20H DB ? BUFIN1 DB 20H DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX LEA
14、 DX,STRING1 MOV AH,09H INT 21H MOV AH,01H INT 21H CMP AL,Y JE INPUT CMP AL,y JNE DONE INPUT: LEA DX,CRLF MOV AH,09H INT 21H LEA DX,STRING2 MOV AH,09H INT 21H LEA DX,BUFIN MOV AH,0AH INT 21H MOV AL,BUFIN+1 CBW LEA SI,BUFIN+2 ADD SI,AX MOV BYTE PTR SI,$ LEA DX,CRLF MOV AH,09H INT 21H LEA DX,BUFIN+2 MO
15、V AH,09H INT 21H MOV AH,4CH INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815已知有100个8位无符号数已存放在缓存区INX中,编写完整的汇编语言程序,实现对这100个数据由高到低排序。 1。写出编程思想。2。编写完整的汇编语言程序。1. 编程思想利用气泡排序法对这100个8位无符号数两两进行比较,从而完成值的大小从大至小排序。2. 完整的汇编语言程序STACK SEGMENT STACK DB 256 DUP(?)STACK ENDSDATA SEGMENTINX DB 100 DUP(?)DATA
16、 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV CH,100-1 B10: LEA SI,INX MOV CL,CH B20: MOV AL ,SI CMP AL ,SI+1 JAE B30 XCHG AL, SI+1 MOV SI,ALB30: INC SI DEC CL JNZ B20 DEC CH JNZ B10 MOV AH,4CH INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815编写完整的汇编语言程序
17、,实现以下功能:从键盘输入一串字符,将其按ASCII码值的大小从小至大排序,并将排好序的新的字符串输出到屏幕上显示出来。1。写出编程思想。2。编写完整的汇编语言程序。1. 编程思想用DOS 0AH号功能完成从键盘输入一串字符,利用气泡排序法对输入的字符串中字符两两进行比较,从而完成按ASCII码值的大小从大至小排序。对排好序的新的字符串,用DOS 09H号功能完成屏幕的显示。2. 完整的汇编语言程序STACK SEGMENT STACK DB 256 DUP(?)STACK ENDSDATA SEGMENTSTRING1 DB DO YOU WANT TO INPUT STRING?(Y/N)
18、:$ CRLF DB 0DH,0AH,$ STRING2 DB PLEASE INPUT STRING.,0DH,0AH,$ BUFIN DB 20H DB ? BUFIN1 DB 20H DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX LEA DX,STRING1 MOV AH,09H INT 21H MOV AH,01H INT 21H CMP AL,Y JE INPUT CMP AL,y JNE DONE INPUT: LEA DX,CRLF MOV AH,0
19、9H INT 21H LEA DX,STRING2 MOV AH,09H INT 21H LEA DX,BUFIN MOV AH,0AH INT 21H MOV AL,BUFIN+1 CBW LEA SI,BUFIN+2 ADD SI,AX MOV BYTE PTR SI,$ LEA DX,CRLF MOV AH,09H INT 21H MOV CH,BUFIN+1 DEC CH B10: LEA SI,BUFIN+2 MOV CL,CH B20: MOV AL ,SI CMP AL ,SI+1 JAE B30 XCHG AL, SI+1 MOV SI,ALB30: INC SI DEC CL
20、 JNZ B20 DEC CH JZ DISP JMP B10DISP: LEA DX,BUFIN+2 MOV AH,09H INT 21H MOV AH,4CH INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815在首址为DAT的字数组中存放有100个无符号数,求出它们的平均值,并统计大于、等于及小于此平均数的个数。1 简述编程思想,画出流程图;2 编写完整的源程序。1. 编程思想先求出100个无符号数的和,除以100就是平均值;然后用每个数与平均值比较就可得出大于、等于及小于此平均数的个数。2. 完整的汇编语言程序STACK
21、SEGMENT STACK DB 256 DUP(?)STACK ENDSDATA SEGMENT DAT DB 100 DUP(?) LVEL DB 0 GDAT DB 0 EDAT DB 0 LDAT DB 0DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV CX,100 LEA SI,DAT MOV AX,0 L1: ADD AL,SI ADC AH,0 INC SI LOOP L1 MOV BL,100 DIV BL MOV LVEL,AL MOV CX,100
22、LEA SI,DAT CMP SI,AL JA DY JE XD INC LDAT JMP L2DY: INC GDAT JMP L2XD: INC EDATL2: INC SI LOOP L1 MOV AH,4CH INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815编一个完整的汇编语言程序,求某数的绝对值,并将结果放回原处。STACK SEGMENT STACK DB 256 DUP(?)STACK ENDSDATA SEGMENT XADR DW 3456HDATA ENDSCODE SEGMENT ASSUME CS:CO
23、DE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,XADR TEST AX,8000H JNS DONE NEG AX MOV XADR,AX MOV AH,4CH INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815编一个完整的汇编语言程序,完成将以DSRC为首址的连续的100个字节搬家到DDST以下单元。STACK SEGMENT STACK DB 256 DUP(?)STACK ENDSDATA SEGMENT DSRC DB 100 DUP(?) DDST DB
24、 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX LEA SI,DSRC LEA DI,DDST MOV CX,100 NEXT: MOV AL,SI MOV DI,AL INC SI INC DI LOOP NEXT MOV AH,4CH INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815编写FAR类型子程序实现以十六进制数在屏幕上显示AL的内容。1. 写出编程思想。2. 编写完整的源程序。CODE
25、 SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK DISPLAY PROC FAR PUSH AX PUSH CX PUSH DX PUSH AX MOV CL,4;处理高位十六进制数 SHR AL,CL CALL CHANG;十六进制数变换成ASCII码 MOV AH,02 MOV DL,AL INT 21H;显示一位字符 POP AX AND AL,0FH;处理低位十六进制数 CALL CHANG;十六进制数变换成ASCII码 MOV AH,02 MOV DL,AL INT 21H;显示一位字符 POP DX POP CX POP AX RETDISPAL
26、ENDP CODE ENDS END DISPLAY MOV AH,4CH INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815编写FAR类型子程序实现统计一个字(AX)中“1”的个数。1.写出编程思想。2.编写完整的源程序。1.编程思想由于AL中有两位十六进制数,每一位的值为09、0AH0FH,在显示时需要将它们转换成相应的ASCII码,然后调用INT 21H的02H号功能进行显示。2.完整的源程序CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK COUNTER1 PROC NEAR PU
27、SH AXMOV CX,16XOR BL,BLCOU1:SHR AX,1ADC BL,0LOOP COU1 POP AX RETCOUNTER1 ENDP CODE ENDS END DISPLAY微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815设在BUFFER中已经保存有字型数据(),其中前2个字节为数据的个数,计算数据的差分,并保存在DIFF缓冲区中。1.写出编程思想。2.编写完整的源程序。1.编程思想可根据数据的差分定义来编成计算,其公式为:2.完整的源程序STACK SEGMENT STACK DB 256 DUP(?)STACK ENDSDATA SEGMENT BU
28、FFER DW n DW X1,X2,XnDIFF DWn-1 DUP(?) DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV SI,BUFFER MOV CX,SI ADDSI,2 JCXZPROCEND;当(CX)0时,跳过循环 LEADI,DIFF MOV AX,SI ADDSI,2PROC1: ADDAX,SI SHRAX,1;完成(AX)2操作 MOV DI,AX;保存差分结果 ADDDI,2 MOVAX,SI ADDSI,2 LOOP PROC1 MOV AH
29、,4CH INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815字节型变量VAR1、VAR2和VAR3存放有3个无符号数,将其中的内容按从大到小重新排列。1.写出编程思想。2.编写完整的源程序。1.编程思想通过在三个数中找出最大值,将它与VAR1单元进行交换;然后对剩余的两个数进行比较,将较大值存放在VAR2中。经重新排列后,VAR1的值最大,VAR3的值最小。由于变量中存放的数据为无符号数,因此应该采用JA、JAE、JB、JBE等指令。2.完整的源程序STACK SEGMENT STACK STACK DW 100H DUP(?)
30、TOP LABEL WORDSTACK ENDSDATA SEGMENTVAR1DB 46H ;先假设一组值,以便检验程序设计的正确性VAR2DB 15HVAR3DB 0A2HDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX, DATA MOV DS, AX MOV ES, AX MOV AX, STACK MOV SS, AX LEA SP,TOP MOV AL,VAR1;用户编写的程序 CMP AL,VAR2JAE NO_CHG1XCHG AL,VAR2NO_CHG1:CMP AL,VAR3
31、JAE NO_CHG2XCHG AL,VAR3NO_CHG2:MOV VAR1,AL;最大值保存到VAR1MOV AL,VAR2CMP AL,VAR3JAE NO_CHG3XCHG AL,VAR3MOV VAR2,AL;次大值保存到VAR2NO_CHG3:MOV AH,4CH;返回DOS操作系统INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815在SOURCE存储区中保存有500个字节数据,现在要求将数据中的0FFH值去掉,并传送到DESTINATION缓冲区中,其有效数据个数保存在NUMBER中。1.写出编程思想。2.编写完整的
32、源程序。1.编程思想将SI指向源操作数区域,DI指向目的操作数区域,每次传送一个字节,但在传送前对其内容进行检测,如果为0FFH,则不传送。在传送的同时要使有效数据个数的计数单元NUMBER进行加1。2.完整的源程序N=500STACK SEGMENT STACK STACK DW 100H DUP(?)TOP LABEL WORDSTACK ENDSDATA SEGMENTSOURCE LABEL BYTE;假设有500个数据,并利用重复宏随机产生 X=17 REPT 500 X=(X+97) mod 256 DB X ENDMDESTINATIONDB N DUP(?)NUMBERDW ?
33、DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX, DATA MOV DS, AX MOV ES, AX MOV AX, STACK MOV SS, AX LEA SP,TOP XOR AX,AX;用户编写的程序MOV NUMBER,AXMOV CX,NLEA SI,SOURCELEA DI,DESTINATIONMOVE1:MOV AL,SIINC SICMP AL,0FFHJZ MOVE2MOV DI,ALINC DIINC NUMBERMOVE2:LOOP MOVE1MOVE_END:MOV AH,4CH;返回DOS操作系统INT 21HCODE ENDS END START微机原理及应用 汇编语言程序设计第32讲第38讲0.80.815在缓冲区DAT1和DAT2中,存放着两组递增有序的8位二进制