汇编语言(五)之数组中正数和负数分离
将数组中的正数和负数分离到两个数组
程序运行:
代码:
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