汇编语言之重复数查找

汇编语言之重复数查找

PS:有一说一,汇编真的得好好听,真的很有用
这是一个小实验,实验内容为:已知数组A包含20个互不相等的整数,数组B包含20个互不相等的整数。编程,把既在数组A中又在数组B中出现的整数存放与数组C,并显示数组C中数据的个数。(用十进制显示)

如果用别的语言写,那简直是分分钟的事情,如果用汇编语言,那你还会吗?
以下代码仅供参考

DATA	SEGMENT
STR    	DB	'00000$'
COUNT  	EQU	$ - STR - 1;(不计$)
RESULT 	DW	0	;相同数字的结果
ARRAY1 	DB	1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
LEN1	EQU	$ - ARRAY1
ARRAY2 	DB	1,2,7,9,23,66,5,90,32,20,10,28,60,88,24,72,16,99,48,13
LEN2	EQU	$ - ARRAY2
DATA	ENDS

STACK1	SEGMENT PARA STACK
DW	20H	DUP(0)
STACK1	ENDS

CODE SEGMENT
	ASSUME CS:CODE,DS:DATA
START:	MOV	AX,DATA
	MOV	DS,AX
;寻找两个数组中相同数字的总数
	MOV	SI,0
	MOV	CX,LEN1	;外循环次数
OUTERLOP:	
	XOR	AX,AX
	MOV	AL,ARRAY1[SI]
	INC          SI
	PUSH	SI
	PUSH	CX
	MOV	SI,0
	MOV	CX,LEN2	;内循环次数
INNERLOP:
	CMP	AL,ARRAY2[SI]
	JE	ADDRE	;相同数字结束内循环并计数
	INC	SI
	LOOP	INNERLOP
	JMP	TOOUT	;内循环结束,返回外循环
ADDRE:	ADD	RESULT,1
TOOUT:	POP	CX
	POP	SI
	LOOP	OUTERLOP

;调用输出子程序
	MOV	AX,RESULT
	PUSH	AX
	CALL	PRINT
	;结束程序
	MOV	AH,4CH	
	INT	21H

;输出子程序
PRINT:	
	PUSH	AX;将子程序中用到的寄存器存入保护栈
	PUSH	CX
	PUSH	DX
	PUSH	SI
	;寄存器调用,取出数值
	PUSH	BP
	;数据准备	
	MOV	BP,SP	;将SP栈顶地址赋值给BP
	MOV	AX,[BP + 12]	;push次数7次(还有一次CAll指令的push,代码无直接给出),栈数据类型DW2字节,所有拿取第一次push的数值要让栈顶指针移动 6 * 2,从而指向目标
	MOV	DX,0		;余数的寄存器
	MOV	CX,10		;除数的寄存器
	MOV	SI,COUNT		;字符串下标(首先指向的是符号$)
LOP:	;输出子程序循环代码
	DIV	CX	;商存入AX中,下次继续除
	ADD	DX,'0'	;余数+'0'变为字符
	DEC	SI	;SI自减
	MOV	STR[SI],DL	;将商存入STR[SI]
	XOR 	DX,DX
	CMP	SI,1	;si和1比较	
	JAE	LOP	;大于等于继续循环
	;结果输出
	MOV	DX,OFFSET STR
	MOV	AH,09H
	INT	21H
	;子程序返回前,恢复寄存器
	POP	BP
	POP	SI
	POP	DX
	POP	CX
	POP	AX
	RET

CODE ENDS
	END	START

程序运行结果:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值