. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验16功能齐全,和大家分享下我的程序~  [已解决] 回复[ 3次 ]   点击[ 579次 ]  
q470393267
[帖 主]   [ 发表时间:2009-04-20 13:58 ]   [引用]   [回复]   [ top ] 
荣誉值:18
信誉值:0
注册日期:2009-04-04 22:58
assume cs:code,ss:stack
stack segment
 dw 32 dup (0)
stack ends
code segment
start: mov ax,stack
       mov ss,ax
       mov sp,64
       push cs
       pop ds
       mov si,offset int7c   ;设置ds:si指向源地址 
       mov ax,0
       mov es,ax
       mov di,200h      ;设置es:di指向目的地址 
       mov cx,offset int7cend-offset int7c ;设置cx为传输长度 
       cld
       rep movsb

       mov es:[7ch*4],200h
       mov word ptr es:[7ch*4+2],0 ;设置中断向量表 
;测试代码
       mov al,16h      ;设置前景色为黄色,背景色为蓝色
       mov ah,1   
       int 7ch         ;调用1号子程序,设置前景色 
       call day  
      
       mov ah,6 
       int 7ch 
       call day        ;送入6号功能号,检查功能号不符时的处理 
         
       mov ah,2        ;调用2号子程序,设置背景色 
       mov al,16h 
       int 7ch  
       call day  

       mov ah,3  
       int 7ch         ;调用3号子程序,上滚一行  
       call day  
                   
       mov ah,0 
       int 7ch 
       call day        ;调用0号子程序,清屏 
       
       mov ax,4c00h
       int 21h

day:   push ax         ;延时子程序 
       push dx  
       mov dx,5000h  
       mov ax,0  
day1:  sub ax,1  
       sbb dx,0  
       cmp ax,0  
       jne day1  
       cmp dx,0  
       jne day1  
       pop dx  
       pop ax  
       ret
;********int7ch中断程序******** 

       org 200h              ;指定下面语句的起始偏移地址,否则程序安装后再找标号table和error地址时会出现错误
int7c: jmp short l
table  dw sub1,sub2,sub3,sub4
error  db 'Error Function!'
l:     push bx
       push es
       push cx
       push ds 
       push ax
       mov bx,0b800h 
       mov es,bx
       mov ds,bx
       cmp ah,3           ;判断功能号是否大于3
       ja  error1         ;如果大于3,表示功能号错误 
       je  l1
       mov cx,2000
       jmp short l2
l1:    mov cx,24
l2:    mov bl,ah
       mov bh,0
       add bx,bx         ;根据ah中的功能号计算对应子程序在table表中的偏移
       call word ptr table[bx] ;调用对应的功能子程序 
lret:  pop ax     
       pop ds
       pop cx
       pop es
       pop bx
       iret           ;中断返回 

error1: push si        ;功能号错误时在屏幕中央处提示
       push bx 
       mov si,0 
       mov cx,15
       mov bx,0 

error2: mov al,error[bx] 
       mov byte ptr es:[12*160+32*2+si],al
       inc bx 
       add si,2 
       loop error2 
       pop bx 
       pop si 
       jmp short lret

sub1:  push bx  
       mov bx,0 

sub1s: mov byte ptr es:[bx],' '  ;清屏
       add bx,2 
       loop sub1s 
       pop bx 
       ret 

sub2:  push bx                   ;设置前景色
       mov bx,1 

sub2s: and byte ptr es:[bx],11111000b  
       and al,07h
       or es:[bx],al 
       add bx,2 
       loop sub2s 
       pop bx 
       ret 

sub3:  push bx                  ;设置背景色 
       mov bx,1 

sub3s:  and byte ptr es:[bx],10001111b 
       and al,70h
       or es:[bx],al 
       add bx,2 
       loop sub3s  
       pop bx 
       ret 
sub4: 
       push si 
       push di 
       mov si,160       ;ds:si指向第n+1行 
       mov di,0         ;es:di指向第n行 
       cld  

sub4s: push cx 
       mov cx,160 
       rep movsb        ;复制 
       pop cx 
       loop sub4s 
     
       mov cx,80 
       mov si,0 
sub4s1: mov byte ptr es:[24*160+si],' '    ;最后一行清空 
       add si,2 
       loop sub4s1 
       pop di 
       pop si 
       ret 
        
int7cend: nop  
      
code ends 
end start
q470393267
[第1楼]   [ 回复时间:2009-04-20 20:13 ]   [引用]   [回复]   [ top ] 
荣誉值:18
信誉值:0
注册日期:2009-04-04 22:58
mov ah,2        ;调用2号子程序,设置背景色  
        mov al,16h  
       int 7ch   
       call day   
这段代码中的mov al,16h  是我写多余了,可以删除~
q470393267
[第2楼]   [ 回复时间:2009-04-26 19:47 ]   [引用]   [回复]   [ top ] 
荣誉值:18
信誉值:0
注册日期:2009-04-04 22:58
收摊~
q470393267
[第3楼]   [ 回复时间:2009-04-26 19:47 ]   [引用]   [回复]   [ top ] 
荣誉值:18
信誉值:0
注册日期:2009-04-04 22:58
此贴由 贴主 于 [ 2009-04-26 19:47 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved