MOV DI, 0
MOV AX, A [SI] ;取A数组中的一个数
LOOP2: CMP B [DI], AX ;和B数组中的数相等吗?
JNE NO
MOV C [BX], AX ;相等存入C数组中 ADD BX, 2
NO: ADD DI, 2
LOOP LOOP2 ADD SI, 2 POP CX LOOP LOOP1 RET
MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------
END START
5.20 设在A、B和C单元中分别存放着三个数。若三个数都不是0,则求出三数之和存放在D单元中;
若其中有一个数为0,则把其它两单元也清0。请编写此程序。 答:程序如下:
DSEG SEGMENT A DW ? B DW ? C DW ? D DW 0 DSEG ENDS
;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG
START: PUSH DS ;设置返回DOS
SUB AX, AX PUSH AX
MOV AX, DSEG MOV DS, AX ;给DS赋值
BEGIN: CMP A, 0
JE NEXT CMP B, 0 JE NEXT CMP C, 0 JE NEXT MOV AX, A ADD AX, B ADD AX, C MOV D, AX JMP SHORT EXIT
NEXT: MOV A, 0
MOV B, 0 MOV C, 0
EXIT: RET MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------
END START 5.21 试编写一程序,要求比较数组ARRAY中的三个16位补码数,并根据比较结果在终端上显示如下
信息:
(1) 如果三个数都不相等则显示0;
(2) 如果三个数有二个数相等则显示1; (3) 如果三个数都相等则显示2。 答:程序如下:
DSEG SEGMENT ARRAY DW 3 DUP (?) DSEG ENDS
;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG
START: PUSH DS ;设置返回DOS
SUB AX, AX PUSH AX
MOV AX, DSEG MOV DS, AX ;给DS赋值
BEGIN: LEA SI, ARRAY
MOV DX, 0 ;(DX)用于存放所求的结果 MOV AX, [SI] MOV BX, [SI+2] CMP AX, BX ;比较第一和第二两个数是否相等 JNE NEXT1 INC DX
NEXT1: CMP [SI+4], AX ;比较第一和第三两个数是否相等
JNE NEXT2 INC DX
NEXT2: CMP [SI+4], BX ;比较第二和第三两个数是否相等
JNE NUM INC DX
NUM: CMP DX, 3
JL DISP DEC DX
DISP: ADD DL, 30H ;转换为ASCII码
MOV AH, 2 ;显示一个字符 INT 21H RET
MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------
END START
5.22 从键盘输入一系列字符(以回车符结束),并按字母、数字、及其它字符分类计数,最后显示出这三
类的计数结果。 答:程序如下:
DSEG SEGMENT
ALPHABET DB ?输入的字母字符个数为:‘, ?$‘ NUMBER DB ?输入的数字字符个数为:‘, ?$‘ OTHER DB ?输入的其它字符个数为:‘, ?$‘ CRLF DB 0DH, 0AH, ?$‘ DSEG ENDS
;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG
START: PUSH DS ;设置返回DOS
SUB AX, AX PUSH AX
MOV AX, DSEG
MOV
BEGIN:
DS, AX ;给DS赋值 ;字母字符计数器 ;数字字符计数器 ;其它字符计数器 ;输入一个字符 ;是回车符吗? ;<数字0吗? ;是其它字符
;>数字9吗?
INPUT:
OTHER: NEXT1:
NEXT2:
NEXT3:
NEXT4:
NEXT5:
MOV BX, 0 MOV SI, 0 MOV DI, 0 MOV AH, 1 INT 21H CMP AL, 0DH JE DISP CMP AL, 30H JAE NEXT1 INC DI JMP SHORT INPUT CMP AL, 39H JA NEXT2 INC SI JMP SHORT INPUT CMP AL, 41H JAE NEXT3 JMP SHORT OTHER CMP AL, 5AH JA NEXT4 INC BX JMP SHORT INPUT CMP AL, 61H JAE NEXT5 JMP SHORT OTHER CMP AL, 7AH JA SHORT OTHER INC BX JMP SHORT INPUT
;是数字字符
;<字母A吗?
;是其它字符
;>字母Z吗? ;是字母字符A~Z
;<字母a吗?
;是其它字符 ;>字母z吗? ;是其它字符 ;是字母字符a~z
LEA DX, ALPHABET CALL DISPLAY LEA DX, NUMBER MOV BX, SI CALL DISPLAY LEA DX, OTHER MOV BX, DI CALL DISPLAY RET
MAIN ENDP
;-------------------------------------------------------------------------- DISPLAY PROC NEAR
MOV AH, 09H ;显示字符串功能调用 INT 21H
CALL BINIHEX ;调把BX中二进制数转换为16进制显示子程序 LEA DX, CRLF MOV AH, 09H ;显示回车换行 INT 21H RET
DISPLAY ENDP
;-------------------------------------------------------------------------- BINIHEX PROC NEAR ;将BX中二进制数转换为16进制数显示子程序
MOV CH, 4
ROTATE: MOV CL, 4
ROL BX, CL
DISP:
MOV DL, BL AND DL, 0FH ADD DL, 30H CMP DL, 3AH ;是A~F吗? JL PRINT_IT ADD DL, 07H
PRINT_IT: MOV AH, 02H ;显示一个字符
INT 21H DEC CH JNZ ROTATE RET
BINIHEX ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------
END START
5.23 已定义了两个整数变量A和B,试编写程序完成下列功能:
(1) 若两个数中有一个是奇数,则将奇数存入A中,偶数存入B中; (2) 若两个数中均为奇数,则将两数加1后存回原变量; (3) 若两个数中均为偶数,则两个变量均不改变。 答:程序如下:
DSEG SEGMENT A DW ? B DW ? DSEG ENDS
;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG
START: PUSH DS ;设置返回DOS
SUB AX, AX PUSH AX
MOV AX, DSEG MOV DS, AX ;给DS赋值
BEGIN: MOV AX, A
MOV BX, B XOR AX, BX
TEST AX, 0001H ;A和B同为奇数或偶数吗? JZ CLASS ;A和B都为奇数或偶数,转走 TEST BX, 0001H JZ EXIT ;B为偶数,转走 XCHG BX, A ;A为偶数,将奇数存入A中 MOV B, BX ;将偶数存入B中 JMP EXIT
CLASS: TEST BX, 0001H ;A和B都为奇数吗?
JZ EXIT ;A和B同为偶数,转走 INC B INC A
EXIT: RET MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------
END START
5.24 假设已编制好5个歌曲程序,它们的段地址和偏移地址存放在数据段的跳跃表SINGLIST中。试
编制一程序,根据从键盘输入的歌曲编号1~5,转去执行五个歌曲程序中的某一个。 答:程序如下: