汇编语言(十五)之找出两个数组中的相同元素
找出两个数组中的相同元素,并且输出
程序运行:
代码:
datas segment
A dw -1,-2, 3, 4, 5, 6, 7, 8, 9, 10,-11, 12, 13, 14, 15
ACount dw ($-A)/2
B dw -1, 2,-3, 4,-5, 6,-7, 8, 9,-10, 11,-12, 13,-14, 15,16,17,18,19,0
BCount dw ($-B)/2
C1 dw 30 dup(?)
C1Count dw 0
ouputlengthOfC1 db 'length of C1=$'
ouputC1 db 0dh,0ah,'the same elemt(C1):$'
datas ends
stacks segment stack
db 100h dup(?)
stacks ends
codes segment
assume cs:codes,ds:datas,ss:stacks
main proc far
start:
push ds
mov ax,0h
push ax
mov ax,datas ;初始化ds
mov ds,ax
mov cx,ACount
mov bx,0 ;数组A的索引
mov di,0 ;di数组C1的索引
s:
mov ax,A[bx] ;将数组A的元素移至ax
call saveSameElemt ;保存ax与B中相同的元素
add bx,type A ;数组A的索引移至下一个元素
loop s
shr di,1 ;di为数组C1的长度
mov C1Count,di ;保存数组C1的长度
lea dx,ouputlengthOfC1
mov ah,9
int 21h
mov ax,C1Count
call unsignedPrint
lea dx,ouputC1
mov ah,9
int 21h
mov cx,C1Count
mov bx,0
s1:
mov ax,C1[bx]
call print
mov dl,' '
mov ah,2
int 21h
add bx,type C1
loop s1
ret
main endp
saveSameElemt proc near
;保存寄存器
push cx
mov cx,BCount
mov si,0 ;数组B的索引
save:
cmp ax,B[si] ;比较ax与数组B的元素
jne notEqual ;若不等,则跳转
mov C1[di],ax ;若相当,则保存于数组C1
add di,type C1 ;数组C1下标移至下一个元素
notEqual:
add si,type B ;数组B的下标移至下一个元素
loop save
;恢复寄存器
pop cx
ret
saveSameElemt endp
print proc near
;ax=source
;保存寄存器
push cx
push dx
push bx
cmp ax,0 ; 比较ax与0大小
jge notNegative ;若非0,则跳转
push ax ;若为0,保存ax
mov dl,'-' ;输出负号
mov ah,2
int 21h
pop ax ;恢复ax
neg ax ;取ax的绝对值
notNegative:
mov bx,10 ;除数
mov cx,0 ;计数器,记录十进制数的位数
ps:
mov dx,0 ;无符号扩展
div bx ;除10
push dx ;保存余数
inc cx ;计数器加1
cmp ax,0h ;比较ax与0大小
jnz ps ;若不等,则跳转
ps1:
pop dx ;恢复余数
add dl,30h ;将数字转换为数字字符
mov ah,2 ;输出数字字符
int 21h
loop ps1
;恢复寄存器
pop bx
pop dx
pop cx
ret
print endp
unsignedPrint proc near
;ax=source
;保存寄存器
push cx
push dx
push bx
mov bx,10 ;除数
mov cx,0 ;计数器,记录十进制数的位数
ps:
mov dx,0 ;无符号扩展
div bx ;除10
push dx ;保存余数
inc cx ;计数器加1
cmp ax,0h ;比较ax与0大小
jnz ps ;若不等,则跳转
ps1:
pop dx ;恢复余数
add dl,30h ;将数字转换为数字字符
mov ah,2 ;输出数字字符
int 21h
loop ps1
;恢复寄存器
pop bx
pop dx
pop cx
ret
unsignedPrint endp
codes ends
end main