|
主题 : : 王爽书上P272上一个改变屏幕显示颜色程序疑问 [待解决] |
回复[ 5次 ]
点击[ 515次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-05-11 11:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-21 15:20 |
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,128
push cs
pop ds
mov ax,0
mov es,ax
mov si,offset int9 ;设置ds:si指向源地址
mov di,204h ;设置es:di指向目的地址
mov cx,offset int9end-offset int9 ;设置cx为传输长度
cld ;设置传输方向为正
rep movsb
push es:[9*4] ;将原int 9地址保存在0:200处
pop es:[200h]
push es:[9*4+2]
pop es:[202h]
cli
mov word ptr es:[9*4],204h ---->为什么执行这句后,提示CPU遇到无效的指令?
mov word ptr es:[9*4+2],0
sti
mov ax,4c00h
int 21h
int9:push ax
push bx
push cx
push es
in al,60h
pushf
call dword ptr cs:[200h] ;当此中断例程执行时cs=0
cmp al,3bh ;F1扫描码为3bh
jne int9ret
mov ax,0b800h
mov es,ax
mov bx,1
mov cx,2000
s:inc byte ptr es:[bx]
add bx,2
loop s
int9ret:pop es
pop cx
pop bx
pop ax
iret
int9end:nop
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-05-21 17:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01 |
这可能与保护模式有关,直接执行没有问题,但是单步跟踪就会出现问题。
我觉得在实模式下应该不会有此问题。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-09-19 16:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-09-19 16:10 |
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,128
push cs
pop ds
mov ax,0
mov es,ax
mov si,offset int9 ;设置ds:si指向源地址
mov di,204h ;设置es:di指向目的地址
mov cx,offset int9end-offset int9 ;设置cx为传输长度
cld ;设置传输方向为正
rep movsb
push es:[9*4] ;将原int 9地址保存在0:200处
pop es:[200h]
push es:[9*4+2]
pop es:[202h]
cli
mov word ptr es:[9*4],204h ---->为什么执行这句后,提示CPU遇到无效的指令?
mov word ptr es:[9*4+2],0
sti
mov ax,4c00h
int 21h
int9:push ax
push bx
push cx
push es
in al,60h
pushf
call dword ptr cs:[200h] ;当此中断例程执行时cs=0
cmp al,3bh ;F1扫描码为3bh
jne int9ret
mov ax,0b800h
mov es,ax
mov bx,1
mov cx,2000
s:inc byte ptr es:[bx]
add bx,2
loop s
int9ret:pop es
pop cx
pop bx
pop ax
iret
int9end:nop
code ends
end start
里面push cs
pop ds
有什么作用?
然后 call dword ptr cs:[200h]
为什么此时cs=0? | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-09-22 15:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01 |
push cs
pop ds
就是把CS的值赋给DS
call dword ptr cs:[200h] 调用的就是BIOS提供的9号中断处理程序,CS为0,那就表明BIOS提供的9号中断的段地址为0,没有什么奇怪的。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-06-21 13:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-06-01 11:08 |
|
|
|
|
|
[第5楼]
[ 回复时间:2010-09-03 06:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-08-21 09:41 |
|