|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
复制代码 |
|