. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验8 一个奇怪的程序  [待解决] 回复[ 6次 ]   点击[ 573次 ]  
84404037
[帖 主]   [ 发表时间:2010-10-23 10:01 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-09-25 21:54
assume cs:code
code segment
   
       
       mov ax,4c00H
       int 21h
start: mov ax,0
    s: nop                     IP=0008    jmp short s1把这个复制到0008处执行下一步,IP为0010但是jmp short s1的机器码为E8F6  F6取反加上为-10    IP为0010+ F6的值=0000
       nop

       mov di,offset s        s 的偏移给di是0008
       mov si,offset s2       s2的偏移给si是0020
       mov ax,cs:[si]
       mov cs:[di],ax        目的是将s2的数据移到s处
    s0:jmp short s           跳转到s处。但是跳转。是CPU来执行的,CPU先将IP移动下一步也就是mov,ax,0处然后缓冲器里的机器码,也就是JMP short s的机器码E8F0 因向上跳转,所以取反加1为-10
而mov ax,0IP是18所以jmp跳到0008处偏移
    s1:mov ax,0
       int 21h
       mov ax,0
    s2:jmp short s1
       nop
code ends
end start
这个程序告诉我们。跳转不是看的是数值,而是看的JMP机器码,以及下一步所执行的IP,两者相加
得来的。不知道我说的对不对,请大家指点。
84404037
[第1楼]   [ 回复时间:2010-10-23 10:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-09-25 21:54
不是向上跳转就是取反取负,而是编译程序根据两点间的距离算出位移量。就是程序下一步IP的值,加上JMP所对应的机器码的值
84404037
[第2楼]   [ 回复时间:2010-10-23 10:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-09-25 21:54
不知道为什么,看别人的注解是越看越不明白,自己做了,才明白了点。
idpanjian
[第3楼]   [ 回复时间:2010-12-13 13:48 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-12-03 12:08
F0到反为什么==-10,是10H吧。
idpanjian
[第4楼]   [ 回复时间:2010-12-13 15:12 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-12-03 12:08
8位位移=标号处地址-JMP指令后第一字节地址
s2: jmp short s1这条机器指令为什么是EBF6是向上移10个???
不是向上移4个字节吗?
0C5E:0005 B80000        MOV     AX,0000
0C5E:0008 90            NOP
0C5E:0009 90            NOP
0C5E:000A BF0800        MOV     DI,0008
0C5E:000D BE2000        MOV     SI,0020
0C5E:0010 2E            CS:
0C5E:0011 8B04          MOV     AX,[SI]
0C5E:0013 2E            CS:
0C5E:0014 8905          MOV     [DI],AX
0C5E:0016 EBF0          JMP     0008
0C5E:0018 B80000        MOV     AX,0000
0C5E:001B CD21          INT     21
0C5E:001D B80000        MOV     AX,0000
0C5E:0020 EBF6          JMP     0018
0C5E:0022 90            NOP
0C5E:0023 83C406        ADD     SP,+06
hywang-xd
[第5楼]   [ 回复时间:2011-01-02 14:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-01-02 12:34
//一个奇怪程序的代码
assume cs:code

code segment
        mov ax,4c00h
        int 21h
 start:
        mov ax,0
        s:nop ;IP=0008
          nop ; IP=0009
          mov di,offset s ;IP=000A
          mov si,offset s2
          mov ax,cs:[si]
          mov cs:[di],ax
          
          s0:jmp short s ; 8位位移=标号处地址-JMP指令后第一字节地址 (IP)=(IP)+8位位移
                             ;8位位移=0008-0018=-10=F6
                         ; NOP 为空指令 所以执行时跳过 则IP=000A
                         ;IP=000A+F6=0000
          
          s1:mov ax,0 ;IP=0018
             int 21h
             mov ax,0
             
          s2:jmp short s1
             nop
code ends
end start
刚开始学汇编,上面的观点纯属个人理解,供大家参考
wandy13579
[第6楼]   [ 回复时间:2011-01-19 15:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-07 10:41
4楼你的想法是对的,但是在十六进制中 0022-0018不等于4,而是等于10,所以最后IP等于0
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved