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

我的博客

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

[2010-09-03 21:20] 习题3.35

请写出一个求地址F000:0000H开始的64K字节内存区域的校验和,并转换成十六进制的ASCII。

答:
;-----------------------------------------------------

assume  cs:code
code    segment
start:
        mov ax,0f000h       ;指定DS=F000
        mov ds,ax           ;偏移地址SI=0
        mov si,0
        mov cx,0FFFFh       ;循环计数器64K次
        xor ax,ax           ;低16,存放低十六位结果
        xor dx,dx           ;高16,存放高十六位结果
s:      mov bx,[si]         ;装入字节
        mov bh,0            ;清高四位零
        add ax,bx           ;累加
        adc dx,0            ;带进位累加
        inc si              ;指向下一个字节
        loop s
;统计结束,开始显示结果
        push ax             ;先显示高位,保护低位
        mov ax,dx           ;将高位装入Ax
        call show           ;调用显示子程序
        pop ax              ;显示低16位
        call show           ;调用
        mov ah,4ch
        int 21h
show    proc
        mov cx,4            ;移动四次
a:      push cx             ;保存计数器
        mov cl,4            ;每次四位
        rol ax,cl           ;
        push ax             ;保存AX
        and ax,0fh          ;保留低四位
        cmp al,9            ;大于9,即
        jg a1               ;A-F,跳至a1
        add al,30h          ;否则,加30h
        jmp a2
a1:     add al,37h          ;加37h
a2:     mov dl,al           ;调用int 21h
        mov ah,2            ;显示ascii码
        int 21h
        pop ax              ;恢复AX,便于再次移位
        pop cx              ;恢复计数器
        loop a
        ret                 ;返回调用
show    endp
code    ends
end     start

;-----------------------------------------------------
评论次数(0)  |  浏览次数(314)  |  类型(汇编习题集) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码