START: PUSH DS ;设置返回DOS SUB AX, AX PUSH AX
MOV AX, DSEG
MOV DS, AX ;给DS赋值
BEGIN: MOV CX, 100H ;循环计数器 MOV SI, 0
MOV BX, 0 ;和((DI),(BX))的初始值 MOV DI, 0
NEXT: MOV AX, DATA [SI] CWD
ADD BX, AX ;求和
ADC DI, DX ;加上进位位 ADD SI, 2 LOOP NEXT
MOV DX, DI ;将((DI),(BX))中的累加和放入((DX),(AX))中 MOV AX, BX MOV CX, 100H
IDIV CX ;带符号数求平均值,放入(AX)中 MOV BX, 0 MOV SI, 0
COMP: CMP AX, DATA [SI] ;寻找小于平均值的数 JLE NO
INC BX ;小于平均值数的个数+1 NO: ADD SI, 2 LOOP COMP RET
MAIN ENDP
CSEG ENDS ;以上定义代码段
;-------------------------------------------------------------------------- END START
5.17答:程序如下: DSEG SEGMENT MEM DB 4 DUP (?) N DW 2A49H 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 CH, 4 ;循环计数器 MOV CL, 4 MOV AX, N LEA BX, MEM
ROTATE: MOV DL, AL ;从最低四位开始转换为ASCII码 AND DL, 0FH ADD DL, 30H
CMP DL, 3AH ;是0~9吗? JL NEXT
ADD DL, 07H ;是A~F
NEXT: MOV [BX], DL ;转换的ASCII码送入MEM中 INC BX
ROR AX, CL ;准备转换下一位 DEC CH
JNZ ROTATE RET
MAIN ENDP
CSEG ENDS ;以上定义代码段
;-------------------------------------------------------------------------- END START
5.18答:程序如下: DSEG SEGMENT
GRADE DW 30 DUP (?) ;假设已预先存好30名学生的成绩 RANK DW 30 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: MOV DI, 0
MOV CX, 30 ;外循环计数器 LOOP1: PUSH CX
MOV CX, 30 ;内循环计数器 MOV SI, 0
MOV AX, GRADE [DI]
MOV DX, 1 ;起始名次为第1名
LOOP2: CMP GRADE [SI], AX ;成绩比较 JBE GO_ON
INC DX ;名次+1 GO_ON: ADD SI, 2 LOOP LOOP2 POP CX
MOV RNAK [DI], DX ;名次存入RANK数组 ADD DI, 2 LOOP LOOP1 RET
MAIN ENDP
CSEG ENDS ;以上定义代码段
;-------------------------------------------------------------------------- END START
5.19答:程序如下: DSEG SEGMENT A DW 15 DUP (?) B DW 20 DUP (?) C DW 15 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: MOV SI, 0 MOV BX, 0
MOV CX, 15 ;外循环计数器 LOOP1: PUSH CX
MOV CX, 20 ;内循环计数器 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答:程序如下: 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 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