鱼C论坛

 找回密码
 立即注册
查看: 2200|回复: 2

实验16出不来效果···求大神指导···

[复制链接]
发表于 2012-8-8 01:33:58 | 显示全部楼层 |阅读模式
10鱼币
;任务:安装一个新的int 7ch中断例程
;功能:为显示输出提供功能子程序
;参数:ah传递功能号;0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行,对于2、3号功能,用al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}

答案给的代码·
assume cs:code
code segment
start:   mov ax,cs
     mov ds,ax
     mov si,offset s             ;设置ds:si指向源地址
     mov ax,0
     mov es,ax
     mov di,200h            ;设置es:di指向目标地址
     mov cx,offset send-offset s ;设置cx为传输长度
     cld                ;设置传输方向为正
     rep movsb
;在中断向量表中设置新的int 7ch中断例程的入口地址
     cli                ;设置IF=0屏蔽中断
     mov word ptr es:[7ch*4],200h
     mov word ptr es:[7ch*4+2],0
     sti                ;设置IF=1不屏蔽中断
;结束
     mov ax,4c00h
     int 21h
;新的int 7ch中断例程
s:   jmp short set
table    dw sub1-s+200h,sub2-s+200h,sub3-s+200h,sub4-s+200h
set: push bx
     cmp ah,3           ;判断ah中的功能号是否大于3
     ja sret
     mov bl,ah
     mov bh,0
     add bx,bx          ;计算对应子程序在table表中的偏移
     call word ptr table[bx]     ;调用对应的功能子程序
sret:    pop bx
     iret
;功能:清屏
sub1:    push bx
     push cx
     push es
     mov bx,0b800h
     mov es,bx
     mov bx,0
     mov cx,2000
subles:  mov byte ptr es:[bx],' '
     add bx,2
     loop subles
     pop es
     pop cx
     pop bx
     ret
;设置前景色,al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}
sub2:    push bx
     push cx
     push es
     mov bx,0b800h
     mov es,bx
     mov bx,1
     mov cx,2000
sub2s:   and byte ptr es:[bx],11111000b
     or es:[bx],al
     add bx,2
     loop sub2s
     pop es
     pop cx
     pop bx
     ret
;设置背景色,al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}
sub3:    push ax
     push bx
     push cx
     push es
     mov cl,4
     shl al,cl
     mov bx,0b800h
     mov es,bx
     mov bx,1
     mov cx,2000
sub3s:   and byte ptr es:[bx],10001111b
     or es:[bx],al
     add bx,2
     loop sub3s
     pop es
     pop cx
     pop bx
     pop ax
     ret
;向上滚动一行
sub4:    push cx
     push si
     push di
     push es
     push ds
     mov si,0b800h
     mov es,si
     mov ds,si
     mov si,160             ;ds:si指向第N+1行
     mov di,0           ;es:di指向第N行
     cld
     mov cx,24          ;共复制24行
sub4s:   push cx
     mov cx,160
     rep movsb          ;复制
     pop cx
     loop sub4s
     mov cx,80
sub4s1:  mov byte ptr [160*24+si],' '     ;最后一行清空
     add bx,2
     loop sub4s1
     pop ds
     pop es
     pop di
     pop si
     pop cx
     ret
send:    nop
code ends
end start  


测试程序
assume cs:code
code segment
start:   mov ax,303h
     int 7ch
     mov ax,4c00h
     int 21h
code ends
end start

先编译连接运行第一个程序
然后再debug 测试程序·
然后就蹦出个对话框   
the ntvdm cpu has encountered an illegalinstruction.
   cs:0000 ip:0397 op:f0 53 ff 00 f0 choose 'close' to terminate application.
然后我就···XXXXX · ·

哪位大神告诉我到底神马情况·····或者告诉我到底该怎么做才能实现应得的效果···






最佳答案

查看完整内容

你先把虚拟机弄起来再说吧。百度一下有很多虚拟机装dos的教程。多看看。然后在实模式下也就是纯dos下运行这程序。后面的几章都要实模式下运行,windows下的debug做不到实模式。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-8 01:33:59 | 显示全部楼层
你先把虚拟机弄起来再说吧。百度一下有很多虚拟机装dos的教程。多看看。然后在实模式下也就是纯dos下运行这程序。后面的几章都要实模式下运行,windows下的debug做不到实模式。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-8 12:13:44 | 显示全部楼层

哦哦···我试试·····
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-20 13:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表