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

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
  •  浮躁10次=fool 浮躁20次=fathead 浮躁30次=stupid 浮躁40次=pig
  • 『姓名』:small liu
  • 『性别』:男『发送消息
  • 个人说明:我现在浮躁 指数4
  • 详细信息『加为好友』
学习动态
友情链接

[2009-06-19 09:24] 试验16-匍匐前进终于完成

;PDF 309 实验16
;编写多功能int7ch中断例程,具有清屏,设置前景,背景,上滚一行以及超界示警功能.
;老规矩独立完成的
;这个是完美版的,花了大概。。恩。。8个多小时
;用debug载入内存后直接g, 然后每隔几秒会跳出一种效果来
;al是字符属性参数
;int7cH中断程序安装与 0:200H处
;又是血的教训啊!table和error是从200H处开始算偏移的.
;实在是昏头转向了,居然把初始化循环条件放在循环体内
;话说不知道为啥这个版的没写多个注释我也不知道为什么。。这不像我的风格- -!
;一些心得:设计程序没花我多少时间,但是调试却很费时间不过通过调试可以学到许多课本没有的知识,比如说 数据标号默认的段地址为ds等,程序只要一大,写的时间一长就容易犯些低级错误。
assume cs:code

stack segment
db 128 dup (' ')
stack ends

code segment

int7c_start:jmp choose

table:dw offset s0+200H,offset s1+200H,offset s2+200H,offset s3+200H
error:db 'AH or AL out of range'

s0:mov bx,0b800H
   mov es,bx
   mov bx,0
   mov cx,2000

show_s0:mov byte ptr es:[bx],' '
        add bx,2
        loop show_s0
        ret
; s0作用:显示满屏空格(清屏)

s2:mov cl,4
   shl al,cl
   mov cx,2000
   mov bx,0b800h
   mov es,bx
   mov bx,1
 
show_st2: and byte ptr es:[bx],10001111b
          or es:[bx],al 
          add bx,2
          loop show_st2
          ret


s1:mov cx,2000
   mov bx,0b800h
   mov es,bx
   mov bx,1

show_st:  and byte ptr es:[bx],11111000b
          or es:[bx],al 
          add bx,2
          loop show_st
          ret
; s1作用:设置前景
; s2作用:设置背景

s3:
  mov di,0b800H
  mov ds,di
  mov es,di
  mov si,160
  mov di,0     
  cld
  mov cx,24

page_up:push cx
        mov cx,160
        rep movsb 
        pop cx
        loop page_up
        mov cx,80
  space:mov byte ptr es:[di],' '
        add di,2
        loop space
        ret 
;s3 作用:向上滚动一行

err: mov bx,0b800h
     mov es,bx
     mov si,0
     mov cx,21

          mov di,offset error+200H
err_show: mov bl,cs:[di]    
          mov byte ptr es:[si+160*12],bl
          mov byte ptr es:[si+160*12+1],2
          add si,2
          inc di
          loop err_show

          mov ax,4c00h
          int 21h
;err作用;当ah和al数值超过范围是报错并退出


choose: cmp ah,3
        ja  err
        cmp al,7
        ja  err

        push ax
        push bx
        push cx
        push dx
        push ds
        push es
        push si
        push di
        
        mov bx,cs
        mov ds,bx
        
        add ah,ah
        mov bl,ah
        mov bh,0

        add bx,offset table
        call word ptr ds:[bx+200H]  
        
        pop di
        pop si
        pop es
        pop ds
        pop dx
        pop cx
        pop bx
        pop ax
        iret

;根据ah的数值选择调用的子程序

int7c_end:nop



start:mov ax,stack
      mov ss,ax
      mov sp,128

      mov ax,cs
      mov ds,ax
      mov si,offset int7c_start
      mov ax,0
      mov es,ax
      mov di,200H      
      mov cx,offset int7c_end-int7c_start
      cld
      rep movsb
;安装int7cH在0:200H处

      mov word ptr es:[7cH*4],200H
      mov word ptr es:[7cH*4+2],0  
;安装int7cH入口地址

      mov bx,0b800h
      mov es,bx
      mov cx,5
      mov ah,0
      mov al,2

tests:push cx
      mov bx,0
      mov cx,2000

show_a: mov byte ptr es:[bx],'A'
        add bx,2
        loop show_a
        pop cx

        int 7cH
        call delay
        inc ah
        inc al         ;避免前景和背景同色导致看不出字符
        loop tests

        mov ax,4c00H
        int 21H
;全屏显示A,同时每次循环 调用不同的int7c       
delay:  pushf
        push ax
        push cx
        push dx

        mov dx,0FFFFH
        sub ax,ax    ;cf=0

    dlp:sub ax,1
        sbb dx,0
        cmp dx,0
        jne dlp
        
        pop dx
        pop cx
        pop ax
        popf
        ret        
;延迟程序


code ends

end start
评论次数(2)  |  浏览次数(1630)  |  类型(汇编作业) |  收藏此文  | 

[  游客   发表于  2009-06-20 12:05  ]

功能设计的不错。不过在运行过程中,设置完背景色后,就会出错退出。博主自己在检查一下。在command下显示out of range 。

[  zhenglxd   发表于  2009-06-23 09:47  ]

回楼上的这个 out of range是我自己设计的,如果当ah>3 或者al>7 就会提示out of range
因为 程序只有4种功能 并且 设置前景和背景 的范围也只有0~7
当超过他们的范围的时候 就提示 超出范围了。

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码