搜索

汇编语言 第2版 课程设计2代码附详细说明

gecimao 发表于 2019-07-27 20:59 | 查看: | 回复:

  ;由于初学没有一点经验,有的时候碰到问题总感觉程序写的对啊,怎么还是出错。

  ;不过最终花了一个星期给写出来了!=.=,证明书里讲的都是正确的,使用的虚拟机也完全没有问题(用的是Bochs 2.3虚拟机)。

  ;于是就重写了int9中断,在这个中断里判断用户如果按了esc键就返回到主选单

  ;返回主选单后还要退出显示时钟的循环,于是就定义了一个变量keyisesc,初始值为0,

  ;功能2也是一个难点,因为我们的程序被加载到0:7c00h处,在这里我们还要将C盘的

  ;引导扇区也加载到0:7c00h处。所以要特别注意加载C盘引导扇区的程序不要被覆盖掉了,还有使用的栈也不要被覆盖掉

  div bx;用总字节/512(扇区的容量),al就记录的是要加载的扇区数

  add bx,512;因为已经加载一个扇区了,所以就要加载到7c00h+512(一个扇区的长度)后面

  ;这个stack的栈定义在程序的最后端,这样做是为了防止功能2(从c盘加载引导扇区)将栈给覆盖掉,所以放到最后

  ;这个子程序会被新的int9中断调用,int9调用它的时候是一个段间调用,所以它要使用retf返回。

  ;因为这样一来在编译后此处代码会变成 call 0aba:0123 带有段地址的代码

  ;那么在将当前程序往A盘写入后再被系统引导的时候调入,到这一步的时候就会发生错误

  ;(因为系统引导后当前的段地址是0,showoption的地址应该对应的是0:0123。于是在执行 call 0aba:0123的时候肯定就会出错)

  ;这里就采用模拟call far ptr的方式,先把段地址push到栈里,再使用段内调用

  ;引导扇区的最后2个字节必须是aa55h,所以在这里就要结束掉第一个扇区

  ;选项2的处理程序放到了最下面,这样做是为了防止在将C盘读入内存的时候不会被覆盖掉

  mov ax,002fh;为了防止过快的刷新时间,这里加了一个值为002f0000h的计数器,当值为0的时候才刷新

  jmp waitinput;当按下esc键,也就是keyisesc变量不为0的时候就继续等待用户的输入,这个时候已经返回主选单了(在新的int9中断里控制的)

  cmp ah,01h;如果按下了esc键就返回主选单的等待用户输入程序,这个时候已经返回主选单了(在新的int9中断里控制的)

  cmp al,30h;如果按的是除了0-9以外的其它键就继续等待用户输入

  sub al,31;将当前光标所在的列数减去31就是在systemdate变量中对应的索引位置

  ;如当前光标在31处,减去31等于0,就是年份的千位在 systemdate变量的0位

  ;如果下一个位置是日期的分隔符(如 2011-12-3 22:30:35 中的 - : 这些符号的时候 ),那就再往下移动一位

  ;将光标移动到下一位,如果达到最后一列会自动换行,如果达到最后一行的最后一列会返回到第一行的第一列

  ;将光标移动到上一位,如果到第一列会自动换行到上一行。如果到底一行的第一列,会跳到最后一行的最后一列

  mov bl,ss:[bp+7];要显示的颜色,这个不再使用了,随时可以按f1来更换颜色

  ;由于在新的int9中断里会监测esc键,如果按了esc键就要返回主选单,也就是要调用showoption子程序

  ;而int9中断和当前的程序没在一个段中。所以我们需要将showoption的段地址和偏移量记录下来供新的int9调用

  ;在新的in9中断里如果监测到esc键以后会将keyisesc变量设置为1,

  ;这样功能3循环显示时钟的时候,如果看到keyisesc变量为1了就知道用户返回主选单里,从而退出循环

  ;同样由于int9中断和keyisesc变量没在一个段中,所以需要将keyisesc的段地址和偏移量记录下来供新的in9调用

  and bx,11111100b;这几步应该是不需要的,因为系统中调用新的int9的时候已经把标志位if,tf设置为0了

  ;这一部分容易让人迷惑,我们主要要考虑到:新的中断是我们的程序在运行的时候复制过去的。

  ;如果按了f1就改变颜色,这里并没有指定颜色,而是根据当前的颜色+1产生新的颜色

  ;设置128个字节的栈,之所以放到最后是防止在调用功能2(调用C盘扇区)的时候被覆盖掉

  ;这里我也想到一个问题就是如果C盘引导程序继续读取更多的扇区的时候可能也会覆盖这个栈区域

  ;不知道是否可以不设置栈,使用系统自动分配的栈,或者C盘引导程序会分配自己的栈空间,还请大家指教。

  ;这里缺少一个功能,在从C盘引导后应该将新的int9中断给撤销,换回原来的int9中断

  ;我有点不太放心,C盘的引导扇区程序会不会也像我们一样将偏移地址的起始地址已经假设为 7c00h了或者其它的问题。

  ;当然这些朋友都已经测试过了应该是没问题,不过我还是老实将其加载到7c00h处吧=.=

  inc ax;因为肯定有余数的,所以将需要的扇区数+1。这样就能保证完整保存

本文链接:http://miamiaccounting.net/dierdaiyuyan/773.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部