本文已参与「新人创作礼」活动,一起开启掘金创作之路。 (破解 脱壳 加壳)
目录
8086CPU转移指令分类:
- 无条件转移指令 (jmp)
- 条件转移指令(先判断标志寄存器,条件是否符合跳转)
- 循环指令(loop,判断cx是否为0)
- 过程(调用函数,函数称之为过程?)
- 中断(汇编语言中的重要部分)
9.1操作符offset
汇编语言中由编译器处理的符号,功能是取得标号的偏移地址
第一条指令翻成机器码占三字节
问题9.1
分析问题的四个方面
mov ax,cs:[si]
mov cs:[di],ax
9.2 jmp指令
jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP
ja、jz比较,校验跳转
jmp指令要给出两种信息:
转移的目的地址
转移的距离(段间转移、段内短转移、段内近转移)
jmp short 标号(转到标号处执行指令)
9.3依据位移进行转移的jmp指令
eg
idata(常数、常量)都会在对应的机器指令中出现
源码,机器码,汇编指令的对比
s:inc ax偏移地址08
所以jmp short s对应的汇编指令是jmp 08
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的修改
08-03=05
跳转指令的开始
这边读取完jmp s指令后,ip加二
同时指令进入指令缓冲寄存器
EB为jmp F6偏移地址移至ip
之后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位位移由编译程序在编译时算出
jmp near ptr 标号 它实现段内近转移