学习了同学们的程序,发现了更好的方法。自己总是跳不出框框,思维定势。怎么办?
上一个程序,将子程序的偏移地址定义为dw sub1-(int7c-start)+200h。
1.将中断例程放在安装程序start之前,就可以在偏移量中去掉复制指令那段代码占用的字节,变成dw sub1+200h。
2.将中断例程入口地址设置为0020:0000,就可以解决总是以0为基础地址的问题,变成dw sub1。
修改后程序如下:
assume cs:code
code segment
int7c: 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
;以下为子程序1,完成清屏
sub1: push ax
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
sub1s: mov byte ptr es:[bx],' '
add bx,2
loop sub1s
pop es
pop cx
pop bx
pop ax
ret
;以下为子程序2,设置前景色
sub2: push bx
push cx
push es
cmp al,0
jb sub2e
cmp al,7
ja sub2e
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
sub2s: and byte ptr es:[bx],11111000b
or es:[bx],al
add bx,2
loop sub2s
sub2e: pop es
pop cx
pop bx
ret
;以下为子程序3,完成设置背景色
sub3: push ax
push bx
push cx
push es
cmp al,0
jb sub3e
cmp al,7
ja sub3e
mov cl,4
shl al,cl
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
sub3s: and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop sub3s
sub3e: pop es
pop cx
pop bx
pop ax
ret
;以下为子程序41,完成向上滚动一行
sub4: push cx
push si
push di
push es
push ds
mov si,0b800h
mov es,si
mov ds,si
mov di,0
mov si,160
mov cx,24
cld
sub4s: push cx
mov cx,160
rep movsb
pop cx
loop sub4s
pop ds
pop es
pop di
pop si
pop cx
ret
int7ce: nop
start: mov ax,0
mov es,ax
mov di,200h
mov ax,code
mov ds,ax
mov si,offset int7c
mov cx,offset int7ce-offset int7c
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
- [游客] 感谢 11/15 22:10
- [游客] 把:DD 5937000,改成:DD 4294967295,你的错误,立刻就暴露出来。呵呵 05/19 18:30
- [游客] 计算人均时,是DD型除以DW型。把DD型的最大值代进去,你的程序,就溢出了。 05/19 18:28
- [游客] 注意不溢出的除法。 05/19 18:25
- [游客] 老师好啊~ 06/28 11:01
- [longphui] 谢谢 09/03 20:10
- [longphui] 谢谢 09/03 16:23
- [longphui] 谢谢 09/02 15:26
- [longphui] 谢谢 09/02 09:13
- [sissim] 恩恩,谢谢指正 01/11 18:24
- [even3] 亲,你好。。。这边有一个汇编语言程序,但是就是不知道哪里出了问题,问了很多人,都不知道想麻烦您一下, 05/16 20:48
- [mcjfo] 楼主可以帮我解决这个问题吗?谢谢! 为什么它会跳过JMP DD 指令不执行啊 小弟搞了好久抖没 06/08 06:50