. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  书中提供的4个子程序,单独测试时运行后dos直接崩掉,找不出原因,请大家帮忙  [已解决] 回复[ 2次 ]   点击[ 243次 ]  
bzhang
[帖 主]   [ 发表时间:2012-10-14 11:04 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:1
注册日期:2012-07-24 22:34
书中P296提供的4个子程序,我在单独测试时就无法得到正常的结果(4个功能都是这样),一运行dos就直接崩掉了,看起来像是系统级的错误导致的,但是找不出原因,请大家帮忙看下。

程序如下:

;=========================
assume cs:code

code segment
start:        call sub_1
        mov cx, 4c00h
        int 21h

;------功能0:清屏-----------
sub_1:        push bx
        push es
        push cx
        mov bx, 0B800h
        mov es, bx
        mov bx, 0
        mov cx, 2000

  loop_1:        mov byte ptr es:[bx], ' '        ;屏幕显示空白
        add bx, 2
        loop loop_1

        pop cx
        pop es
        pop bx        
        ret

;------功能1:设置前景色-----------
sub_2:        push bx
        push es
        push cx
        mov bx, 0B800h
        mov es, bx
        mov bx, 1
        mov cx, 2000

  loop_2:        and byte ptr es:[bx], 11111000b        ;根据al设置前景色
        or es:[bx], al
        add bx, 2
        loop loop_2

        pop cx
        pop es
        pop bx        
        ret

;------功能2:设置背景色-----------
sub_3:        push bx
        push es
        push cx
        mov cl, 4
        shl al, cl
        mov bx, 0B800h
        mov es, bx
        mov bx, 1
        mov cx, 2000

  loop_3:        and byte ptr es:[bx], 10001111b        ;根据al设置背景色
        or es:[bx], al
        add bx, 2
        loop loop_3
        pop cx
        pop es
        pop bx        
        ret

;------功能3:向上滚动1行-----------
sub_4:        push cx
        push si
        push di
        push es
        push ds

        mov bx, 0B800h
        mov ds, bx
        mov es, bx
        mov si, 160
        mov di, 0                ;ds:si(B800:160,即屏幕第2行为源数据), es:di(B800:0,即屏幕第1行为目标地址)
        cld
        mov cx, 24

  loop_4:        push cx
        mov cx, 160
        movsb
        pop cx
        loop loop_4        ;每次复制1行,共复制24次

        mov cx, 80
        mov si, 0
  loop_s:        mov byte ptr es:[160*24+si], ' '
        add si, 2
        loop loop_s

        pop ds
        pop es
        pop di
        pop si
        pop cx
        
        ret
code ends
end start
bzhang
[第1楼]   [ 回复时间:2012-10-14 11:28 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:1
注册日期:2012-07-24 22:34
找到原因了:
        mov cx, 4c00h (应该是ax)
        int 21h 

这么简单的问题没发现,惭愧。
bzhang
[第2楼]   [ 回复时间:2012-10-14 11:28 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:1
注册日期:2012-07-24 22:34
此贴由 贴主 于 [ 2012-10-14 11:28 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved