刚开始的时候,把中断例程的安装代码放在了后面,怎么调试都不对,郁闷了好半天。
assume cs:code
code segment
int7ch: jmp short main
table: dw cls,forecolor,backcolor,roll
main: push bx
cmp ah,3
ja return
mov bl,ah
mov bh,0
add bx,bx
call word ptr table[bx]
return: pop bx
iret
cls: push ax ;//清空
push bx
push cx
push ds
mov ax,0b800h
mov ds,ax
mov bx,0
mov cx,2000
empty: mov byte ptr [bx],' '
add bx,2
loop empty
pop ds
pop cx
pop bx
pop ax
ret
forecolor: push ax ;//换前景
push bx
push cx
push ds
mov bx,0b800h
mov ds,bx
mov bx,1
mov cx,2000
color: and byte ptr [bx],11111000b
or [bx],al
add bx,2
loop color
pop ds
pop cx
pop bx
pop ax
ret
backcolor: push ax ;//换背景
push bx
push cx
push ds
mov bx,0b800h
mov ds,bx
mov bx,1
mov cx,2000
icolor: push cx
and byte ptr [bx],10001111b
mov cl,4
shl al,cl
or [bx],al
shr al,cl ;//少了这句,差点就找不到了.
add bx,2
pop cx
loop icolor
pop ds
pop cx
pop bx
pop ax
ret
roll: push ax ;//滚动。
push cx
push ds
push di
push si
push es
mov ax,0b800h
mov ds,ax
mov es,ax
mov di,0
mov si,160
mov cx,160*24
cld
rep movsb
mov cx,80
inc si
clear: mov byte ptr es:[si],' '
add si,2
loop clear
pop es
pop si
pop di
pop ds
pop cx
pop ax
ret
int7chend: nop
start: mov ax,0
mov es,ax
mov di,200h ;es:di目的地址
mov ax,cs
mov ds,ax
mov si,offset int7ch ;ds:si源地址
mov cx,offset int7chend-offset int7ch ;长度
cld ;方向为正
rep movsb
mov word ptr es:[4*7ch],0
mov word ptr es:[4*7ch+2],20h ;//设置中断向量
mov ax,4c00h
int 21h
code ends
end start
- [anwu00] 写反了,最小为1001H,最大为2000H 05/10 11:04
- [crazyman] 博主确实好久不见了。 这里是一个开始,希望更多人都能从这里明确方向,开始自己的计算机之路。 08/16 14:55
- [游客] 你那个循环3FH错了 应该是循环40H 因为是添入0-63 就是添64次 08/02 17:27
- [游客] 我猜是因为2000:0000这段是给当成了一段栈寄存器使用了 所以一些数据会往里写入 写入的数据有的 07/29 23:00
- [游客] 2^N=寻址能力 N是总线宽度 算出的能力是B为单位 比如宽度13的CPU 2^13=8192 07/29 22:56
- [游客] 恩,有道理 04/08 12:25
- [atel] 那主程序我测试过的,可以显示的.但是加载到了软盘就不行了. 04/06 22:36
- [wdm] 没有错误啊。 我试了,运行ok的! 04/06 18:17
- [wdm] 说明程序还是有问题哟。 建议你一点一点的来做,先做一显示功能选项的界面吧。 然后在一点点的进行功 04/06 18:10
- [atel] 有什么错误? 04/04 21:33