Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20276
  • 博文数量: 17
  • 博客积分: 730
  • 博客等级: 军士长
  • 技术积分: 175
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-24 12:09
文章分类

全部博文(17)

文章存档

2010年(17)

我的朋友
最近访客

分类: 嵌入式

2010-01-24 13:39:57

;
;7、编程,用正计数法,统计某数据区中正数和负数个数。
;
; 【 注意:】由于不明白什么是正计数法,所以此处
;【假设】正计数法是 每发现一个正数就使其数目加一
;【假设】倒计数法是 每发现一个负数就使总数减一
DATAS SEGMENT
   buf db 03H,88H,03H,08H,10H,08H,10H,08H
db 10H,08H,10H,08H,10H,08H,10H,08H
db 10H,08H,10H,08H,10H,08H,30H,08H
db 10H,08H,03H,18H,03H,08H,03H,03H
  db 03H,03H,3FH,0FEH,20H,04H,20H,14H
db 20H,24H,3FH,0C4H,20H,04H,20H,04H
db 20H,04H,3FH,84H,20H,44H,20H,44H
db 20H,44H,7FH,0FEH,20H,03H,03H,03h
db 03H,02H,20H,02H,21H,02H,21H,02H
db 21H,1EH,21H,0E2H,3FH,02H,21H,02H
db 21H,02H,21H,02H,21H,02H,23H,0FEH
db 61H,02H,21H,06H,03H,02H,03H,03H
db 04H,03H,04H,02H,04H,04H,04H,18H
db 04H,60H,44H,0C0H,34H,03H,1CH,03H
db 04H,03H,04H,80H,04H,40H,04H,30H
db 04H,1CH,0CH,0EH,04H,03H,03H,00H

count equ $-buf
public_mes db "there are:$"
negative_num db " negative numbers in the buf"
db 0ah,0dh,'$'
positive_num db " positive numbers in the buf"
db 0ah,0dh,'$'
zero_num db " zeros in the buf"
db 0ah,0dh,'$'
DATAS ENDS

STACKS SEGMENT    
STACKS ENDS


CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
    
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;; 打印小子程序;;;;;;;;;;;;;;;;;;;;;

show_asc proc
push ax
push bx
push cx
push dx
mov bx,dx
mov cx,2
mov ah,02h
lop:
mov dl,bl
int 21h
push cx
mov cl,8
shr bx,cl
pop cx
dec cx
jnz lop
mov ah,02h
mov dl,'h'
int 21h
pop dx
pop cx
pop bx
pop ax
ret
show_asc endp
;ax = 要输出的数字  dx=格式化的数字
;把一个两位数的每一个ascii打印出来。
show_num proc
push ax
push bx
push cx
push dx
mov cx,2h
mov bx,ax
mov dx,0
lop2:
mov bl,al
and bx,0fh
add bl,30h
cmp bl,'9'
jng next
add bl,7h
next:
or dx,bx
dec cx
jz  ok
push cx
mov cl,4
shl dx,cl
shl dx,cl  ;由于一个字符要占8个bit,所以dx往左移8位
shr ax,cl  ;而ax移动4位
pop cx
jmp lop2
ok:
call show_asc
pop dx
pop cx
pop bx
pop ax
ret
 
show_num endp    
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;                  换行
change_line proc
push ax
push dx
mov ah,2h
mov dl,0ah
    int 21h
    mov dl,0dh
    int 21h
    pop dx
    pop ax
ret
change_line endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



;;;;;;;;打印小程序结束        ;;;;;;;;;;;;;;;;;;;    
;;;; 其中ax存放的是正数的数目 bx存放的是 0 的数目
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
print_num proc
push ax
push bx
push cx
push dx
;mov cx,ax
;lea dx,public_mes
;mov ah,09h
;int 21h
;call change_line
;mov ax,cx
;call show_num
;lea dx,positive_num
;mov ah,9h
;int 21h
;mov ax,count
;sub ax,cx
;sub ax,bx
;call change_line
;call show_num
;lea dx,negative_num
;mov ah,9h
;int 21h
;call change_line
;mov ax,bx
;call show_num
;lea dx,zero_num
;mov ah,9h
;int 21h
pop dx
push cx
pop bx
pop ax
ret
    
print_num endp    
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
START:
    MOV AX,DATAS
    MOV DS,AX
    lea si,buf
    mov cx,count
    mov dx,0
search_lop:
mov al,[si]
test al,80h
jne  next_search ;如果是负数的话,直接下次循环
inc dx   ;先让0的个数加一
cmp al,0
je next_search;如果是0 的话,直接下轮循环
inc bx;如果不是 0 的话,正数的个数加一
dec dx ;再把0 的个数减去已
next_search:
inc si
loop search_lop    

mov ax,bx
mov bx,dx
call print_num 
   
   MOV AH,4ch
    INT 21H
CODES ENDS
    END START

阅读(459) | 评论(0) | 转发(0) |
0

上一篇:成绩管理

下一篇:统计2进制1个数

给主人留下些什么吧!~~