wow7jiao 发表于 2017-7-14 18:58:14

实验15 请问前辈,这里是不是错了

本帖最后由 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:

   pop es:

   push es:

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

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

   cli                ;设置IF=0屏蔽中断

   mov word ptr es:,204h

   mov word ptr es:,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:    ;CS,IP入栈,(IP)=cs:,(CS)=0;入口地址是放在0:200处的,cs未赋初值,cs
又未置0,这前面用不用加mov ax,0;mov cs ax,我看的有的答案是call dword ptr es:
;如果是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:,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:

bin2yx 发表于 2017-7-14 18:58:15

你的代码没有问题。
你觉得有问题的是这一段吧:
call dword ptr cs:    ;CS,IP入栈,(IP)=cs:,(CS)=0;入口地址是放在0:200处的,cs未赋初值,cs
又未置0,这前面用不用加mov ax,0;mov cs ax,我看的有的答案是call dword ptr es:

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

ba21 发表于 2017-7-14 21:16:08

本帖最后由 ba21 于 2017-7-14 22:58 编辑

程序要在纯DOS下运行。

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

人造人 发表于 2017-7-14 22:31:31

debug test.exe
g
a
试试

wow7jiao 发表于 2017-7-15 13:48:32

本帖最后由 wow7jiao 于 2017-7-15 14:00 编辑

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

请问cs:,(cs)=0,这个段地址是怎么来的?
页: [1]
查看完整版本: 实验15 请问前辈,这里是不是错了