从0学习汇编语言(9)转移指令的原理JMP

570 阅读2分钟

《从0学习汇编语言目录》

第九章 转移指令的原理

可以修改IP 或同事修改CS和IP的指令统称为转移指令

9.1 操作符offset

操作符offset用于标记偏移的地址:

assume cs:codesg
codesg segment
    start :
        mov ax offset start ;相当于mov ax, 0
    s: 
        mov ax,offset s  ;相当于 mov ax,3
codesg ends
end start

9.2 jmp 指令

jmp 为无条件转移指令,可以修改cs和ip,jmp指令要给出两种信息

  1. 转移的目的地址
  2. 转移的距离(段间转移、段内转移,段内近距离转移)

9.3 依据位移进行转移的jmp指令

jmp short 标号(转到标号处执行命令) 这种格式的jmp叫段内转移, 对IP的修改范围为-128~127, 8位标号

assume cs:codesg
codesg :segment
    start:
         mov ax,0
         jmp short s; 直接调转到s:处执行,执行inc ax后结束
         add ax,1
         s:
         inc ax
codesg ends
end start

计算方法如图说是。 EB指令为当前IP + 后面的值, 例如EB03 为IP = IP + 03 这个03 是程序在编译的时候确定的。

类似的指令还有 jmp near ptr 标号 ,他的范围比较大 在-32768~32767范围内。16位标号

9.4 转移的目的地址在指令中的jmp指令

jmp far ptr 符号 是实现段间转移

可以看出 jmp指令对应的机器码为EA0B01BD0B 直接jmp 到0BBD:010B上。 可以修改IP以及CS

9.5 转移地址在寄存器中的jmp指令

jmp ax ;把ip修改为ax

9.6 转移地址在内存中的jmp指令

  1. jmp word ptr 内存单元地址(段内转移)
 mov ax,0213h
 mov ds:[0], ax
 jmp word ptr ds:[0]

执行后 ip = 0123h 2. jmp dword ptr 内存单元地址(段间转移)

mov ax, 0123h
mov ds:[0], ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]

执行后 CS:IP指向 0000:0123

从ds:[0]取4个字节,ds:[0]=23 ds:[1]=01 ds:[2]=00 ds:[3]=00

9.7 jcxz指令

jcxz 全称为 jmp cx equal zero jcxz 标号:顾名思义就是如果cx==0, 则跳转 jmp short 标号

9.8 loop指令

loop指令为循环指令,所有的循环为短转移,ip修改范围在-128~127之间 loop 标号的作用如下

  1. (cx) = (cx) - 1
  2. 如果 cx != 0, ip = ip + 标号

《第十章 CALL和RET指令》