汇编网首页登录博客注册
masmaster的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
文章收藏

[2010-09-04 16:15] 习题3.37

设已在地址F000:0000H开始的内存区域安排了1024个16位有符号数。请编写程序统计其中的正数,负数和零的个数,并分别转成对应的十进制数显示出来。

答:
;-----------------------------------------------------
assume  cs:code,ss:stack,es:data
data    segment
posi    dw      0               ;正数个数
nega    dw      0               ;负数个数
zero    dw      0               ;0的个数
diver   dw      10              ;除数
data    ends
stack   segment stack           ;栈段
        dw 128 dup (0)
stack   ends
code    segment
start:
        mov ax,0f000h           ;指定DS段为F000H
        mov ds,ax
        mov ax,data             ;指定Es段为data
        mov es,ax
        mov si,0                ;DS段首地址F000:0000
        mov cx,1024             ;计数器
L:      mov ax,[si]             ;指定字数据装入AX比较
        cmp ax,0
        jg big                  ;正数
        jl small                ;负数
        inc zero                ;零增量
        jmp jx                  ;跳转
big:    inc posi                ;正数增量
        jmp jx
small:  inc nega                ;负数增量
jx:     add si,2                ;指向下一个字数据
        loop L
;
        mov si,0                ;
        mov cx,3                ;正负零,3次循环
L1:     mov ax,es:[si]          ;装入AX,调用
        call disp               ;disp子程序
        mov dl,20h              ;打印空格
        mov ah,2
        int 21h
        add si,2                ;指向下一个字
        loop L1

        mov ah,4ch
        int 21h
;16进制转10进制并显示子程序
;入口地址:AX
;出口地址:无

disp    proc uses cx dx
        mov cx,0
        xor dx,dx
L2:     div diver
        push dx
        inc cx
        xor dx,dx
        cmp ax,10
        ja next
        jmp ok
next:   jmp L2
ok:     push ax
        inc cx
L3:     pop dx
        add dx,3030h
        and dx,0ffh
        mov ah,2
        int 21h
        loop L3
        ret
disp    endp
;
code    ends
end     start
;-----------------------------------------------------
评论次数(0)  |  浏览次数(316)  |  类型(汇编习题集) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码