汇编------实验16
assume cs:codecode segment
start:
mov ax,cs
mov ds,ax
mov ax,0
mov es,ax
mov si,offset int7c ;将新的int 7ch中断程序传入0:200处
mov di,200h
mov cx,offset int7cend-offset int7c
cld
rep movsb
;在中断向量表中设置新的int 7ch中断例程的入口地址
cli
mov word ptr es:,0
mov word ptr es:,200h
sti
mov ax,4c00h
int 21h
;新的int 7c中断例程?
org 200h ;有些网友说要加上org,但是加了还是不行啊
int7c:
jmp short s
data dw sub1-s+200h,sub2-s+200h,sub3-s+200h,sub4-s+200h
s: push bx
cmp ah,3
ja ok ;判断ah中的功能号是否大于3
mov bl,ah
mov bh,0
add bx,bx ;计算对应子程序在data表中的偏移
call word ptr data ;调用对应的功能子程序
ok: pop bx
iret
;功能:清屏
sub1: push ax
push es
push di
push cx
mov ax,0b800h
mov es,ax
mov cx,2000
mov di,0
s5: mov byte ptr es:,' '
add di,2
loop s5
pop cx
pop di
pop es
pop ax
ret
;设置前景色,al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}
sub2: push ax
push es
push bx
push di
mov bl,al
mov ax,0b800h
mov es,ax
mov di,1
mov cx,2000
s0: and byte ptr es:,11111000b
or es:,bl
add di,2
loop s0
pop di
pop bx
pop es
pop ax
ret
;设置背景色,al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}
sub3: push ax
push es
push bx
push di
mov cl,4
shl al,cl
mov bl,al
mov ax,0b800h
mov es,ax
mov di,1
mov cx,2000
s1: and byte ptr es:,10001111b
or es:,bl
add di,2
loop s1
pop di
pop bx
pop es
pop ax
ret
;向上滚动一行
sub4: push ax
push di
push bx
push si
push ds
mov ax,0b800h
mov es,ax
mov ds,ax
mov si,160
mov di,0
cld
mov cx,24
s2: push cx
mov cx,160
rep movsb
pop cx
loop s2
mov cx,80
s3: mov byte ptr es:,' '
add di,2
loop s3
pop ds
pop si
pop bx
pop di
pop ax
ret
int7cend:nop
code ends
end start
我这个程序哪里错了啊,编译过了,但是测试的时候,总是跳不到int 7ch中断显示
希望大家帮帮忙啊
换MASM5.0试试,记得用6.5经常报这个错误 亲,我想问一下 data dw sub1-s+200h,sub2-s+200h,sub3-s+200h,sub4-s+200h这句是什么意思哦,sub1这个已经是一个地址也还要减s的地址再加200h???不懂 C开头 发表于 2012-9-10 21:45
亲,我想问一下 data dw sub1-s+200h,sub2-s+200h,sub3-s+200h,sub4-s+200h这句是什么意思哦,sub1这个已经 ...
这些代码是放在0:200的地址位置的,但是如果不减s+200 那你看看它现在的偏移地址对吗,减s是计算函数到开头的距离,距离完成之后,因为你将这些代码放在的200的偏移地址中,所以你得加上200才是正确的偏移地址。 1366627538 发表于 2016-7-31 11:18
这些代码是放在0:200的地址位置的,但是如果不减s+200 那你看看它现在的偏移地址对吗,减s是计算函数到开 ...
data这里实际上是,就算sub1-s+200h也影响不到这里的值
页:
[1]