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