5.18 把 0~100D 之间的 30 个数存入以 GRADE 为首地址的 30 字数组中,GRADE+i 表示学
号为 i+1 的学生的成绩。另一个数组 RANK 为 30 个学生的名次表,其中 RANK+i 的内容是
学号为 i+1 的学生的名次。编写一程序,根据 GRADE 中的学生成绩,将学生名次填入 RANK
数组中。(提示:一个学生的名次等于成绩高于这个学生的人数加 1。)
DATAS SEGMENT
GRADE DW 9,8,2,4,5,5,1,2
NUM DW ($-GRADE)/2
COUNT DW 0
RANK DW 14H
DATAS ENDS
STACKS SEGMENT
DW 30H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA SI,GRADE
LEA DI,RANK
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
MOV CX,NUM
L1: PUSH CX
PUSH SI ;保护指针
CALL RANK_OP
MOV [DI],BX
ADD DI,2
POP SI
ADD SI,2 ;指针后移
POP CX
LOOP L1
MOV CX,NUM
LEA SI,RANK
PRINT:
MOV DX,[SI] ;不要直接用DL
ADD DX,30H ;转化为数组
MOV AH,02H
INT 21H
ADD SI,2
LOOP PRINT
EXIT:
MOV AH,4CH
INT 21H
;统计分数高于自己的人数,存放在BX中
RANK_OP PROC
MOV COUNT,0
MOV BX,0
MOV AX,[SI]
LEA SI,GRADE
;ADD SI,2 ;不要跳过当前的数字,从头计数
MOV CX,NUM
L2: CMP AX,[SI]
JAE NEXT ;当自己的分数大于等于别人时,就跳过计数
INC COUNT ;人数加一
NEXT:
ADD SI,2
LOOP L2
MOV BX,COUNT
INC BX ;排名等于人数+1
RET
RANK_OP ENDP
CODES ENDS
END START
5.19 已知数组 A 包含 15 个互不相等的整数,数组 B 包含 20 个互不相等的整数。试编制一
程序把既在 A 中又在 B 中出现的整数存放于数组 C 中
双重循环:把A数组的每个元素和B数组比较,相等就放入C,同时跳出循环
DATAS SEGMENT
A DW 1,2,3,5,4,6,7,8,19,10,23,45,44,46,43
B DW 1,2,3,14,5,6,7,8,9,0,11,12,13,4,15,110,120,103,104,105
CARR DW 15 DUP(?)
COUNT DW 0
DATAS ENDS
STACKS SEGMENT
DW 30H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
LEA SI,A
MOV BX,0
MOV CX,15
L1: MOV AX,[SI]
PUSH CX
MOV CX,20
LEA DI,B
L2: MOV DX,[DI]
CMP AX,DX
JNE NEXT
MOV CARR[BX],AX
ADD BX,2
INC COUNT
JMP L3
NEXT:
ADD DI,2
LOOP L2
L3: POP CX
ADD SI,2
LOOP L1
MOV CX,COUNT
LEA DI,CARR
PRINT:
MOV DX,[DI]
ADD DL,30H
MOV AH,02H
INT 21H
ADD DI,2
LOOP PRINT
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
5.20 设在 A、B 和 C 单元中分别存放着三个数。若三个数都不是 0,则求出三数之和存放在
D 单元中;若其中有一个数为 0,则把其它两单元也清 0。请编写此程序
要点1:没有变量C,该名称会导致报错
要点2:不能直接立即数传送给传送到内存单元 [SI],需要MOV WORD PTR[SI],0
DATAS SEGMENT
A DW 1
B DW 2
C_NUM DW 3 ;没有C的变量,会报错
D DW 0
DATAS ENDS
STACKS SEGMENT
DW 30H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
;判断是否有0存在
L1: MOV AX,A
CMP AX,0
JE CLEAR_0
MOV AX,B
CMP AX,0
JE CLEAR_0
MOV AX,C_NUM
JE CLEAR_0
JMP NEXT ;如果都不为0
CLEAR_0:
LEA SI,A
MOV WORD PTR [SI],0
LEA SI,B
MOV AX,0
MOV [SI],AX ;或者用寄存器中转
LEA SI,C_NUM
MOV WORD PTR [SI],0 ;汇编语言中不能直接将立即数 0 传送到内存地址 [SI]
JMP EXIT
NEXT:
MOV AX,A
ADD AX,B
ADD AX,C_NUM
LEA SI,D
MOV [SI],AX
EXIT:
LEA SI,D
MOV AH,02H
MOV DX,[SI]
;MOV DX,D
ADD DL,30H
INT 21H
CODES ENDS
END START
DATAS SEGMENT
AN DW 1
BN DW 2
CN DW 2
DN DW 0
DATAS ENDS
STACKS SEGMENT
DW 30H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
MOV AX,AN
MOV BX,BN
MOV CX,CN
CMP AX,0
JE CLEAN
CMP BX,0
JE CLEAN
CMP CX,0
JE CLEAN
ADD AX,BX
ADD AX,CX
MOV DN,AX
JMP PRINT
CLEAN:
MOV AN,WORD PTR[0]
MOV BN,WORD PTR[0]
MOV CN,WORD PTR[0]
;输出验证
PRINT:
MOV DX,DN
ADD DX,30H
MOV AH,02H
INT 21H
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
5.21 试编写一程序,要求比较数组 ARRAY 中的三个 16 位补码数,并根据比较结果在终端
上显示如下信息:
(1) 如果三个数都不相等则显示 0;
(2) 如果三个数有二个数相等则显示 1;
(3) 如果三个数都相等则显示 2。
要点:注意三个数字相等只需要判断2次,三个数都不相等要判断3次
DATAS SEGMENT
ARR DW -11,-11,1
COUNT DW 0
DATAS ENDS
STACKS SEGMENT
DW 30H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
LEA SI,ARR
MOV AX,[SI]
MOV BX,[SI+2]
MOV CX,[SI+4] ;注意SI加多少
CMP AX,BX
JNE L1
INC COUNT
L1: CMP AX,CX
JNE L2
INC COUNT
JMP PRINT ;说明三数相等
L2: CMP BX,CX
JNE PRINT
INC COUNT
;输出验证
PRINT:
MOV DX,COUNT
ADD DX,30H
MOV AH,02H
INT 21H
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
5.22 从键盘输入一系列字符(以回车符结束),并按字母、数字、及其它字符分类计数,最后
显示出这三类的计数结果。
DATAS SEGMENT
MAXL DB 30H
RLEN DB ?
STR1 DB 30H DUP(?),0DH,0AH,24H
NUM1 DB 0 ;数字
NUM2 DB 0 ;字母
NUM3 DB 0 ;其他
DATAS ENDS
STACKS SEGMENT
DW 30H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
LEA DX,MAXL
MOV AH,0AH
INT 21H
LEA SI,STR1
XOR CH,CH
MOV CL,RLEN
L1: MOV AL,[SI]
CMP AL,'0'
JB OTHER
CMP AL,'9'
JA NEXT
INC NUM1
JMP L2
NEXT:
CMP AL,'A'
JB OTHER
CMP AL,'Z'
JA NEXT1
INC NUM2
JMP L2
NEXT1:
CMP AL,'a'
JB OTHER
CMP AL,'z'
JA OTHER
INC NUM2
JMP L2
OTHER:
INC NUM3
L2: INC SI
LOOP L1
;输出验证
PRINT:
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,NUM1
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,NUM2
ADD DL,30H
INT 21H
MOV DL,NUM3
ADD DL,30H
INT 21H
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
5.23 已定义了两个整数变量 A 和 B,试编写程序完成下列功能:
(1) 若两个数中有一个是奇数,则将奇数存入 A 中,偶数存入 B 中;
(2) 若两个数中均为奇数,则将两数加 1 后存回原变量;
(3) 若两个数中均为偶数,则两个变量均不改变。
要点1:注意当两数一奇一偶时,要判别是否需要交换,可以学习一下交换指令
DATAS SEGMENT
A DW 5
B DW 3
NUM1 DW 0
DATAS ENDS
STACKS SEGMENT
DW 30H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
MOV AX,A
MOV BX,B
TEST AX,01H
JZ NEXT
INC NUM1 ;记录奇数个数
NEXT:
TEST BX,01H
JZ L1
INC NUM1
L1: MOV CX,NUM1
CMP CX,1
JB PRINT ;都为偶数
CMP CX,2
JNE NEXT_2 ;一奇一偶
INC AX
INC BX
MOV A,AX
MOV B,BX
JMP PRINT
NEXT_2:
TEST AX,01H
JNZ PRINT
XCHG AX,BX
MOV A,AX
MOV B,BX
;输出验证
PRINT:
XOR DH,DH
MOV AH,02H
MOV DX,A
ADD DX,30H
INT 21H
MOV DX,B
ADD DX,30H
INT 21H
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
454

被折叠的 条评论
为什么被折叠?



