• 汇编语言7跳转指令


    用法1:: jmp short 标号(转到标号处执行指令)

    这种格式的 jmp 指令实现的是段内短转移,它对IP的修改范围为 -128~127,也就是说,它向前转移时可以最多越过128个字节,向后转移可以最多越过127个字节。

    段内转移,只修改IP,比如jmp ax
    段间转移,同时修改CS和IP,比如jmp 1000:200
    短转移,IP取值范围-128-127, 8位
    近转移,IP取值范围-32768-32767,16位

    offset是伪指令,它的功能是取标号的偏移地址

    代码:

    assume cs:code
    code segment
    db  10 dup(0)
    s: mov ax,0ffffh
    start: jmp short s
    jmp short s1
    nop
    s1: nop
    mov ax,4c00h
    int 21h
    code ends
    end start



     Debug中:

    1467:0000 0000          ADD     [BX+SI],AL
    1467:0002 0000          ADD     [BX+SI],AL
    1467:0004 0000          ADD     [BX+SI],AL
    1467:0006 0000          ADD     [BX+SI],AL
    1467:0008 0000          ADD     [BX+SI],AL
    1467:000A B8FFFF        MOV     AX,FFFF
    1467:000D EBFB          JMP     000A
    1467:000F EB01          JMP     0012
    1467:0011 90            NOP
    1467:0012 90            NOP
    1467:0013 B8004C        MOV     AX,4C00
    1467:0016 CD21          INT     21

    分析: EB对应jmp short, FB对应-5, -5表示向上跳5个字节, 取jmp指令结束的地址000F,000F-5=000A

    分析: EB对应jmp short, 01对应1, 1表示向下跳1个字节, 取jmp指令结束的地址0011, 0011+1=0012

    018EAEB3     E9 7CF4FFFF jmp 018EA334      // 机器码 E9对应长跳转jmp,   7CF4FFFF  表示相对偏移 AEB3- A334 =B7F,向上跳转B7F           

    018EAEB3    EB FE jmp short 018EAEB3        // 机器码 EB 对应段跳转jmp short ,  FE表示相对偏移0   

    018EAEB3   EB 00 jmp short 018EAEB5       // 机器码 EB 对应段跳转jmp short , 00表示相对偏移2,   向下跳转2 

    注意:机器码中不包含转移的目的地址,这意味着CPU并不知道转移目的地址, 只需知道相对偏移,    

            jmp  跳转地址,  这个的跳转地址不是定死的,只是相对偏移地址, 对着机器码看 一目了然

    1.分析下面程序 这个程序能否正确运行到
    mov ax,4c00h
    int 21h
    吗????

    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


    在Debug中分析:
    1467:0000 B8004C        MOV     AX,4C00
    1467:0003 CD21          INT     21
    1467:0005 B80000        MOV     AX,0000
    1467:0008 90            NOP
    1467:0009 90            NOP
    1467:000A BF0800        MOV     DI,0008
    1467:000D BE2000        MOV     SI,0020
    1467:0010 2E            CS:
    1467:0011 8B04          MOV     AX,[SI]
    1467:0013 2E            CS:
    1467:0014 8905          MOV     [DI],AX  //这里把1467:0020处指令 EBF6复制到1467:0008
    1467:0016 EBF0          JMP     0008  //跳转到 1467:0008 执行指令 EBF6, F6等于-10,10的16进制A,000A-A=0000
    1467:0018 B80000        MOV     AX,0000
    1467:001B CD21          INT     21
    1467:001D B80000        MOV     AX,0000
    1467:0020 EBF6          JMP     0018
    1467:0022 90            NOP

    分析:1.这里把1467:0020处指令 EBF6复制到1467:0008
          2.跳转到 1467:0008 执行指令 EBF6, F6等于-10,10的16进制A,000A-A=0000, 跳转到0000,执行MOV   AX,4C00, INT     21
       程序正常退出

    灵活应用:
          如何加一条指令,让程序跳过MOV   AX,4C00,执行 INT     21了
        在mov ax,cs:[si]
      ;mov ah,-7      加上这条指令就ok了
         mov cs:[di],ax

  • 相关阅读:
    穷举
    菱形
    6.824 Lab 3: Fault-tolerant Key/Value Service 3A
    6.824 Lab 2: Raft 2C
    6.824 Lab 2: Raft 2B
    一文学会Rust?
    字符串相似度匹配
    解决gson解析long自动转为科学计数的问题
    commonJs requirejs amd 之间的关系
    关于package.json的理解
  • 原文地址:https://www.cnblogs.com/mayingkun/p/4549856.html
Copyright © 2020-2023  润新知