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 Call和ret指令

2014年09月24日

###call和ret指令都是转移指令,他们都修改IP,或同时修改CS和IP。他们经常被共同用来实现子程序的设计

###ret和retf ret 使用栈中的数据,修改IP的内容,实现近转移

retf使用栈中的数据,修改CS和IP的内容,从而实现远转移

CPU执行ret指令时,相当于:

pop IP

CPU执行retf指令时,相当于:

pop IP

pop CS

###call指令 CPU执行call时,进行2步操作:

  1. 将当前的IP或CS和IP压入栈中
  2. 转移

call指令不能实现短转移

###依据位移进行转移的call指令 call 标号(将当前的IP压栈后,转到标号处执行指令)

机器码没有转移的目的地址,而是相对于当前IP的转移位移

相当于:

push IP
jmp near ptr 标号

###转移的目的地址在指令中的call指令 call far ptr 标号(实现的是段间转移,机器码中有目标地址)

相当于:

push CS
push IP
jmp far ptr 标号

###转移地址在寄存器中的call指令 指令格式:call 16位reg

相当于:

push IP
jmp 16位reg

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

  1. call word ptr 内存单元地址

    相当于:

     push IP
     jmp word ptr 内存单元地址
    
  2. call dword ptr 内存单元地址

    相当于:

     push CS
     push IP
     jmp dword ptr 内存单元地址
    

###call和ret的配合使用 写一个具有一定功能的程序段,称为子程序,在需要的时候,用call指令转去执行,call转去执行之前,先将call指令后面的指令的地址存储在栈中,在子程序使用ret指令返回,用栈中数据设置IP的值,从而转到call后面的代码处继续执行

###mul指令 mul是乘法指令,注意两点:

  1. 两个相乘的数:要么都是8位,要么都是16位。如果是8位,一个默认放在AL中,另一个放在8位reg或内存字节单元中;如果是16位,一个默认在AX中,另一个放在16位reg或内存单元中

  2. 结果:如果是8位乘法,结果默认放在AX中;如果是16位乘法,结果高位默认在DX中存放,低位在AX中放

格式如下:

mul reg

mul 内存单元

例:

mul byte ptr ds:[0]

含义:(ax)=(al) * ( (ds)*16+0)

计算100*10:

mov al,100
mov bl,10
mul bl

###模块化程序设计 批量参数的传递:

批量数据放到内存中,然后将他们所在内存空间的首地址放在寄存器中,传递给需要的子程序。批量数据的返回结果,也可以用同样的方法

###寄存器冲突的问题 子程序中使用的寄存器很可能和主程序产生冲突

子程序执行前将程序中用到的寄存器中的内容都保存起来,可以用栈来保存寄存器中的内容,子程序返回前再恢复

要注意寄存器入栈和出栈的顺序

###除法溢出 结果的商过大,超出了寄存器所能存储的范围。

mov ax,1000H
mov dx,1
mov bx,1
div bx

进行的是16位除法,结果的商为11000H 而11000H在AX中存放不下