汇编语言之重复数查找
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
程序运行结果: