- [fenglixin70953] assume cs:code ;实验14,显示当前日期,时间 code segment 09/28 09:54
- [fenglixin70953] assume cs:code data segment db '1975','1976 09/16 17:38
- [fenglixin70953] 看了论坛的贴子,终于会了 assume cs:code code segment 05/06 18:41
- [游客] 谢谢楼上改下面这样可以成功,但用直接定址表如何实现拷贝后子程序中sub标号的定位呢。没想出来。 a 05/04 13:55
- [游客] 中断例程中的的call自己例程中子程序,应该是用jmp基于偏移变量跳转,而不能单纯的call,因为子 05/03 18:48
- [游客] table dw sub1,sub2,sub3,sub4 ------- 定址表应该用偏移距离 05/03 18:43
- [fenglixin70953] s: mov dl,0 mov cx,49 s5: pus 04/28 11:01
- [hychewei] 看不懂!!能讲讲不?还有为什么没有那么伪代码? 04/23 22:23
- [fenglixin70953] 呵 04/17 22:20
- [wdm] 不错。不过,程序没有注释和分析,就会像僵尸一样干瘪啊。 04/17 20:01
[2008-05-03 16:05] 实验16运行弹出错,请指点哪错了
code segment
start:mov ax,cs
mov ds,ax
mov ax,0
mov es,ax
mov si,offset setscreen
mov di,200h
mov cx,offset setscreenend-offset setscreen
cld
rep movsb
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ax,202h
int 7ch
mov ax,4c00h
int 21h
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,4000
sub1s:mov byte ptr es:[bx],' '
add bx,2
loop sub1s
pop es
pop cx
pop bx
ret
sub2:push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,4000
sub2s:and byte ptr es:[bx],11111000b
or es:[bx],al
add bx,2
loop sub2s
pop es
pop cx
pop bx
ret
sub3:push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
mov cl,4
shl al,cl
mov cx,4000
sub3s:and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop sub3s
pop es
pop cx
pop bx
ret
sub4:push ds
push cx
push es
push si
push di
mov si,0b800h
mov es,si
mov ds,si
mov si,160
mov di,0
cld
mov cx,4000
sub4s:push cx
mov cx,160
rep movsb
pop cx
loop sub4s
mov cx,80
mov si,0
sub4s1:mov byte ptr es:[164*24+si],' '
add si,2
loop sub4s1
pop di
pop si
pop es
pop cx
pop ds
ret
setscreenend:nop
code ends
end start
[ 游客 发表于 2008-05-03 18:43 ]
table dw sub1,sub2,sub3,sub4
-------
定址表应该用偏移距离。因为你的安装程序放到了另外的内存空间,你sbu1代表的地址已经不是初始时给定的地址了。
[ 游客 发表于 2008-05-03 18:48 ]
中断例程中的的call自己例程中子程序,应该是用jmp基于偏移变量跳转,而不能单纯的call,因为子程序的地址在加载的时候就形成了,而你又吧这些子程序拷贝放到其他内存空间中,地址已经变了,不再是加载时候形成的地址了,所以,你在call的时候,在新的段空间中,你的地址形成的物理地址就错了,自然找不到你的sub程序,造成错误很正常。
先把这个改了之后,再说吧。
[ 游客 发表于 2008-05-04 13:55 ]
谢谢楼上改下面这样可以成功,但用直接定址表如何实现拷贝后子程序中sub标号的定位呢。没想出来。
assume cs:code
code segment
start:mov ax,cs
mov ds,ax
mov ax,0
mov es,ax
mov si,offset setscreen
mov di,200h
mov cx,offset setscreenend-offset setscreen
cld
rep movsb
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ax,202h
int 7ch
mov ax,4c00h
int 21h
setscreen:
set:push bx
cmp ah,3
ja sret
cmp ah,0
je sub1
cmp ah,1
je sub2
cmp ah,2
je sub3
cmp ah,3
je sub4
sret:pop bx
iret
sub1:push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,4000
sub1s:mov byte ptr es:[bx],' '
add bx,2
loop sub1s
pop es
pop cx
pop bx
jmp short sret
sub2:push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,4000
sub2s:and byte ptr es:[bx],11111000b
or es:[bx],al
add bx,2
loop sub2s
pop es
pop cx
pop bx
jmp short sret
sub3:push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
mov cl,4
shl al,cl
mov cx,4000
sub3s:and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop sub3s
pop es
pop cx
pop bx
jmp short sret
sub4:push ds
push cx
push es
push si
push di
mov si,0b800h
mov es,si
mov ds,si
mov si,160
mov di,0
cld
mov cx,4000
sub4s:push cx
mov cx,160
rep movsb
pop cx
loop sub4s
mov cx,80
mov si,0
sub4s1:mov byte ptr es:[164*24+si],' '
add si,2
loop sub4s1
pop di
pop si
pop es
pop cx
pop ds
jmp near ptr sret
setscreenend:nop
code ends
end start
[ fenglixin70953 发表于 2008-05-06 18:41 ]
看了论坛的贴子,终于会了
assume cs:code
code segment
setscreen:jmp short set
dw sub1,sub2,sub3,sub4
set:push bx
push dx
cmp ah,3
ja sret
mov bl,ah
mov bh,0
add bx,bx
mov dx,cs:[bx+202h]
add dx,200h
call dx
sret:pop dx
pop bx
iret
sub1:push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,4000
sub1s:mov byte ptr es:[bx],' '
add bx,2
loop sub1s
pop es
pop cx
pop bx
ret
sub2:push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,4000
sub2s:and byte ptr es:[bx],11111000b
or es:[bx],al
add bx,2
loop sub2s
pop es
pop cx
pop bx
ret
sub3:push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
mov cl,4
shl al,cl
mov cx,4000
sub3s:and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop sub3s
pop es
pop cx
pop bx
ret
sub4:push ds
push cx
push es
push si
push di
mov si,0b800h
mov es,si
mov ds,si
mov si,160
mov di,0
cld
mov cx,4000
sub4s:push cx
mov cx,160
rep movsb
pop cx
loop sub4s
mov cx,80
mov si,0
sub4s1:mov byte ptr es:[164*24+si],' '
add si,2
loop sub4s1
pop di
pop si
pop es
pop cx
pop ds
ret
setscreenend:nop
start:mov ax,cs
mov ds,ax
mov ax,0
mov es,ax
mov si,0
mov di,200h
mov cx,offset setscreenend-offset setscreen
cld
rep movsb
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ax,202h
int 7ch
mov ax,4c00h
int 21h
code ends
end start