鱼C论坛

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

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

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

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

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

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

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

        ;把showmsg的入口地址(0000:0200)保存到向量表
        ;试验的是0号中断,0000即(cs)保存到0000:0*4+2,0200h即(ip)保存到0000:0*4
        ;当遇0号中断,则从0*4+2取出cs,从0*4取出ip
        ;开始时cs、ip顺序搞反,出错!
        mov ax,0
        mov ds,ax
        mov ds:[2],ax
        mov ax,200h
        mov ds:[0],ax
        
        mov ax,4c00h
        int 21h
        
showmsg:;要把这段程序加到一个安全的内存空间,并把入口地址写到中断向量表
                ;整体移动,那么数据也要放到这里,否则有丢失可能
                ;写法是jmp+数据 ,开始写成了 datasg segment ...,出错! 后者不能嵌套
        jmp short sdo
        db 'Error!Overflow'
sdo:push ds
        push si
        push es
        push di
        push cx
        push ax
        mov ax,cs;开始写成了showmsg,出错!!值得多想想,为什么?
        mov ds,ax
        mov si,202h;不是0,而是202h,因为指定了内存位置是0:200。
        ;上3句让ds:si指向"Error..."开头,
        ;因为cs是明确的,数据也在cs段中,所以用cs段的偏移来定位,而不是通常的ds+偏移定位数据方式
        mov ax,0b800h
        mov es,ax
        mov di,160*10+60;可以运算
        ;上3句指向0b800~0bfff显示缓存区域,位置在熟悉一下0b800
        mov cx,14;字符串长度
s1:        mov al,byte ptr ds:[si]
        mov byte ptr es:[di],al;开始写成了mov 内存,内存,出错!!
        mov byte ptr es:[di+1],2h
        add si,1
        add di,2
        loop s1
        pop ax
        pop cx
        pop di
        pop es
        pop si
        pop ds
        mov ax,4c00h
        int 21h
showmsgend:nop
codesg ends
end start
想知道小甲鱼最近在做啥?请访问 -> 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字节空间一般是空的,不用白不用.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-11 19:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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