|
主题 : : 我的实验16,使用直接定址,不使用ORG [待解决] |
回复[ 9次 ]
点击[ 729次 ] | |
荣誉值:0
信誉值:0
注册日期:2008-12-26 11:18 |
我看到很多同学的代码,最终为了使代码通过,修改了call word ptr table[bx]这行代码。
个人认为,这句代码才是直接定址的精髓,如果把他改掉,那这个实验就失去了意义。
还有一些同学,使用了ORG,使代码看起来很清爽,但有使用高中的数学方法解小学数学题的嫌疑。
下面是我的代码:(后面的delay子程序是调试时使用的,可以删除)
;名称: 包含多个子功能子程序的中断例程
;功能: 1.清屏
; 2.设置前景色
; 3.设置背景色
; 4.向上滚动一行
;参数: ah传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行
; 对于2、3号功能,用al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
;屏幕设置程序(包括清屏、设置前景色、设置背景色、向上滚动一行四个子程序)
;用ah传送调用哪个子程序,用al传递颜色值(设置前景色、设置背景色时才使用)
setscreen:
jmp short set
table dw sub1 , sub2, sub3, sub4
set:
push bx
cmp ah, 3
ja sret
mov bl, ah
mov bh, 0
add bx, bx
call word ptr table[bx]
sret:
pop bx
iret
;清屏
sub1:
push bx
push cx
push es
mov bx, 0b800h
mov es, bx
mov bx, 0
mov cx, 2000
s1:
mov byte ptr es:[bx], ' '
add bx, 2
loop s1
pop es
pop cx
pop bx
ret
;设置前景色
;由al传递颜色值
sub2:
push bx
push cx
push es
mov bx, 0b800h
mov es, bx
mov bx, 1
mov cx, 2000
s2:
and byte ptr es:[bx], 11111000b
or es:[bx], al
add bx, 2
loop s2
pop es
pop cx
pop bx
ret
;设置背景色
;由al传递颜色值
sub3:
push bx
push cx
push es
mov cl, 4
shl al, cl
mov bx, 0b800h
mov es, bx
mov bx, 1
mov cx, 2000
s3:
and byte ptr es:[bx], 10001111b
or es:[bx], al
add bx, 2
loop s3
pop es
pop cx
pop bx
ret
;向上滚一行
sub4:
push cx
push di
push si
push ds
push es
mov si, 0b800h
mov ds, si
mov es, si
mov si, 160 ;指定源地址
mov di, 0 ;指定目的地址
cld
mov cx, 24 ;要复制的行数
s4:
push cx
mov cl, 160 ;每行的字节数
rep movsb
pop cx
loop s4
mov cx, 80
mov si, 0
s42:
mov byte ptr es:[160*24+si], ' '
add si, 2
loop s42
pop es
pop ds
pop si
pop di
pop cx
ret
setscreenend:
nop
start:
mov ax, stack
mov ss, ax
mov sp, 128
;复制新的中断向量处理程序到200h处
mov ax, cs
mov ds, ax
mov si, offset setscreen ;设置ds:si指向源地址
mov ax, 0
mov es, ax
mov di, 200h ;设置es:di指向目的地址
mov cx, offset setscreenend - offset setscreen ;设置复制长度
cld ;设置复制方向
rep movsb
;设置7ch中断向量表
cli
mov ax, 0
mov es, ax
mov word ptr es:[7ch*4], 0h
mov word ptr es:[7ch*4+2], 20h
sti
mov ax, 4c00h
int 21h
;延时子程序
delay:
push ax
push dx
mov dx, 1000h
mov ax, 0
ds1:
sub ax, 1
sbb dx, 0
cmp ax, 0
jne ds1
cmp dx, 0
jne ds1
pop dx
pop ax
ret
code ends
end start | | |