安装7ch中断的程序如下:
assume cs:code
code segment
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],200h
mov word ptr es:[4*7ch+2],0
mov ax,4c00h
int 21h
int7c: jmp short set
dw sub1-(int7c-start)+200h,sub2-(int7c-start)+200h,sub3-(int7c-start)+200h,sub4-(int7c-start)+200h
;这里,不能用table dw sub1,sub2...因为table的地址以及定义的子程序的地址,代表这些标号在安装程序中的偏移地址,复制到0:200h后,这些标号所代表的地址应发生变化,而安装程序编译后,标号已经变成数值了,因为不会发生变化,会引起程序的转移发生变化。不知道有没有更好的方法解决这个问题。
set: push bx
cmp ah,3
ja sret
mov bl,ah
mov bh,0
add bx,bx
call word ptr cs:202h[bx];这里直接用了202h而没有用table,也是因为相对位移量发生了变化。
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
code ends
end start
调用7ch中断的程序如下:
assume cs:code
code segment
start: mov ah,0;修改这里的立即数,分别测试四项功能
mov al,3
int 7ch
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