鱼C论坛

 找回密码
 立即注册
查看: 2541|回复: 1

[汇编作业] 第12章检测实验及笔记

[复制链接]
发表于 2016-1-23 15:09:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 yundi 于 2016-4-11 15:43 编辑

第11章是1月15日,现在是23日,进度真慢
看了中断处理程序,然后独立重做,错了好几个地方,记录一下
  1. ;这个程序将中断处理程序加载到内存0000:0200中
  2. assume cs:codesg
  3. codesg segment
  4. start:
  5.         ;call showmsg 不调用,而是“安装”
  6.         ;即将showmsg程序代码复制到一个内存安全区域0000:0200
  7.         ;整体复制,用movsb 将ds:si 传送到es:di 再根据df位将si,di递增或递减
  8.         mov ax,codesg
  9.         mov ds,ax;开始没指定ds,出错!
  10.         mov si,offset showmsg
  11.         mov ax,0
  12.         mov es,ax
  13.         mov di,200h
  14.         mov cx,offset showmsgend - offset showmsg ;编译器可以计算要复制的字节数
  15.         cld
  16.         rep movsb

  17.         ;把showmsg的入口地址(0000:0200)保存到向量表
  18.         ;试验的是0号中断,0000即(cs)保存到0000:0*4+2,0200h即(ip)保存到0000:0*4
  19.         ;当遇0号中断,则从0*4+2取出cs,从0*4取出ip
  20.         ;开始时cs、ip顺序搞反,出错!
  21.         mov ax,0
  22.         mov ds,ax
  23.         mov ds:[2],ax
  24.         mov ax,200h
  25.         mov ds:[0],ax
  26.        
  27.         mov ax,4c00h
  28.         int 21h
  29.        
  30. showmsg:;要把这段程序加到一个安全的内存空间,并把入口地址写到中断向量表
  31.                 ;整体移动,那么数据也要放到这里,否则有丢失可能
  32.                 ;写法是jmp+数据 ,开始写成了 datasg segment ...,出错! 后者不能嵌套
  33.         jmp short sdo
  34.         db 'Error!Overflow'
  35. sdo:push ds
  36.         push si
  37.         push es
  38.         push di
  39.         push cx
  40.         push ax
  41.         mov ax,cs;开始写成了showmsg,出错!!值得多想想,为什么?
  42.         mov ds,ax
  43.         mov si,202h;不是0,而是202h,因为指定了内存位置是0:200。
  44.         ;上3句让ds:si指向"Error..."开头,
  45.         ;因为cs是明确的,数据也在cs段中,所以用cs段的偏移来定位,而不是通常的ds+偏移定位数据方式
  46.         mov ax,0b800h
  47.         mov es,ax
  48.         mov di,160*10+60;可以运算
  49.         ;上3句指向0b800~0bfff显示缓存区域,位置在熟悉一下0b800
  50.         mov cx,14;字符串长度
  51. s1:        mov al,byte ptr ds:[si]
  52.         mov byte ptr es:[di],al;开始写成了mov 内存,内存,出错!!
  53.         mov byte ptr es:[di+1],2h
  54.         add si,1
  55.         add di,2
  56.         loop s1
  57.         pop ax
  58.         pop cx
  59.         pop di
  60.         pop es
  61.         pop si
  62.         pop ds
  63.         mov ax,4c00h
  64.         int 21h
  65. showmsgend:nop
  66. codesg ends
  67. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-23 15:24:59 | 显示全部楼层
本帖最后由 yundi 于 2016-1-23 16:13 编辑

中断做了这样几件事:
1.取得中断类型码  N
2.pushf 保存标志位
3.TF=0 IF=0  ,TF=1产生单步中断
4.push CS
5.push IP
6.(IP)=(N*4),(CS)=(N*4+2)

中断处理程序:
和子程序相似,1.保存寄存器,2.处理中断,3.恢复寄存器,4.iret返回
iret做了这些事: 1.pop IP 2.pop CS 3.popf

要记的中断向量表在内存的位置
0000:0000 ~0000:03FF ,1024字节空间,1个中断码用4字节,256个中断码正好需要1KB,
但是实际的中断远没有256个,所以0000:0200~0000:02FF 的256字节空间一般是空的,不用白不用.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 05:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表