首页 > 编程知识 正文

samli语法可改变变量,datalogger使用说明

时间:2023-05-06 17:17:26 阅读:160897 作者:860

介绍了dalviks字节码寄存器为32位,可以表示任何类型,两个寄存器用于表示64位类型。 一个方法指定的寄存器指定一个方法(method )中两种方法可用的寄存器数。 命令. registers指定此方法的可用寄存器数,命令. locals指定此方法的非参数寄存器数。 但是,寄存器总数中也包含保持方法参数的寄存器。 参数是如何传递的? 调用方法时,方法的参数保存在最后n个寄存器中。 如果一个方法有两个参数和五个寄存器(V0-V4 ),则参数将存储在最后两个寄存器中的V3和V4 .非静态方法的第一个参数中,并且始终是由方法调用的对象。 例如,你写了一个非静态方法LMyObject; -callme(ii ) v。 此方法有两个int参数,但两个整数参数前面还有一个隐藏参数LMyObject; 所以这个方法共有三个参数。 例如,可以为方法指定五个寄存器(V0-V4 ),仅使用. register指令指定五个,或使用. locals指令指定两个) local寄存器、三个参数寄存器。 调用该方法时,调用该方法的对象(即this引用)将保存在V2中,第一个参数为V3,第二个参数为v4。

Arial,Helvetica,宋体,sans-serif; font-size:14px"> 除了不包含this隐藏参数,对于静态方法都是相同的。

寄存器名称
有两种寄存器的命名方式,对于参数寄存器有普通的V命名方式和P命名方式。在方法(method)中第一个参数寄存器,是使用P方式命名的第一个寄存器,让我们回到前面的例子中,有三个参数和5个寄存器,下面的这个表显示了对每个寄存器的普通V命名方式,后面是P方式命名的参数寄存器。

v0 the first local registerv1 the second local registerv2p0the first parameter registerv3p1the second parameter registerv4p2the third parameter register

You can reference parameter registers by either name - it makes no difference.

你可以使用名称引用参数寄存器,他们没有区别。

引入参数寄存器的目的
P命名方式被引入去解决,在编辑smail代码时候共同的烦恼。

假设你有一个方法(mehtod),这个方法带有一些参数,并且你需要添加一些代码到这个方法中,这时发现需要一些额外的寄存器,你会想“没有什么大不了的。我只需要使用.registers指令添加寄存器数量就可以了。”
不幸的是没有想象的那么容易,请记住,方法中方法的参数被保存在最后的寄存器里。如果你增加了寄存器的数量,达到让寄存器中的参数被传入的目的。所以你不得不使用.registers指令重新分配参数寄存器的编号。
但如果在方法中P命名方式,被用来引用参数寄存器。你将很容易的在方法中去修改寄存器数量,而不用去担心现有寄存器的编号。

注意:在默认的baksmali中,参数寄存器将使用P命名方式,如果出于某种原因你要禁用P命名方式,而要强制使用V命名方式,应当使用-p/--no-parameter-registers选项。

Long/Double values
正如前面提到的,long和double类型都是64位,需要2个寄存器。不安的玫瑰引用参数的时候一定要记住,例如:你有一个非静态方法LMyObject;->MyMethod(IJZ)V,LMyObject方法的参数为int、long、bool。所以这个方法的所有参数需要5个寄存器。
p0thisp1Ip2, p3Jp4Z

另外不安的玫瑰调用方法后,你必须在寄存器列表,调用指令中指明,两个寄存器保存了double-wide宽度的参数。


来自:https://code.google.com/p/smali/wiki/Registers

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。