第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Java逆向基礎(chǔ)之操作數(shù)棧

標(biāo)簽:
Java

本文参考:http://www.vuln.cn/7115

本地变量和操作数栈

本地变量数组(Local Variable Array)

本地变量的数组包括方法执行所需要的所有变量,包括 this 的引用,所有方法参数和其他本地定义的变量。对于那些方法(静态方法 static method)参数是以零开始的,对于实例方法,零为 this 保留。

所有的类型都在本地变量数组中占一个槽(entry),而 long 和 double 会占两个连续的槽,因为它们有双倍宽度(64-bit 而不是 32-bit)。

操作数栈(Operand Stack)

操作数栈在执行字节码指令的时候使用,它和通用寄存器在 native CPU 中使用的方式类似。大多数 JVM 字节码通过 pushing,popping,duplicating,swapping,或生产消费值的操作使用操作数栈。


看一个运算的例子

public class calc{public static int half(int a){return a/2;}}

编译

javac calc.java

反编译

javap -c -verbose calc.class

反编译结果

...major version: 52...public static int half(int);descriptor: (I)Iflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=1, args_size=10: iload_01: iconst_22: idiv3: ireturnLineNumberTable:line 5: 0

iload_0 第0个变量(即变量a)压入操作数栈

+-------+| stack |+-------+|   a   |+-------+

iconst_2 将2压入操作数栈

+-------+| stack |+-------+|   2   ||   a   |+-------+

idiv  操作数栈中的前两个int相除,并将结果压入操作数栈顶

+-------+| stack |+-------+| result|+-------+

ireturn  返回栈顶元素


例子2,复杂一点的例子,处理双精度的值

public class calc{public static double half_double(double a){return a/2.0;}}

反编译

...major version: 52...#2 = Double             2.0d...public static double half_double(double);descriptor: (D)Dflags: ACC_PUBLIC, ACC_STATICCode:stack=4, locals=2, args_size=10: dload_01: ldc2_w        #2                  // double 2.0d4: ddiv5: dreturnLineNumberTable:line 5: 0

ldc2_w指令是从常量区装载2.0d,另外,其他三条指令有d前缀,意思是他们使用double数据类型。


例子3,两个参数

public class calc{public static int sum(int a, int b){return a+b;}}

反编译

...major version: 52...public static int sum(int, int);descriptor: (II)Iflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=2, args_size=20: iload_01: iload_12: iadd3: ireturnLineNumberTable:line 5: 0

iload_0 第0个变量(即变量a)压入操作数栈

+-------+| stack |+-------+|   a   |+-------+

iload_1 第1个变量(即变量b)压入操作数栈

+-------+| stack |+-------+|   b   ||   a   |+-------+

iadd 操作数栈中的前两个int相加,并将结果压入操作数栈顶

+-------+| stack |+-------+| result|+-------+

ireturn 返回栈顶元素


例子4,类型改为长整型

public class calc{public static long lsum(long a, long b)	{		return a+b;	}}

反编译

...major version: 52...public static long lsum(long, long);descriptor: (JJ)Jflags: ACC_PUBLIC, ACC_STATICCode:stack=4, locals=4, args_size=20: lload_01: lload_22: ladd3: lreturnLineNumberTable:line 5: 0

可以看到压入第二个参数的时候为lload_2,可见lload_0占了两个槽(entry)


例子5,混合运算

public class calc{public static int mult_add(int a, int b, int c){return a*b+c;}}

反编译

...major version: 52...public static int mult_add(int, int, int);descriptor: (III)Iflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=3, args_size=30: iload_01: iload_12: imul3: iload_24: iadd5: ireturnLineNumberTable:line 5: 0

iload_0 第0个变量(即变量a)压入操作数栈

+-------+| stack |+-------+|   a   |+-------+

iload_1 第1个变量(即变量b)压入操作数栈

+-------+| stack |+-------+|   b   ||   a   |+-------+

imul 操作数栈中的前两个int相乘,并将结果压入操作数栈顶

+-------+| stack |+-------+|result1|+-------+

iload_2 第2个变量(即变量c)压入操作数栈

+-------+| stack |+-------+|   c   ||result1|+-------+

iadd 操作数栈中的前两个int相加,并将结果压入操作数栈顶

+-------+| stack |+-------+|result2|+-------+

ireturn 返回栈顶元素


點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消