[037][汇编语言]jmp指令

jmp 指令

 jmp short 标号
 jmp near ptr 标号
 jmp far ptr 标号
 jmp 16位reg
 jmp word ptr  内存单元地址
 jmp dword ptr 内存单元地址

jmp short 标号

  • 段内短转移
  • 对IP的修改范围是-128~127
  • 向前 移动时可以最多越过128个字节,向后 移动可以最多越过127个字节
  • 依据位移进行转移,转移指令结束后,CS:IP指向标号处的指令
  • (IP)=(IP)+8位位移
8位位移 = 要跳转去的标号地址 - 减去jmp指令后第一条指令的起始地址

8位位移的范围是:-128~127
8位位移使用 补码 形式表示
  • 依据位移进行转移,跳转到标号s处开始执行指令
assume cs:codesg
codesg segment
    start:  mov ax,0
            mov bx,0
            jmp short s
            add ax,1
        s:  inc ax
    codesg ends
    end start  

jmp near ptr 标号

  • 段内近转移
  • (IP)=(IP)+16位位移
16位位移 = 要跳转去的标号地址 - 减去jmp指令后第一条指令的起始地址

16位位移的范围是:-32768~32767
16位位移使用 补码 形式表示

jmp far ptr 标号

  • 段间转移,远转移
  • 用标号所在段地址和偏移地址修改CS和IP
(CS) = 标号所在段的段地址
(IP) = 标号在段中的偏移地址
  • 依据段地址和偏移地址进行转移
assume cs:codesg
codesg segment
    start:  mov ax,0
            mov bx,0
            jmp far ptr s
            db 256 dup (0)
        s:  add ax,1
            inc ax
    codesg ends
    end start
  • 读出目的段地址和目的偏移地址


    jmp far ptr 标号
0B016A07

0B
01
-----
010B 目的偏移地址

6A
07
----
076A 目的段地址

CS:IP 指向 076A:010B

jmp 16位reg

  • jmp 某一合法寄存器 : 用寄存器中的值修改IP寄存器中的值
jmp ax 
指令执行前 ax=1000H CS=2000H IP=0003H
指令执行后 ax=1000H CS=2000H IP=1000H

IP寄存器中的值被修改成和ax一样的了

jmp word ptr 内存单元地址

  • 段内转移,只修改偏移地址
mov ax,0123H
mov [bx],ax
jmp word ptr [bx]

执行后 (IP)=0123H

jmp dword ptr 内存单元地址

  • 段间转移
  • 高地址放 目的段地址,低地址 放 目的偏移地址
mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]

执行后 (CS)=0, (IP)=0123H,
CS:IP 指向 0000:0123H

附注3:MASM.EXE对JMP的相关处理

  • 1、向前转移 disp属于[-128,127]
assume cs:code
code segment
s:  jmp s
    jmp short s
    jmp near ptr s
    jmp far ptr s
    
code ends
end s
1、向前转移 disp属于[-128,127].png
  • 2、向前转移 disp属于[-32768,32767]
assume cs:code
code segment
s:  db 100 dup (0b8h,0,0)
    ;jmp short s
    jmp s
    jmp near ptr s
    jmp far ptr s
    
    code ends
    end s
2、向前转移 disp属于[-32768,32767].png
  • 3、向后转移 disp属于[-128,127] EB+disp+NOP 一个NOP存放8位disp
assume cs:code
code segment
begin:  jmp short s
        jmp s
        jmp near ptr s
        jmp far ptr s 
    s:  mov ax,0
    code ends
    end begin
3、向后转移 disp属于[-128,127] EB+disp+NOP 一个NOP存放8位disp.png
  • 4、向后转移 disp属于[-32767,32768]
assume cs:code
code segment
begin:  ;jmp short s
        jmp s
        jmp near ptr s
        jmp far ptr s
        db 100 dup (0b8h,0,0)
    s:  mov ax,2
    code ends
    end begin
4、向后转移 disp属于[-32767,32768].png
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 8086汇编 本笔记是笔者观看小甲鱼老师(鱼C论坛)《零基础入门学习汇编语言》系列视频的笔记,在此感谢他和像他一样...
    Gibbs基阅读 38,222评论 8赞 114
  • 王爽汇编全书知识点大纲 第一章 基础知识 机器语言 汇编语言的产生 汇编语言的组成 存储器 cpu对存储器的读写 ...
    2c3ba901516f阅读 2,905评论 0赞 1
  • 计算机通过执行指令序列来使机器得以工作,所以对于每一系列的计算机都有指定的一组指令集供计算机使用,这组指令...
    未来科技工作室阅读 8,442评论 1赞 10
  • eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用...
    tadelemon阅读 514评论 0赞 0
  • 一直不太喜欢透明的活在人群中,喜欢特立独行和与众不同的存在,可是‘’独特"的气质需要实力或者强大的 内心。不禁想起...
    闲若无阅读 260评论 0赞 0

友情链接更多精彩内容