. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
主题 : :  分析一个奇怪的程序遇到问题?  [待解决] 回复[ 34次 ]   点击[ 2462次 ]  
lovecpu
[帖 主] [ 发表时间:2007-06-26 20:49 ] 
荣誉值:5
信誉值:3
注册日期:2007-06-26 20:40
分析下面的程序,在运行前思考:这个程序可以正确返回吗?  
  运行后再思考:为什么是这种结果?  
   
   
  assume   cs:codesg  
  codesg   segment  
   
  mov   ax,4c00h  
  int   21h  
   
  start: mov   ax,0  
  s: nop  
  nop  
  mov   di,offset   s  
  mov   si,offset   s2  
  mov   ax,cs:[si]  
  mov   cs:[di],ax  
   
  s0: jmp   short   s  
   
  s1: mov   ax,0  
  int   21h  
  mov   ax,0  
   
  s2: jmp   short   s1  
  nop  
   
  codesg   ends  
  end   start
thisguy
[第7楼] [ 回复时间:2008-05-28 23:40 ] 
荣誉值:0
信誉值:2
注册日期:2008-04-02 16:04
mov di,offset s

mov si,offset s2

mov ax,cs:[si]

mov cs:[di],ax

四条指令的作用是将标号s2处的一条指令复制到标号s处。这时我们应该关心所复制的语句"jmp short s1"对程序的影响:我们知道在段内直接短转移指令所对应的机器码中,并不包含转移的目的地址,而包含的是转移的位移量(如对此概念还不太熟悉,请查看书中第167页的内容)。也就是说,在源程序的编译过程中,编译器遇到‘段内直接短转移’[形如:jmp short 标号]时就会自动算出其要跳转的位移量,以便程序在执行‘段内直接短转移’的指令时就根据位移量进行(向前或向后)跳转。通过调试中的U命令我们可以看到指令's2:jmp short s1'所对应的机器码是EBF6,F6h(-10d的补码)就是跳转的位移量[此位移量也可由指令's2:jmp short s1'处的偏移地址18h减去指令's2:jmp short s1'后一个字节的偏移地址22h得出]。这时我们就知道了其实复制到标号s处的指令所对应的机器码就是EBF6(刚好取代两个nop所对应的机器码),它的作用就是将当前IP向前移动10个字节。当程序执行标号s0处的指令后,程序便跳到标号s处接着执行标号s处的指令。s处的指令的作用是向前跳10字节,于是便跳到了代码中的第一条指令,继续执行后便实现了程序的正常返回。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved