. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  王爽书上P272上一个改变屏幕显示颜色程序疑问  [待解决] 回复[ 5次 ]   点击[ 515次 ]  
yxlovemoney
[帖 主]   [ 发表时间: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
wsrf
[第1楼]   [ 回复时间:2009-05-21 17:41 ]   [引用]   [回复]   [ top ] 
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01
这可能与保护模式有关,直接执行没有问题,但是单步跟踪就会出现问题。
我觉得在实模式下应该不会有此问题。
704274243
[第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?
wsrf
[第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,没有什么奇怪的。
ylj1123456
[第4楼]   [ 回复时间:2010-06-21 13:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-06-01 11:08
遇到同样问题,待解
bright
[第5楼]   [ 回复时间:2010-09-03 06:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-08-21 09:41
也是遇到一样的问题额
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved