Assemble(王爽)—— 中断(代码例子,测试不了)

来源:互联网 发布:淘宝店铺是怎么升级的 编辑:程序博客网 时间:2024/06/14 03:51

    中断,(好像)系统自带的,硬件芯片BIOS中。

    (这里用的内存地址,都是绝对地址。另外,我用的是win7,nasm)

    系统一共有256个中断——一个字节大小。中断,一般由int + 中断号来触发。触发之后,根据中断向量,调用对应的中断代码进行处理。在内存0-3ffh内存放的是中断向量。一个中断向量4个字节,分别2字节的cs和2字节的ip——指向对应的中断处理代码。

    在12章,就是写了一个自己的中断处理代码,并且注册到了中断向量0号。其中,有三个比较重要的点。第一,就是中断处理代码,这里为了测试,所以代码是输出字符串。输出字符串,就是直接写“显存”!第二,就是需要这段代码常驻内存——这样才能调用。(我猜测),有些内存是不被分配给别人的(比如200h到2ffh这个范围);有些内存,是可以分配给别人,可以被写覆盖了。书上的例子,就是将这段中断代码拷贝到内存200h-2ffh。第三,就是要将这段代码的位置注册给0号中段——即设置下中断向量(cs=0,ip=200h)。

    但是,代码写完测试的时候,发现没法验证——纠结!做了些尝试,为解决问题。下面记录下尝试。

    1、由于运行有问题,所以我想先看看中段代码效果(如果这个没问题,那么就再测试其他的点)。但是,这个就没测试效果。查看了下,似乎因为我直接写内存了——这个好像在win7是不允许的!

    2、于是,我又想——直接在linux下测试吧。但是,还是有问题:linux下默认是32位的,就是加了[BITS 16],编译出来的也是32位的elf。链接的时候是会报错的(编译没问题),错误现象是mov ax,msg;其中,msg是一个字符串变量——即将地址放到16bit的ax中。但是,msg的地址是32位的。这个可能是要用到16位的连接器?不知道哦。

    3、我手头有本书《自己动手写操作系统》,上面讲到了自己对字符串的显示,在裸机上(boch)。于是我想,我能不能在写个类似的测试程序,直接在boch上运行?试了下,编译生成bin文件是没有问题的。但是,在写flopy的时候,一直失败。用的是rawrite2.exe,相关资料比较上,找不失败原因。


附注:找到些相关的资料:

1、http://zhidao.baidu.com/question/359419279.html

    ——这个可以照着操作,但是会产生乱码。所以,最好对显存相关操作有了足够的了解,再做这些事情。

           另外,显示,不一定要操作显存,linux下可以通过系统调用实现。我这里执着于此,是因为终于印证了“汇编直接跟硬件打交道的”这句话。理论有了,我只不过还是操作试下。

原创粉丝点击