转移指令的原理

166 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 (破解 脱壳 加壳)

目录

image.png 8086CPU转移指令分类:

  1. 无条件转移指令 (jmp)
  2. 条件转移指令(先判断标志寄存器,条件是否符合跳转)
  3. 循环指令(loop,判断cx是否为0)
  4. 过程(调用函数,函数称之为过程?)
  5. 中断(汇编语言中的重要部分)

 

9.1操作符offset

汇编语言中由编译器处理的符号,功能是取得标号的偏移地址

image.png 第一条指令翻成机器码占三字节

 

问题9.1

image.png 分析问题的四个方面

image.png  

mov ax,cs:[si]
mov cs:[di],ax

 

 

9.2 jmp指令

jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP

ja、jz比较,校验跳转

 

jmp指令要给出两种信息:

转移的目的地址

转移的距离(段间转移、段内短转移、段内近转移)

 

 

jmp short 标号(转到标号处执行指令)

image.png

 

 

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

eg

image.png

image.png  

idata(常数、常量)都会在对应的机器指令中出现

 

源码,机器码,汇编指令的对比

image.png s:inc ax偏移地址08

所以jmp short s对应的汇编指令是jmp 08

image.png  

Q1:jmp 08或jmp short s所对应的机器码为EB03,机器码不包含转移的目的地址(08)

jmp short s
add ax,1
s:inc ax

此时第一条指令翻译成机器码为EB 03

Q2:CPU在执行EB 03的时候,并不知道转移目的地址,所以CPU是根据什么进行转移的呢?

 

A:

做了一个小实验,稍微修改了一下之前的代码

jmp short s
add ax,1
add ax,ax
s:inc ax

此时jmp short s的机器码变成了EB 05

初步推测此时03+2=05

add ax,1机器码三字节

add ax,ax机器码两字节

 

 

这说明在机器指令中并不包含转移的目的地址

CPU不需要这个目的地址就可以实现对IP的修改

 

image.png 08-03=05

image.png  

 

image.png  

跳转指令的开始

 

image.png

这边读取完jmp s指令后,ip加二

同时指令进入指令缓冲寄存器

image.png

EB为jmp F6偏移地址移至ip

image.png 之后IP变为了0000???

WHY?

F6 --> -10

补码

 

F6

1111 0110 - 1=11110101取反=10001010

1010 ==> 10

 

实际上,指令“jmp short 标号”的功能为

IP=IP+8位位移。

8位位移=标号处的地址-jmp指令后的第一个字节的地址

short表明此处的位移为8位位移

8位位移的范围为-128-127

8位位移由编译程序在编译时算出

image.png

 

 

jmp near ptr 标号 它实现段内近转移

image.png

image.png