精华内容
下载资源
问答
  • 局部变量压栈指令

    2021-08-07 13:52:19
    一 局部变量压栈指令 iload 从局部变量中装载int类型值 lload 从局部变量中装载long类型值 fload 从局部变量中装载float类型值 dload 从局部变量中装载double类型值 aload 从局部变量中装载引用类型值...

    一  局部变量压栈指令

    iload 从局部变量中装载int类型值

    lload 从局部变量中装载long类型值

    fload 从局部变量中装载float类型值

    dload 从局部变量中装载double类型值

    aload 从局部变量中装载引用类型值(refernce)

    iload_0 从局部变量0中装载int类型值

    iload_1 从局部变量1中装载int类型值

    iload_2 从局部变量2中装载int类型值

    iload_3 从局部变量3中装载int类型值

    lload_0 从局部变量0中装载long类型值

    lload_1 从局部变量1中装载long类型值

    lload_2 从局部变量2中装载long类型值

    lload_3 从局部变量3中装载long类型值

    fload_0 从局部变量0中装载float类型值

    fload_1 从局部变量1中装载float类型值

    fload_2 从局部变量2中装载float类型值

    fload_3 从局部变量3中装载float类型值

    dload_0 从局部变量0中装载double类型值

    dload_1 从局部变量1中装载double类型值

    dload_2 从局部变量2中装载double类型值

    dload_3 从局部变量3中装载double类型值

    aload_0 从局部变量0中装载引用类型值

    aload_1 从局部变量1中装载引用类型值

    aload_2 从局部变量2中装载引用类型值

    aload_3 从局部变量3中装载引用类型值

    iaload 从数组中装载int类型值

    laload 从数组中装载long类型值

    faload 从数组中装载float类型值

    daload 从数组中装载double类型值

    aaload 从数组中装载引用类型值

    baload 从数组中装载byte类型或boolean类型值

    caload 从数组中装载char类型值

    saload 从数组中装载short类型值

    二 说明

    局部变量压栈指令将给定的局部变量表中的数据压入操作数栈。

    这类指令分两类

    xload_<n>: x 为 i、l、f、d、a,n 为 0 到 3

    xload:x 为 i、l、f、d、a

    这里的 x 的取值表示数据类型。

    指令 xload_n 表示将第 n 个局部变量压入操作数栈,比如 iload_1、fload_0、aload_0 等指令。其中 aload_n 表示将一个对象引用压栈。

    指令 xload 通过指定参数的形式,把局部变量压入操作数栈,当使用这个命令时,表示局部变量的数量可能超过 4,比如指令 iload、fload 等。

    三 实战

    1 代码

    // 1.局部变量压栈指令
    public void load(int num, Object obj, long count, boolean flag, short[] arr) {
        System.out.println(num);
        System.out.println(obj);
        System.out.println(count);
        System.out.println(flag);
        System.out.println(arr);
    }

    2 图解

    四 小结

    xload_n

    xload_0

    xload_1

    xload_2

    xload_3

    iload_n

    iload_0

    iload_1

    iload_2

    iload_3

    lload_n

    lload_0

    lload_1

    lload_2

    lload_3

    fload_n

    fload_0

    fload_1

    fload_2

    fload_3

    dload_n

    dload_0

    dload_1

    dload_2

    dload_3

    aload_n

    aload_0

    aload_1

    aload_2

    aload_3

    展开全文
  • 具体的压栈指令,例子

    千次阅读 2015-11-23 21:42:07
    设(AX) = 1020H ,执行PUSH AX 前后对比:

    设(AX) = 1020H ,执行PUSH AX 前后对比:
    这里写图片描述

    展开全文
  • 常量压栈指令 局部变量表压栈指令 操作数栈出栈指令 通用指令 上一篇日志里用到的指令如bipush,iload等都是JVM常用的指令,它们有各自的分类,如bipush是常量压入操作数栈,iload是将数组指令索引压入操作数栈...

    目录

    常量压栈指令

    局部变量表压栈指令

    操作数栈出栈指令

    通用指令


          上一篇日志里用到的指令如bipush,iload等都是JVM常用的指令,它们有各自的分类,如bipush是常量压入操作数栈,iload是将数组指令索引压入操作数栈,根据操作的数据类型不同还可以分为,i开头的是对integer类型操作指令,f开头是对float类型操作指令。每一条字节码指令由一个字节的助记符加上后面的参数组成,例如sipush  100指令一共占用3个字节,sipush占一字节加上后面的参数占两个字节。这些指令有专门负责类型转换的,运算的指令和存储指令,这篇日志总结下从操作范围,也就是从局部变量表到操作数栈之间数据传递,来分类一些JVM常用的指令。

     

    常量压栈指令

          常量压栈指令作用是将常数压入操作数栈中,大致有push,ldc和const三类,push前面见过了,在一个两数相加的代码中,首先用到bipush指令将两个常量压入操作数栈里,根据数据大小可以使用bipush或sipush,前者可处理的数据范围在-128~127,后者更大在-32768~32767之间。第二种const类指令负责将一些特定的常量压栈,例如iconst_m1将-1压入操作数栈,aconst_null将null压栈,如果想将浮点类型数据压栈,使用fconst_x,x=1,2,3表示分别将1,2,3压栈,同理,lconst_x和dconst_x分别表示将长整型数据和双精度浮点数压栈。第三种ldc类型,它可以将int,String或者float类型数据压入操作数栈,支持的参数长度为8位,如果超出这个长度的数据可以使用ldc_w指令,它的数据支持长度为16位。

     

    局部变量表压栈指令

           这类指令顾名思义就是将局部变量表中的数据压入操作数栈里,还是拿回两数相加的程序看,把两个数进行加法运算前,需要先将它们从局部变量表里拿出压入到操作数栈中,用到的是iload_x指令,x表示的是局部变量表中的第几号位置,和const指令类似,iload前面的i标识的是处理整型数据,所以fload,dload等分别处理的就是单精度浮点数和双精度浮点数。如果是将数组元素进行入栈,使用的是xaload指令,iaload,caload和saload分别表示将数据压入int,char和short数组,来看一个例子:

          代码在Instance()方法中传入两个数组参数,一个是int数组一个是char数组,然后输出里面下标为1的元素。从.class文件里看,首先aload_1指令将数组引用压入栈,然后iconst_1将索引1压入,最后iaload指令将数组arr1[1]压入操作数栈,arr2[1]同理,aload_2指令将char数组入栈,然后iconst_1将索引1入栈,代码中两个数组都是输出下标为1的元素,最后caload指令将char类型数组压入操作数栈中。

     

    操作数栈出栈指令

           操作数栈出栈指令,作用是将操作数栈顶元素弹出,放入到局部变量表中中,完成对局部变量的赋值操作,有xstore_n和xastore两种,后者是对数组进行操作的指令,xstore_n指令中的x代表数据类型,可以是i、l、f、d、s等,n自然就是代表第几号数字了,来看一个例子:

          对两个变量进行赋值,一个是int型局部变量,一个是数组,从字节码指令中可以看到,bipush指令将参数95压栈后,istore_3指令将其弹出,放入到局部变量表第3号位置里。下面对数组的赋值有点不同,iastore指令用来对一个int型数组操作,对一个数组里面元素进行赋值,需要数组引用,索引和赋值参数三部分,首先aload_1将数组引用(arr1[ ])压栈,然后iconst_1将数组索引1压栈(arr1[ 1 ]),最后bipush27压栈,iastore将参数27赋值给局部变量表中的数组arr1[ 1 ]位置。

     

    通用指令

          最后总结的一种常用指令是通用类型的指令,它与前面指令区别的地方在于,和操作的数据类型无关,前面的指令中,不同类型的指令入栈有lconst、fconst、bipush、sipush等,除了明确数据类型外还要指定放入的位置,通用类指令不需要指明数据类型,例如dup复制指令,作用是将栈顶元素复制一次并压入栈顶,同样是数据操作指令,但无需关注当前栈顶元素是什么类型,还有pop指令是将栈顶元素弹出并直接丢弃,来看个例子:

          代码简单生成一个Object对象,并调用ob.toString()方法,从字节码指令看,首先new指令为我们实例化ob对象,此时对象被放在栈顶处,然后dup指令将该对象的引用复制了一份,之后栈中就有两份相同的ob对象引用,为什么需要先复制一份,往下看,invokespecial指令是调用对象的构造方法,此时需要从栈顶中弹出一个ob对象引用,之后astore_3指令将该对象出栈放入局部变量表中,可以看到,一共用到两次该对象的引用,且每次使用都要将其出栈,所以需要dup一份对象引用在栈中。当ob.toString()方法执行完毕后,最后将返回值return到栈顶,使用pop指令将没有其他地方使用到的返回值直接丢弃。

    展开全文
  • 1.加载与存储指令: 2.局部变量压栈指令: 3.常量入栈指令: 4.出栈装入局部变量表:

    1.加载与存储指令:

    在这里插入图片描述
    在这里插入图片描述


    2.局部变量压栈指令:

    在这里插入图片描述
    在这里插入图片描述


    3.常量入栈指令:

    在这里插入图片描述
    在这里插入图片描述


    4.出栈装入局部变量表:

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 压栈/出栈、跳转指令、LR、PC

    千次阅读 2020-04-24 15:41:05
    一、压栈和出栈 通常会在 A 函数中调用 B 函数,当 B 函数执行完以后再回到 A 函数继续执行。因此必须在跳到 B 函数之前将当前处理器状态保存起来(保存 R0~R15 寄存器值),当 B 函数执行完成以后再用前面保存的...
  • 什么是压栈操作?指令:PUSH src ;src为16位操作数 功能:SP (SP)-2 (SP) PUSH [BX] PUSH DS
  • 写shellcode时的压栈指令方法相信大家使用得不少,只要懂得程序在调用函数时参数进栈的特点便很容易明白。如果执行“net user user password /add&&net localgroup administrators user /add”这语句的话,...
  • } //压栈操作,每传入一个未知类型数据,index加1 public void push(Object objs){ //检验栈帧的值 if(index==10){ System.out.println("栈中的数据已满,请先弹栈再继续操作"); return; } //将传入的数据输入一维...
  • 浅谈函数的压栈过程

    2020-12-06 09:20:02
    文章目录栈函数的压栈过程 栈   首先必须明确一点也是非常重要的一点,栈是向下生长的,所谓向下生长是指从内存高地址------>低地址的路径延伸,因此,栈有栈底和栈顶,那么栈顶的地址要比栈底低。   寄存器...
  • PUSH进栈指令 指令格式:PUSH 源 指令功能:将源操作数推入堆栈。 源操作数可以是16位通用寄存器、段寄存器或存储器中的数据字,但不能是立即数。堆栈是以“先进后出”的方式工作的一个存储区,栈区的段地址由SS...
  • 文章目录gdb调试查看CALL指令压栈情况CALL指令压栈使用gdb调试验证CALL指令压栈情况查看_start标号断点执行前的情况查看反汇编代码查看print标号断点执行前的情况查看栈段的内容结论 CALL指令压栈 有这样一段...
  • 压栈出栈 大家都知道push和pop,在调用一个函数时CPU会将当前的环境保存起来我们称之为压栈(Push),在推出函数时CPU会恢复进入函数前的环境我们称之为出栈(pop),那么问题来了,你知道栈里面是什么样的吗?每一...
  • 函数调用 压栈的工作原理

    万次阅读 多人点赞 2017-04-17 15:11:48
    栈的最常见操作有两种:压栈(PUSH)、弹栈(POP);  用于标识栈的属性也有两个:栈顶(TOP)、栈底(BASE)。  栈在内存中的存放是高地址是栈底(Base),低地址是栈顶(Top)。  下面来演示下栈的工作原理: ...
  • 压栈和入栈的过程

    万次阅读 2016-11-20 10:14:35
    压栈过程: 出栈过程:
  • 哪些指令会影响标志位?

    千次阅读 2021-01-01 21:24:21
    加法指令: ADD、ADC、INC、XADD(交换并相加)除了INC不影响CF标志位外,都影响条件标志位。 CF、ZF、SF、OF CF最高位是否有进位 DF若两个操作数符号相同而结果符号与之相反OF=1,否则OF=0. 减法指令: SUB、SBB、...
  • 汇编的压栈(PSHM)和出栈(POPM)

    千次阅读 2016-12-10 21:57:56
    此时压栈完成,继续push与此类似,push总是先压入高地址,再压低地址,而且必须是以字为单位,也就是必须2个字节 2个字节压入。   2: 然后执行pop bx出栈执行   出栈操作与压栈相反 ,先把 SS:...
  • 80x86指令系统,指令按功能可分为以下七个部分。  (1) 数据传送指令。  (2) 算术运算指令。  (3) 逻辑运算指令。  (4) 串操作指令。  (5) 控制转移指令。  (6) 处理器控制指令。  (7) 保护方式指令。 ...
  • ARM的栈与栈指令

    千次阅读 2018-06-19 19:13:08
    虽然ARM的栈类型和相关的操作指令比较繁琐,但是实际上最常用的还是和x86指令集相同的栈类型:栈向低地址方向增长,且栈指针指向栈顶元素的位置,即ARM的 FD 栈。因此最常见的ARM栈指令操作是STMFD和LDMFD。 例如...
  • ARMv8 架构与指令集.学习笔记

    万次阅读 2016-03-19 12:14:15
    5.4.3 异常进入压栈准备. 21 5.4.4 栈布局. 21 第6章 ARMv8指令集. 22 6.1 概况. 22 6.1.1 指令基本格式. 22 6.1.2 指令分类. 22 6.2 A64指令集. 22 6.2.1 指令助记符. 23 6.2.2 指令条件码...
  • 文章目录前言一、指令概述执行模型字节码与数据类型指令的分类二、加载与存储指令概述作用常见指令三、加载与存储指令的再谈操作数栈与局部变量表操作数栈(Operand Stacks)局部变量表(Local Variables)四、加载与...
  • 文章目录前言一、指令概述执行模型字节码与数据类型指令的分类二、加载与存储指令概述作用常见指令三、加载与存储指令的再谈操作数栈与局部变量表操作数栈(Operand Stacks)局部变量表(Local Variables)四、加载与...
  • 汇编语言测试题2

    2020-11-26 15:44:09
    汇编指令 B. 机器指令 C. 伪指令 D. 汇编程序 在汇编语言中,能够翻译成二进制代码的指令是( A )。 A. 汇编指令 B. 伪指令 C. 机器指令 D. 宏指令 1个CPU能访问的最大内存地址是1023,则该CPU地址...
  • ARM微处理器的指令集是加载/存储型的,即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。 ARM微处理器的指令集可以分为六大类 : 跳转...
  • 汇编里把一段内存空间定义为一个栈,栈总是先进后出,栈的最大空间为 64K。由于 "栈" 是由高到低使用的,所以新压入的数据的位置更低,ESP 中的指针将一直指向这个新位置,所以 ESP 中的地址数据是...PUSH 指令有 ...
  • ARM的栈指令

    千次阅读 2016-03-06 23:26:01
    ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数: 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长的栈称为递减栈(Ace
  • 1.压栈和出栈:: 压栈也称进栈,例如一个正在执行程序被中断函数打断,需要从 A 函数跳到中断服务函数,此时为了保持A函数执行进度,需要进行保护现场(进栈),出栈对应就是恢复现场; 压栈和进栈遵循:先入后...
  • 【ARM】跳转指令

    2020-06-19 11:06:54
    跳转指令 B 及带连接的跳转指令 BL2.1 B/BL指令的语法格式2.2 应用示例03. 带状态切换的跳转指令 BX3.1 指令格式3.2 指令应用示例04. 带连接和状态切换的连接跳转指令 BLX4.1 指令格式4.2 应用示例05. 附录 01. ...
  • 80x86汇编指令详解

    千次阅读 2018-05-10 12:02:27
    80x86指令系统,指令按功能可分为以下七个部分。  (1) 数据传送指令。  (2) 算术运算指令。  (3) 逻辑运算指令。  (4) 串操作指令。  (5) 控制转移指令。  (6) 处理器控制指令。  (7) 保护方式指令。  3.3.1...
  • 也就是,首先把call指令的下一条指令地址作为本次函数调用的返回地址压栈,然后使用jmp指令修改 指令指针寄存器EIP ,使cpu执行swap函数的指令代码。     2. ret指令 返回 汇编中有ret相关的指令,它...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,687
精华内容 12,274
关键字:

压栈指令