yundi 发表于 2016-1-23 15:09:52

第12章检测实验及笔记

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

第11章是1月15日,现在是23日,进度真慢{:10_243:}
看了中断处理程序,然后独立重做,错了好几个地方,记录一下
;这个程序将中断处理程序加载到内存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:,ax
        mov ax,200h
        mov ds:,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:
        mov byte ptr es:,al;开始写成了mov 内存,内存,出错!!
        mov byte ptr es:,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

yundi 发表于 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字节空间一般是空的,不用白不用.
页: [1]
查看完整版本: 第12章检测实验及笔记