|
主题 : : 最新捷报`~` [待解决] |
回复[ 19次 ]
点击[ 1012次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-02-25 18:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:0
注册日期:2007-08-07 13:15 |
今天是第10天,突破16章.附上实验16代码.
assume cs:code
code segment
int7c:jmp short int7c_set
table dw sub1,sub2,sub3,sub4
int7c_set:push bx
cmp ah,3
ja int7c_exit
mov bh,0
mov bl,ah
add bx,bx
call word ptr table[bx]
int7c_exit:pop bx
iret
sub1:push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov cx,2000
mov bx,0
sub1s:mov byte ptr es:[bx],' '
add bx,2
loop sub1s
pop es
pop cx
pop bx
ret
sub2:push ax
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
sub2s:and byte ptr es:[bx],11110000b
or es:[bx],al
add bx,2
loop sub2s
pop es
pop cx
pop bx
pop ax
ret
sub3:push ax
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov cl,4
shl al,cl
mov cx,2000
mov bx,1
sub3s:and byte ptr es:[bx],00001111b
or es:[bx],al
add bx,2
loop sub3s
pop es
pop cx
pop bx
pop ax
ret
sub4:push cx
push si
push di
push ds
push es
mov si,0b800h
mov es,si
mov ds,si
mov si,160
mov di,0
mov cx,24
cld
sub4s:push cx
mov cx,160
rep movsb
pop cx
loop sub4s
mov cx,80
mov si,0
sub4s2:mov byte ptr es:[si],' '
add si,2
loop sub4s2
pop es
pop ds
pop di
pop si
pop cx
ret
int7c_end:nop
start:mov ax,0
mov es,ax
mov di,200h
mov ax,cs
mov ds,ax
mov si,offset int7c
mov cx,offset int7c_end-offset int7c
cld
rep movsb
cli
mov word ptr es:[7ch*4],0
mov word ptr es:[7ch*4+2],20h
sti
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-02-25 21:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21 |
|
|
|
|
|
[第2楼]
[ 回复时间:2008-02-25 21:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:152
信誉值:3
注册日期:2008-01-24 21:26 |
to 101319007:
你就是江湖我大哥!学习劲头都跟你似的,中国计算机的发展估计就要坐火箭了! | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-02-26 14:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-12-15 17:23 |
恭喜,看来你基础应该不错.
我是去年12.20开始学习,搞到现在才弄完16章,目前本章还有一点没有搞明白的地方.
我属于很慢的那种.悟性低,没有办法. | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-02-27 15:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:45
信誉值:0
注册日期:2007-05-05 09:01 |
回复:[第3楼]
------------------
学习贵在坚持,不放弃! | | |
|
|
|
|
[第5楼]
[ 回复时间:2008-05-02 15:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:10
信誉值:0
注册日期:2008-03-22 20:52 |
都象你这种学习速率,真的中国计算机的发展就要坐火箭了!!!!!!!!!!!!!!!!!!!! | | |
|
|
|
|
[第6楼]
[ 回复时间:2008-05-02 23:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:10
信誉值:0
注册日期:2008-03-22 20:52 |
实验16要求写成中断例程并安装,怎么我看你写的不是中断例程,而是子程序. | | |
|
|
|
|
[第7楼]
[ 回复时间:2008-05-02 23:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:10
信誉值:0
注册日期:2008-03-22 20:52 |
|
|
|
|
|
[第8楼]
[ 回复时间:2008-06-02 17:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:10
注册日期:2008-05-18 20:29 |
回复:[第6楼]
------------------
...你没看仔细吧? | | |
|
|
|
|
[第9楼]
[ 回复时间:2008-06-06 12:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2008-05-13 20:29 |
呵呵,兄台,试问一下。
sub1,sub2,sub3,sub4不过是操作符,是由编译器识别的。那么此代码,编译器编译时,按现行的内存单元取得各标号的偏移地址存放到table表中,那么当把此代码复制到其它地方时?call的是原安装程序中的各标号的地址呢?还是中断例程中的???
我开始跟你一样,一下就写出来了。可运行就出错了。最后才想出是这里的问题,call指向了一个错误的地址。
兄台可还记得跟据位移转移的作用? | | |
|
|
|
|
[第10楼]
[ 回复时间:2008-06-11 11:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:5
注册日期:2007-11-13 22:57 |
回复:[第3楼]
------------------
学习贵在坚持,不放弃!
------------------
回复:xiaochong 大哥的话 跪在坚持· | | |
|
|
|
|
[第11楼]
[ 回复时间:2008-06-25 18:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-04-27 16:45 |
|
|
|
|
|
[第12楼]
[ 回复时间:2008-07-03 19:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-05-05 06:57 |
回复:[第9楼] 问的好,这两天正为此问题郁闷呢,知道是调用地址错误,就是找不出问题出处,一说才明白了! | | |
|
|
|
|
[第13楼]
[ 回复时间:2008-07-04 17:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:8
注册日期:2008-06-20 21:12 |
|
|
|
|
|
[第14楼]
[ 回复时间:2008-09-21 08:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-07-09 11:14 |
很好。我的理解是:
为了使编译器生成的编号 与 中断在内存空间的编号相一致,采取了两条措施:1 安装程序中将中断代码移到前面,使第一条指令标号在编译时位移为0; 将cs改为20h,ip改为0, 使得中断程序在执行时能用上编译器生成的编号,同时也没有改变 中断代码在内存的实际位置. 因为 0000:0200 与 0020:0000 是同一位置.
这样设计才能用上本章的典型命令: call word ptr table[bx] | | |
|
|
|
|
[第15楼]
[ 回复时间:2008-10-23 10:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-10-15 19:31 |
|
|
|
|
|
[第16楼]
[ 回复时间:2008-12-01 00:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-08 21:55 |
0000:0200 与 0020:0000 是同一位置. 这个我不太明白 | | |
|
|
|
|
[第17楼]
[ 回复时间:2008-12-01 00:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-08 21:55 |
0000:0200 与 0020:0000 是同一位置,明白了,好像学了这么久最基本的竟然给忘了 | | |
|
|
|
|
[第18楼]
[ 回复时间:2008-12-20 23:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-12-06 07:47 |
你傻的啊~~~看看你自已的注册时间 6个月吧 说谎话之前别忘记把尾巴收好啊 别在这里侮辱我们的智慧啊!!!!! | | |
|
|
|
|
[第19楼]
[ 回复时间:2009-02-03 18:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-01-31 16:41 |
调试了两天 终于成功
assume cs:code
code segment
start:mov ax,cs
mov ds,ax
mov si,offset screen
mov ax,0
mov es,ax
mov di,200h
mov cx,offset screenend-offset screen
cld
rep movsb
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ax,4c00h
int 21h
;=========screen=====
screen:jmp short set
table dw offset sub1-offset screen+200h ,offset sub2-offset screen+200h, offset sub3-offset screen+200h , offset sub4-offset screen+200h
set:push bx
cmp ah,3
ja sret
mov bl,ah
mov bh,0
add bx,bx
call word ptr cs:[bx].202h
sret:pop bx
iret
;-----------sub1=====
sub1: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
ret
;=======sub2======
sub2:push bx
push cx
push es
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
pop es
pop cx
pop bx
ret
;------------ sub3 -----
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
sub3s:and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop sub3s
pop es
pop cx
pop bx
ret
;============sub4 =====
sub4:push cx
push si
push di
push es
push ds
mov si,0b800h
mov es,si
mov ds,si
mov si,160
mov di,0
cld
mov cx,24
sub4s:push cx
mov cx,160
rep movsb
pop cx
loop sub4s
mov cx,80
mov si,0
sub4s1:mov byte ptr [160*24+si],' '
add si,2
loop sub4s1
pop ds
pop es
pop di
pop si
pop cx
ret
screenend:nop
code ends
end start
大家多多指教 | | |