汇编语言(五)之数组中正数和负数分离

汇编语言(五)之数组中正数和负数分离

将数组中的正数和负数分离到两个数组

程序运行:

www.zeeklog.com  - 汇编语言(五)之数组中正数和负数分离

代码:


datas segment

   a             dw -1,2,3,4,-2,-3,5,6,7,8,
                    9,-10,13,15,-5,-24,-36,34,53,-90
  count          dw ($-a)/2
   p             dw 20 dup(?)
   n             dw 20 dup(?)
   pNumber       dw 0
   nNumber       dw 0
   
   outputpNumberPrompt  db 'the plus size:$'
   outputnNumberPrompt  db 0dh,0ah,'negtive  size:$'
   
datas ends

stacks segment

     dw 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 si,0
	   mov di,0
	   mov bx,0
	   mov cx,count
	   s:
	     mov ax,a[bx]
	     cmp ax,0
		 jg plus                   ;ax为正数,则保存于p数组
		 jl negtive                ;ax为负数,则保存于n数组
		 jmp s2                    ;ax为0,则忽视
		 plus:
		   mov p[si],ax           ;保存ax于p数组
		   inc pNumber             ;p数组长度加一
           add si,2                ;p数组单元下标加二
		   jmp s2                  ;跳转到s2
		   
		 negtive:
		   mov n[di],ax            ;保存ax于n数组
		   inc nNumber             ;n数组长度加一
           add di,2                ;n数组单元下标加二
		 s2:
		  add bx,2		            ;a数组单元下标加二
		loop s
		
		;输出正数数组的长度提示
		lea dx,outputpNumberPrompt
		mov ah,9
		int 21h
		;输出正数数组的长度
		mov ax,pNumber
		call print
		
		
		;输出负数数组的长度提示
		lea dx,outputnNumberPrompt
		mov ah,9
		int 21h
		;输出负数数组的长度
		mov ax,nNumber
		call print
		
       ret
	   
main endp

print proc near

     ;获取输出数的十进制字符保存在栈中
     mov bx,10
	 mov cx,0
	 sa: 
	    mov dx,0
	    div bx
		push dx
		inc cx
		cmp ax,0
		jne sa
		
	;输出数字字符
    mov ah,2
	ss1:
	  pop dx
	  add dl,30h
	  int 21h
	  loop ss1

	ret
print endp
codes ends

end main