王爽汇编语言第三版课设二回顾
-
在dos系统下五个独立功能
-
(1) 有页面
-
(2) 重启 这两个模块的理解在第三点详细总结,主要是关于数据标号的
-
(3) 更改时钟 这个功能实现唯一记忆就是int 16h中断的0号功能,返回的ah内为扫描码,al为ASCII码
-
mov ah,0
-
Int 16h
-
cmp al,30h(这个中断同样可以用于对键盘输入扫描来选择功能)
-
(4) 显示时钟 需要记忆的是关于int 9 外中断的 这里实现了我以前困惑的,两个功能对cpu的同时占用(简易思考,其实并非同时) 这里的实现通过在程序末尾添加自己的新的9号中断,然后在程序开始的地方把原九号中断的中断向量即cs:ip保存下来,把新九号中断的地址写入中断向量表 es:[n4](ip)Es:[n4+2](cs),在结尾处的九号中断的开始 先有 in al,60h (功能是把键盘输入的扫描码读出来) 然后模拟调用原九号中断
-
Pushf(标志寄存器入栈)
-
Pushf
-
Pop bx
-
And bh 11111100b
-
Push bx Popf(标志寄存器tf,if位置0)
-
Call dword ptr (存放原九号中断csip的地址){
-
Push cs
-
Push ip
-
Jmp dword ptr 内存}
-
对于ret,retf,iret的理解
-
(1) Ret : pop ip(对应于call)
-
(2) Retf: pop ip ; pop cs(对应于call dword 或者call far)
-
(3) Iret: pop ip;pop cs;popf(4) 此处注意一点,call 内存单元和jmp 内存单元,都是把这个内存单元存储的内容作为新的ip或者cs,ip来使用
-
关于讲写好的程序转移到软盘内,由于系统自动从软盘1读入并开始系统,所以只需要注意在一号软盘内对别的软盘的调用
- (1) 软盘内容是无法直接读取的,就像硬盘一样,需要先把内容读在内存中然后再调用① 所以在此处我们先将软盘内容读在某一个指定的内存部位,然后在需要使用该软盘内容时跳转过去即可
- (2) 在读取到软盘之后,其实写入软盘的是机器码,伪指令不会被写入,所以在软盘内容的开始的地方必须是指令而不可以是数据,否则就会出错
-
最后的要点 两部分 关于从软盘读取到内存后程序内部代码标号的csip地址 和 数据标号的使用 (1) 读取到内存以后,由于我们源程序中的offset其实在编译的时候就已经被写为了准确的跳转距离,所以比如说我将软盘二的内容读在的2000:7cffh的内存空间中,此时我的offset由于cs是相同的,但是我当时是对于ip为0进行的计算,此时仍然要准确标记到该标号,需要加上7cffh
-
2) 数据标号的使用确实会方便很多
-
① 无需对它的偏移地址定义,直接使用标号即可,不过要注意的是在从软盘读取出来的时候,同样有和标号一样的问题
受益匪浅