开学了,路上花了一天一夜,今天又睡了一天,真累!一觉起来,赶快继续看汇编。
实验16中的功能子程序都已经在16.4节中实现,要做的就是把这段程序做成int 7ch中断例程。原本以为很好写的,可是写好后调试了几遍都出问题,后来锁定为数据标号table那一句出问题了。研究了好大一会儿,才找出具体的原因以及解决办法。这个问题还不小呢,我想王老师出这道题的意图可能就有对数据标号的考察,看是不是深入理解了其机制。我来讲讲我的看法:
【1】此句table dw sub1,sub2,sub3,sub4。如果按照16.4中程序的写法,则sub1-sub4中所保存的偏移地址都是以程序开始为参照的,即...
- [lhjoanna] 我大致看了一下,标号s0:后面的第一行: mov byte ptr es:[bx+ 02/17 14:43
- [shuiyeweizhi] assume cs:code,ds:data,es:table,ss:stack data seg 02/17 12:53
- [游客] 我已经搞定了,和模式没有关系。不过还是要谢谢你。你的文章很有启发性啊。呵呵 02/17 11:19
- [游客] 对于实验十五我的源代码和博主的一模一样,可是运行时总出错,我猜着是不是因为不是在实模式下运行而出错呢 02/17 10:40
- [haojiahuo50401] lhjoanna,你好。我16章的实验不会做,思索了好长时间不会。正是你的这篇文章教会了我,谢谢!希 02/16 21:55
- [wsrf] 很不错,支持一下。 02/14 11:05
- [stategrid] <问题1>书上讲的是b800:000~b800:09f是显示器第一行,可是我代码中给es赋值b800 02/11 21:19
- [stategrid] 博主对所学的知识能够灵活应用真的很棒。让人眼前一亮。呵呵 02/11 18:51
- [stategrid] 虽然我写出来了。可是思路没有博主的清晰。博主加油! 02/11 18:47
- [stategrid] 嗯。对,很有必要进行复习。如果用得不熟的话,思考起来会过份担心程序是该如何实现这个功能的。。。如果这 02/11 18:46
- [mouse] 博主学的进度不慢啊,论坛问过的帖子有了答案也可以“结贴”了。 02/05 11:04
[2009-02-13 18:02] 【实验16】编写包含多个功能子程序的中断例程
阅读全文 |
评论次数(2) |
浏览次数(1459) |
所属类型(汇编作业)
[2009-02-10 16:01] 【实验15】安装新的int9中断例程
先来说说检测点15.1吧,程序没什么问题。第一题只保留pushf和call那一句。第二题在保存int9入口地址的前后分别加cli和sti。这两处在后面的程序中也有体现。只是当时在思考时确实想了许多,首先,int机制,在执行中断时,已经完成了以下四步:
[1]取得中断类型码
[2]标志寄存器入栈,TF、IF置0
[3]cs、ip入栈
[4]设置cs、ip为终端程序入口地址。
在模拟int指令时,第[1]步不需要执行了,因为已经确定是由键盘引发的中断。15.1的第一题说道进入中断例程以后IF和TF都已经置0,所以不需要再设置了。由此可以推知进入中断例程后步骤[1][3][...
[1]取得中断类型码
[2]标志寄存器入栈,TF、IF置0
[3]cs、ip入栈
[4]设置cs、ip为终端程序入口地址。
在模拟int指令时,第[1]步不需要执行了,因为已经确定是由键盘引发的中断。15.1的第一题说道进入中断例程以后IF和TF都已经置0,所以不需要再设置了。由此可以推知进入中断例程后步骤[1][3][...
阅读全文 |
评论次数(3) |
浏览次数(1078) |
所属类型(汇编作业)
[2009-02-09 12:17] 【实验14】访问CMOS RAM
这章的内容比较少,主要就是几个命令:in、out、shl、shr。cmos的端口号为70和71,通过这两个端口号相互配合就可以读写cmos ram中的内存单元。书中提到了存放年、月、日、时、分、秒的内存单元号为9、8、7、4、2、0,所以实验14也就比较简单了。
定址方式就借鉴了实验13中的,这种方法确实不错。
【代码】
assume cs:code
code segment
str: db '// :: '
row: db 9,8,7,4,2,0
start: mov ax,cs
mov ds,ax
mov ax,...
定址方式就借鉴了实验13中的,这种方法确实不错。
【代码】
assume cs:code
code segment
str: db '// :: '
row: db 9,8,7,4,2,0
start: mov ax,cs
mov ds,ax
mov ax,...
阅读全文 |
评论次数(1) |
浏览次数(1126) |
所属类型(汇编作业)
[2009-02-08 18:33] 【实验13】编写、应用中断例程
学完这一章,对于中断程序有了更进一步的了解,感觉类似于子程序,只不过这个子程序多了个事先安装的过程。可以解决上一章遗留的一个小问题了,本章开始就提到了,这与上一章的推测是一致的,只是那是原理还搞不明白,现在就好多了。
后面几节提到了bios和dos中断例程,我想这就是一个很大的资源啊,在网上搜到了一些关于bios和dos的入口出口参数,再好好琢磨下。
实验13提到的题目并不难,其实就是写个子程序,入口参数已经给出,第2道书中已经讲过了。第3题的编程思想值得学习,感觉真的很灵活呢,让我自己想可能都想不到这种方法。
【题目1】
assume cs:code
cod...
后面几节提到了bios和dos中断例程,我想这就是一个很大的资源啊,在网上搜到了一些关于bios和dos的入口出口参数,再好好琢磨下。
实验13提到的题目并不难,其实就是写个子程序,入口参数已经给出,第2道书中已经讲过了。第3题的编程思想值得学习,感觉真的很灵活呢,让我自己想可能都想不到这种方法。
【题目1】
assume cs:code
cod...
阅读全文 |
评论次数(2) |
浏览次数(702) |
所属类型(汇编作业)
[2009-02-07 15:50] 【实验12】编写0号中断的处理程序
看完了第12章,感觉到这个中端机制确实强大,cpu每执行完一条指令,就检测是不是有中断信息。接受到中断信息后,对于不同的信息就转到中断向量表中不同的位置,读取中断程序的入口地址,然后执行中断程序,完毕后再返回。由于中断信息有各种各样的,所以能处理的情况也就有很多。
本章的程序没什么问题,后面的实验12也就是把书中的程序改动几处即可。但是我有两个问题还不理解:
【问题1】cpu可以根据不同的中断信息来执行不同的中断程序,但是cpu是如何得知产生了中断信息呢?对于单步执行已经明白,就是每次检测到TF位为1,就引发但不中断。但是对于除法溢出呢?每次除法溢出后会有怎样的改变使得cpu得到了...
本章的程序没什么问题,后面的实验12也就是把书中的程序改动几处即可。但是我有两个问题还不理解:
【问题1】cpu可以根据不同的中断信息来执行不同的中断程序,但是cpu是如何得知产生了中断信息呢?对于单步执行已经明白,就是每次检测到TF位为1,就引发但不中断。但是对于除法溢出呢?每次除法溢出后会有怎样的改变使得cpu得到了...
阅读全文 |
评论次数(4) |
浏览次数(1259) |
所属类型(汇编作业)
[2009-02-06 23:18] 【课程设计1的拓展】打印九九乘法表
通过实验10以及课程设计一的实践,发现了不少问题,也收获了不少经验。我想学习本就是一个不断发现问题以及增长经验的过程。为了巩固一下之前的学习,加深对学过知识的理解,我想了一道题目,做为给自己的一个测试。之所以选这个九九乘法表,是因为它类似于课程设计一,之前写的几个子程序show_str、dtoc、divdw都能派上用场,且输出也有格式限制,我想用它来做一个课设一的补充题目是很合适的。
这次写就轻松多了,我的思路是先把类似于1x1=输入到屏幕上,然后再集中解决相乘以后的十六进制数转化为字符串的问题。程序过程中我出现的几个错误及解决:
[1]写好运行第一遍时又出现了死循环,满屏幕的1...
这次写就轻松多了,我的思路是先把类似于1x1=输入到屏幕上,然后再集中解决相乘以后的十六进制数转化为字符串的问题。程序过程中我出现的几个错误及解决:
[1]写好运行第一遍时又出现了死循环,满屏幕的1...
阅读全文 |
评论次数(1) |
浏览次数(1691) |
所属类型(汇编作业)
[2009-02-06 22:55] 【实验11】编写子程序
第11章,我几乎是怀着很兴奋的心情看完的。因为这一章讲的一些命令,我感觉学到目前为止,又让我能用汇编处理的东西多了一个层次。首先是adc与sbb命令,使大数和、差不成问题,然后是cmp命令与条件转移指令(je、jne、jb、jnb、ja、jna)的结合,此就相当于高级语言中的if命令了,这可是一个重要的功能,可以执行数的大小判断、区间判断等等涉及到需要比较灵活的条件才继续执行的程序、最后又有一个df标志与movsb、movsw命令,事先设置好df的值,只需要短短的一行rep movsb(movsw)就可以实现数据的批量赋值。很强大!
这章开始的几节是讲几个标志寄存器的情况,刚开始看...
这章开始的几节是讲几个标志寄存器的情况,刚开始看...
阅读全文 |
评论次数(3) |
浏览次数(983) |
所属类型(汇编作业)
[2009-02-06 01:04] 【课程设计一】按格式显示数据
同学聚会,又玩了一天。晚上回来赶紧把遗留的课程设计一给做做。虽然昨天走的时候已经把大概思路理了一下,但今天还是花了两个多小时。以后真是要细心一点,一个很不起眼的笔误就会耽误大量的时间去查找。编写过程中遇到的问题以及注意:
【思路】课设一与之前的实验7思路相类似。共同之处在于都是把data段中的内容按格式写入地址。不同之处在于课设一是写入缓存,并且主要是以可以识别的Ascii字符形式写入。思考:
<1>年份已经是字符串类型,只需要从data中读取,然后直接写入显存中。
<2>收入,雇员和人均收入都需要进行转化。注意的是有些数据已经超出16字节,需要把之前写的子程序3稍微...
【思路】课设一与之前的实验7思路相类似。共同之处在于都是把data段中的内容按格式写入地址。不同之处在于课设一是写入缓存,并且主要是以可以识别的Ascii字符形式写入。思考:
<1>年份已经是字符串类型,只需要从data中读取,然后直接写入显存中。
<2>收入,雇员和人均收入都需要进行转化。注意的是有些数据已经超出16字节,需要把之前写的子程序3稍微...
阅读全文 |
评论次数(1) |
浏览次数(1666) |
所属类型(汇编作业)
[2009-02-04 03:18] 【实验10[1-3]】编写子程序
【1】显示字符串
这个子程序比较简单,和上一个输出显示的程序类似。需要注意的是给定已经赋值的参数后要对参数进行转换操作。转换为要求的显示位置的缓存地址。我的代码中有两处可以提高些效率:
<1>把mov ax,0b800h 和 mov es,ax写到上面,避免后面每次循环都执行此两句。
<2>本来计算列数,要先减一,再乘2。把乘2换为加法运算,这样可以避免之前保存在ax中的结果再次另存。可以省去一行保存ax的代码。
[show_str]
assume cs:code
data segment
db 'Welcome to masm!',0
data ends ...
这个子程序比较简单,和上一个输出显示的程序类似。需要注意的是给定已经赋值的参数后要对参数进行转换操作。转换为要求的显示位置的缓存地址。我的代码中有两处可以提高些效率:
<1>把mov ax,0b800h 和 mov es,ax写到上面,避免后面每次循环都执行此两句。
<2>本来计算列数,要先减一,再乘2。把乘2换为加法运算,这样可以避免之前保存在ax中的结果再次另存。可以省去一行保存ax的代码。
[show_str]
assume cs:code
data segment
db 'Welcome to masm!',0
data ends ...
阅读全文 |
评论次数(1) |
浏览次数(750) |
所属类型(汇编作业)
[2009-02-04 02:34] 【实验6补充】问题7.9的拓展
在学到问题7.9(即实验6)时,我曾经提出过一个问题,就是能不能同时处理不同长度的字符串。学到第十章,已经可以解决这个遗留问题。可以处理两种情况:
<1>即课本上的情况,每行都为16个字节,但每行的单词字母个数不相等。
<2>单词字母个数不同,且单词为一个挨着一个,以0分隔。
现以情况<2>为例说明:
思路:共四个单词,外循环4次。每次对每个单词执行小写转大写。用jcxz结束当前单词,内存地址依次增加即可。情况<1>与此类似,不同在于内存地址第二次从第二行开始,以此类推。
【代码】
assume cs:code
data segment
db 'display',0
...
<1>即课本上的情况,每行都为16个字节,但每行的单词字母个数不相等。
<2>单词字母个数不同,且单词为一个挨着一个,以0分隔。
现以情况<2>为例说明:
思路:共四个单词,外循环4次。每次对每个单词执行小写转大写。用jcxz结束当前单词,内存地址依次增加即可。情况<1>与此类似,不同在于内存地址第二次从第二行开始,以此类推。
【代码】
assume cs:code
data segment
db 'display',0
...
阅读全文 |
评论次数(1) |
浏览次数(1216) |
所属类型(汇编作业)
『 查看更多文章 』