. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  请教一下各位前辈一个问题?  [已解决] 回复[ 4次 ]   点击[ 629次 ]  
dickyq
[帖 主]   [ 发表时间:2008-06-12 20:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-05-29 22:09
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                        
  mov   di,   204h                                
  mov   cx,   offset   int9end-offset   int9         
  cld                                             
  rep   movsb                                      
    
  push   es:[9*4]                                  
  pop   es:[200h]                                 
  push   es:[9*4+2]                             
  pop   es:[202h]                                
  cli   
  mov   word   ptr   es:[9*4],   204h    
  mov   word   ptr   es:[9*4+2],   0     
  sti   
    
  mov   ax,   4c00h   
  int   21h   
    
  int9:   
  push   ax   ;------------------------ sp
  push   bx   ;------------------------ sp - 2
  push   cx   ;------------------------ sp - 2
  push   es   ;------------------------ sp - 2
    
  in   al,   60h   
    
  pushf       ;------------------------ sp - 2 ??? 这里入的是和上面是同一段栈吗?  我的问题是在下面出栈的顺序,请看int9ret标识处       
  call   dword   ptr   cs:[200h]  ;--------------- cs 入栈,ip入栈                          
    
  cmp   al,   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   ;如果是同一段栈那么这里es应该是ip的值
  pop   cx   ;这里是cx是CS的值
  pop   bx   ;这里是标志寄存器的值才对,可程序正常返回,就是请教这里栈的问题?
  pop   ax   
  iret   
    
  int9end:   
  nop   
    
  code   ends   
  end   start
tomato
[第1楼]   [ 回复时间:2008-06-12 21:13 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
pushf       ;------------------------ sp - 2 ??? 这里入的是和上面是同一段栈吗?  我的问题是在下面出栈的顺序,请看int9ret标识处    
--------------------------
如果栈段寄存器ss没变,那么就是同一个栈段。是同一个栈段。


  pop   es   ;如果是同一段栈那么这里es应该是ip的值 
  pop   cx   ;这里是cx是CS的值 
  pop   bx   ;这里是标志寄存器的值才对,可程序正常返回,就是请教这里栈的问题? 
  pop   ax    
-------------------------
这里楼主的理解有问题。这里的
pop es
pop cx
pop bx
pop ax
是和前边的
push ax
push bx
push cx
push es
相对应的。
至于楼主说的出栈的ip cs的值在call调用的子程序中已经执行了,也就是说已经出栈了!
dickyq
[第2楼]   [ 回复时间:2008-06-12 22:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-05-29 22:09
那按楼上所说,请问iret 返回的是什么值呢?
push ax
push bx
push cx
push es
然后才pushf,栈顶应该是flags的值
call 返回执行了cs,ip 那么iret执行的是
pop ip
pop cs
popf

而上面
pop es ;这里应该返回pushf以后的值才对啊,因为pushf是最后入栈的
pop cx 
pop bx 
pop ax 
所以还是有点糊涂,再请指点.
duckgaga
[第3楼]   [ 回复时间:2008-06-12 23:28 ]   [引用]   [回复]   [ top ] 
荣誉值:44
信誉值:0
注册日期:2008-04-11 13:33
看样子上楼的没有完全弄清楚这几行代码是干什么用的:
--------
push   es:[9*4]                                   
  pop   es:[200h]                                  
  push   es:[9*4+2]                              
  pop   es:[202h]       
---------
这几行代码是把原int9中断的调用地址给设置到0:200h-203h处了,注意只是修改了其调用地址(中断向量表),因为我们还是要用到原来的int9来处理硬件细节的!所以这里只是修改了中断向量表,当你用call   dword   ptr   cs:[200h]时,其实际就是调用了原来的int9中断,而原来的int9中断例程里面肯定是包含有返回语句ret的,因此这个call   dword   ptr   cs:[200h] 执行完以后原先入栈的CS、IP就出栈了!所以tomato说的是对的!
如果还不明白,请认真再看看课本,请记住这一点call   dword   ptr   cs:[200h]是调用了原来的int9中断!
dickyq
[第4楼]   [ 回复时间:2008-08-12 20:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-05-29 22:09
此贴由 贴主 于 [ 2008-08-12 20:54 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved