鱼C论坛

 找回密码
 立即注册
查看: 3000|回复: 4

[已解决]实验15 请问前辈,这里是不是错了

[复制链接]
发表于 2017-7-14 18:58:14 | 显示全部楼层 |阅读模式
50鱼币
本帖最后由 wow7jiao 于 2017-7-15 13:43 编辑

实验15
任务:安装一个新的int 9中断例程

;功能:在DOS下,按'A'键后除非不再松开,如果松开,就显示满屏幕的'A',其他键照常处理

assume cs:code

stack segment

     db 128 dup (0)

stack ends

code segment

start:   mov ax,stack

     mov ss,ax

     mov sp,128

     push cs

     pop ds

     mov ax,0

     mov es,ax

     mov si,offset int9     ;设置ds:si指向源地址

     mov di,204h            ;设置es:di指向目标地址

     mov cx,offset int9end-offset int9    ;设置cx为传输长度

     cld                ;设置传输方向为正

     rep movsb

;将原来的int 9中断例程的入口地址保存在ds:200、ds:202单元中

     push es:[9*4]

     pop es:[200h]

     push es:[9*4+2]

     pop es:[202h];这里是设置保存入口地址,前面有设置es=0

;在中断向量表中设置新的int 9中断例程的入口地址

     cli                ;设置IF=0屏蔽中断

     mov word ptr es:[9*4],204h

     mov word ptr es:[9*4+2],0

     sti                ;设置IF=1不屏蔽中断

;结束

     mov ax,4c00h

     int 21h

;新的int 9中断例程

int9:    push ax

     push bx

     push cx

     push es

     in al,60h          ;从端口60h读出键盘输入

;对int指令进行模拟,调用原来的int 9中断例程

     pushf                  ;标志寄存器入栈

     call dword ptr cs:[200h]    ;CS,IP入栈,(IP)=cs:[200h],(CS)=0;入口地址是放在0:200处的,cs未赋初值,cs
又未置0,这前面用不用加mov ax,0;mov cs ax
,我看的有的答案是call dword ptr es:[200h]
;如果是A断码,改变当前屏幕的显示字符

     cmp al,9eh             ;和A的断码(1eh+80h)比较

     jne int9ret            ;不等于A时转移

     mov ax,0b800h

     mov es,ax

     mov bx,0

     mov cx,2000

s:   mov byte ptr es:[bx],41h    ;将A的ASCII码写入,改变字符

     add bx,2

     loop s

int9ret:pop es

     pop cx

     pop bx

     pop ax

     iret

int9end:nop

code ends

end start

-----------------------------------------------------------------------------------------------------------------------------------------

书前面的是用data数据存储 call dword ptr ds:[0]
最佳答案
2017-7-14 18:58:15
你的代码没有问题。
你觉得有问题的是这一段吧:
call dword ptr cs:[200h]    ;CS,IP入栈,(IP)=cs:[200h],(CS)=0;入口地址是放在0:200处的,cs未赋初值,cs
又未置0,这前面用不用加mov ax,0;mov cs ax,我看的有的答案是call dword ptr es:[200h]

CS为什么为0
因为你将原int9中断的向量表改成了 0:204
当我们按键盘按键后,系统引发Int9中断,自动跳到了0:204处执行代码,CS自然等于0了。
IMG_2039.JPG
QQ截图20170715133510.png

最佳答案

查看完整内容

你的代码没有问题。 你觉得有问题的是这一段吧: call dword ptr cs:[200h] ;CS,IP入栈,(IP)=cs:[200h],(CS)=0;入口地址是放在0:200处的,cs未赋初值,cs 又未置0,这前面用不用加mov ax,0;mov cs ax,我看的有的答案是call dword ptr es:[200h] CS为什么为0 因为你将原int9中断的向量表改成了 0:204 当我们按键盘按键后,系统引发Int9中断,自动跳到了0:204处执行代码,CS自然等于0了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-14 18:58:15 | 显示全部楼层    本楼为最佳答案   
你的代码没有问题。
你觉得有问题的是这一段吧:
call dword ptr cs:[200h]    ;CS,IP入栈,(IP)=cs:[200h],(CS)=0;入口地址是放在0:200处的,cs未赋初值,cs
又未置0,这前面用不用加mov ax,0;mov cs ax,我看的有的答案是call dword ptr es:[200h]

CS为什么为0
因为你将原int9中断的向量表改成了 0:204
当我们按键盘按键后,系统引发Int9中断,自动跳到了0:204处执行代码,CS自然等于0了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-14 21:16:08 | 显示全部楼层
本帖最后由 ba21 于 2017-7-14 22:58 编辑

程序要在纯DOS下运行。

怕你不相信,我特地用U盘开纯DOS给你拍了个图
612679909525601711.jpg

评分

参与人数 1鱼币 +3 收起 理由
小甲鱼 + 3 支持楼主!

查看全部评分

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

使用道具 举报

发表于 2017-7-14 22:31:31 | 显示全部楼层
debug test.exe
g
a
试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-15 13:48:32 | 显示全部楼层
本帖最后由 wow7jiao 于 2017-7-15 14:00 编辑

;当此中断例程执行时(cs)=0

请问cs:[200h],(cs)=0,这个段地址是怎么来的?
IMG_2041.JPG
QQ截图20170715134355.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 04:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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