java打印对象内存地址 分布式事务 事务消息 分布式事务 几种解决方案 分布式事务-Seata 分布式事务-Seata 分布式事务-LCN-TCC 分布式事务-LCN 分布式事务-消息队列-定时任务-本地事件表 Zuul网关实战02 Zuul网关实战01 灰度发布落地实战2 灰度发布落地实战1 Gsnova on Heroku build Systemd Debian system initialization manage multi id_rsa ubuntu 64bits cannot run 32bits app REHL power auditing Debug Assembly for ARMv8 on QEMU ARM体系结构--寄存器 Run Debian iso on QEMU ARMv8 QEMU ARM64 guide cross compiler install buildroot install QEMU install python入门--数据结构 python入门--内置数据类型 python入门--类 异常 python入门--条件表达式 方法 python入门--数字 字符串 数组 RTC驱动分析 块设备驱动 TCP UDP socket 触摸屏驱动 USB驱动 LED按键中断 LCD 驱动 驱动信号 根文件系统 实验 内核实验 字符设备驱动程序 绪论 uboot 实验 LCD 实验 系统时钟和UART 中断控制器 Nand Flash控制器 MMU 实验 储存管理器实验 GPIO实验 点亮LED 编译加载驱动 制作烧写内核 dnw替代方法 MINI2440 TQ2440安装配套Linux 使用NFS 制作烧写跟文件系统 grub引导Windows 烧写裸版程序-linux Ubuntu 网络没有 eth0 Linux自动挂载 烧写裸板程序 电路基础 Mac词典 Vim插件 Assembly 综合研究 Assembly 指令总结 Assembly 直接定址表 Assembly 使用BIOS进行键盘输入和磁盘读写 Assembly 外中断 Assembly 端口 Assembly int指令 Assembly 内中断 Assembly 标志寄存器 Assembly 转移指令的原理 Assembly Call和ret指令 Assembly 数据处理两个基本问题 Assembly 灵活定位内存地址 Assembly 包含多个段的程序 Assembly [bx] loop Assembly 第一个程序 Assembly 寄存器 (内存访问) Assembly 寄存器 AWS VPN with EC2 hidden file in picture(linux) Assembly 基础 idea shortcuts 常用快捷键 idea plugin folder install ruby and jekyll

Assembly 转移指令的原理

2014年09月24日

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

8086CPU的转移行为有以下几类:

  • 只修改IP时,称为段内转移,比如:jmp ax
  • 同时修改CS和IP时,称为段间转移,比如:jmp 1000:0

由于转移指令对IP修改的范围不同,段内转移又分为:短转移和近转移

  • 短转移IP的修改范围为-128~127
  • 近转移IP的修改范围为-32768~32767

8086CPU的转移指令分为以下几类:

  • 无条件转移指令(如:jmp)
  • 条件转移指令(如:je)
  • 循环指令 (如:loop)
  • 过程
  • 中断 (如:int)

###操作符offset 用来取得标号的偏移地址

start:mov ax,offset start	;相当于mov ax,0
	s:mov ax,offset s	;相当于mov ax,3

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

jmp指令要给出两种信息:

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

###根据位移进行转移的jmp指令 jmp short 标号(转到标号处执行指令)

这种格式的jmp指令实现的是 段内短转移

向前转移时可以最多越过128个字节,向后转移可以最多越过127个字节

CPU在执行jmp指令的时候并不需要转移的目的地址,在编译时,算出CPU要转移的位移

jmp short 标号的功能为:(IP)=(IP)+8位位移

jmp near ptr 标号的功能为:(IP)=(IP)+16位位移

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

jmp far ptr 标号

实现的是段间转移,又称为远转移

机器码包含转移的目的地址

###转移地址在寄存器中的jmp指令(段内近转移) 格式:jmp 16位reg

功能:(IP)=(16位reg)

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

  1. jmp word ptr 内存单元地址(段内转移)

     mov ax,0123h
     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)=0,(IP)=0123H

    CS=内存单元地址+2

    IP=内存单元地址

###jcxz指令 为有条件转移指令,所有有条件的转移指令都是短转移(-128~127)

格式:jcxz 标号 (如果cx等于0,则转移到标号执行)

可以理解为:if( (cx) == 0 ) jmp short 标号;

###loop指令 loop指令是循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移

格式:loop 标号

操作:(cx)=(cx)-1

           如果(cx)不等于0,(IP)=(IP)+8位位移

###根据位移转移的意义 jmp short 标号

jmp near ptr 标号

jcxz 标号

loop 标号

机器码都是保存的位移,装在内存中的不同位置都可正确执行(好比相对路径)

###编译器对转移位移的超界的检测 如果在源程序中出现了转移范围超界的问题,在编译的时候,编译器将报错

###分析一个奇怪的程序 源代码戳这里 –> e8.asm

运行前思考,这个程序可以正确返回吗?

###小结 | 转移指令 | 类型 | 范围 | 机器码 |修改CS或IP| |——————————————————–| |jmp short ptr|段内短转移 |-128~127 |转移的位移| IP | |jmp near ptr |段内近转移 |-32768~32767|转移的位移| IP | |jmp far ptr |段间转移(远转移)| unlimited |目的地址 |CS和IP|

####所有有条件的转移指令都是短转移(-128~127)