D DW ? DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX CMP A,0 JZ STOP CMP B,0 JZ STOP CMP C,0
JZ STOP ;有一个为0,全部置0
MOV AH,0 ;否则作加法运算,放到D,注意加法运算结果为字 MOV BH,0 MOV AL,A MOV BL,B ADD AX,BX MOV BL,C ADD AX,BX MOV D,AX JMP STOP NEXT: MOV A,0 MOV B,0 MOV C,0 STOP: MOV AH, 4CH INT 21H CODE ENDS
END START
3.22 试分析下列程序段,说明完成了什么操作?程序执行前后HEXNUM字节单元的内容是什么?
ASCNUM DB 41H HEXNUM DB ?
MOV AH,ASCNUM CMP AH,39H JBE NEXT SUB AH,7
NEXT:SUB AH,30H
MOV HEXNUM,AX HLT 解:
'0'~'9'与'A'~'F'组成的一位十六进制数的ASCII码转换为一位十六进制数。 程序执行前:[HEXNUM] = ? 程序执行后:[HEXNUM] = 0AH
3.23 在数据区STR1单元开始存放一长度为1~256个字符的字符串。要求对该字符串中每个字符在最高位配上一个偶校验位(即保持一字节数中1的个数为偶数),并存回到原单元中。 DATA SEGMENT
STR1 DB 'abcdefghi' LEN1 EQU $-STR1 DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA MOV DS,AX MOV CX,LEN1 MOV SI,0
ALOOP: MOV AL,STR1[SI]
OR AL,0 ;与0相或,不影响原来的值
JP CONTINUE ;若1的个数为偶数,不做任何处理 OR AL,80H ; 若1的个数为偶数,最高位置1 MOV STR1[SI],AL CONTINUE:INC SI
LOOP ALOOP STOP: MOV AH, 4CH INT 21H CODE ENDS
END START
3.24 已知在数据区中DATA1和DATA2开始分别存放N个字节数据,编制程序检查两数据块中的数据是否相同。若完全一致,则将标志单元FLAG置FFH,否则置0。并将第一次出现的不同数据的地址分别存放ADR1和ADR2单元中,编写程序。 ;假设为按顺序比较,非无序比较 DATA SEGMENT
DATA1 DB 22H,33H,44H,55H DATA2 DB 22H,33H,44H,66H N EQU $-DATA2 FLAG DB ? ADR1 DW ? ADR2 DW ? DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,N MOV SI,0 MOV DI,0
ALOOP1: MOV AL,DATA1[SI] CMP AL,DATA2[DI] JNZ NE12 INC SI INC DI LOOP ALOOP1 MOV FLAG,0FFH
JMP EXIT NE12: MOV FLAG,0 MOV ADR1,SI MOV ADR2,DI EXIT: MOV AH, 4CH INT 21H CODE ENDS
END START
3.25 定义一数组GRADE存放有100个学生某门功课的考试成绩,要求编一程序,统计各分数段的人数,即要求统计90~100分,80~89分,70~79分,60~69分以及60分以下的各有多少人。 DATA SEGMENT
GRADE DB 12,65,77,88,98,23,94,75,85,62 LEN EQU $-GRADE A DB 0 B DB 0 C DB 0 D DB 0 E DB 0 DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN ALOOP1: MOV SI,CX DEC SI
CMP GRADE[SI],60
JB GRE ;<60, E+1->E CMP GRADE[SI],70
JB GRD ;<70, D+1->D CMP GRADE[SI],80
JB GRC ;<80, C+1->C CMP GRADE[SI],90
JB GRB ;<90, B+1->B INC A ;>=90, A+1->A JMP GOON GRB: INC B
JMP GOON GRC: INC C
JMP GOON GRD: INC D
JMP GOON GRE: INC E JMP GOON GOON: LOOP ALOOP1 MOV AH, 4CH INT 21H CODE ENDS
END START
3.26 编一程序,在以BUF为首址的字节单元中存放了COUNT个无符号数,找出其中最大数送MAX单元。 DATA SEGMENT
BUF DB 11,23,43,45,67,82,38,48,98,34,67 COUNT EQU $-BUF MAX DB ? DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA
MOV DS,AX MOV CX,COUNT
MOV AL,0 ;AL用力存放最大数,初值为0 ALOOP: MOV SI,CX DEC SI
CMP AL,BUF[SI] ;从后面取数据,与AL比较 JAE GOON
MOV AL,BUF[SI] GOON: LOOP ALOOP MOV MAX,AL MOV AH, 4CH INT 21H CODE ENDS
END START
3.27 利用系统功能调用从键盘输入10个一位无符号数,求出其中最大和最小数,在显示器上输出显示。 DATA SEGMENT
IN_STR DB 'Please Input 10 Num of 0~9:$' MAX_STR DB 0DH,0AH,'MAX Num is:$' MIN_STR DB 0DH,0AH,'MIN Num is:$' MAX DB ? MIN DB ? DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,IN_STR MOV AH,09H
INT 21H ;提示输入10个数字 IND: MOV AH,01H
INT 21H ;输入一个字符 CMP AL,30H
JB IND ;<30H,ERROR CMP AL,39H
JA IND ;>39H,ERROR SUB AL,30H
MOV MIN,AL ;第一个数初始化MIN MOV MAX,AL ;第一个数初始化MAX MOV CX,3 ALOOP: MOV AH,01H
INT 21H ;输入一个字符 CMP AL,30H
JB ALOOP ;<30H,ERROR CMP AL,39H
JA ALOOP ;>39H,ERROR SUB AL,30H ;ASCII->数 CMP AL,MIN
JB GOMIN ;小于最小数,AL->MIN,输入下一个数 CMP AL,MAX
JA GOMAX ;大于最大数,AL->MAX,输入下一个数