. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
主题 : :  实验8的精髓所在,好题!!!  [待解决] 回复[ 23次 ]   点击[ 1602次 ]  
yugong
[帖 主] [ 发表时间:2008-10-13 18:00 ] 
荣誉值:2
信誉值:8
注册日期:2008-09-15 09:10
实验8程序
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 


个人愚见:


本程序的亮点就在于复制s2处的指令后,s处内存单元原先的两个nop 变为EBF6(即jmp short s1对应的机器码),关键就是EBF6的理解,容易产生错误的是:误解为S处的指令也为jmp short s1!!

正确的理解应是:F6是位移量!!!是补码形式,表示-10

当程序读取S处的指令后IP的值改为10,再执行指令,IP被修改成0,指向mov ax,4c00H ,这样程序就能正确返回了!
gulunhua
[第4楼] [ 回复时间:2008-11-13 15:53 ] 
荣誉值:0
信誉值:0
注册日期:2007-11-06 14:36
呵呵,这个jmp 标号在编译后的机器码中,标号是位移,也就是说有正有负的,负的话就用补码表示,比如-10(十进制)的补码就是F6h,这个例子里的jmp short s1,其实就是jmp 0F6H,不规范的表示就是jmp -10,意思就是向上跳转到,向上移动10个字节的地方:
0000
0001
0002
0003
0004
0005
0006
0007
0008-0009-000A jmp -10
000A jmp将跳转到从这儿开始向上10个字节,0009,0008,0007……0001,0000,也就是跳转到0000处
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved