汇编语言(十五)之找出两个数组中的相同元素

汇编语言(十五)之找出两个数组中的相同元素

找出两个数组中的相同元素,并且输出

程序运行:

www.zeeklog.com  - 汇编语言(十五)之找出两个数组中的相同元素

代码:


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