汇编语言设计-实验五(5.18-5.23)

 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值