首页
社区
课程
招聘
[求助]非大书中第三章的Dalvik版HelloWorld源码的注释及不懂的地方
发表于: 2013-3-21 02:18 5897

[求助]非大书中第三章的Dalvik版HelloWorld源码的注释及不懂的地方

2013-3-21 02:18
5897
近日在拜读非大的书时,在3.4.1中的代码有几点不大明白的地方,希望指点下

.class public LHelloWorld #定义类名
.super Ljava/lang/object  #定义父类

.method public static main( [Ljava/lang/String; )V                 #Main方法
.registers4  #使用了4个参数寄存器       
.parameter  #一个参数
.prologue          #代码开始指令
#数据定义指令
const/16 v0, 0x8             #将0x8扩展为32位后赋值给v0
const/4 v1, 0x5       #将0x5扩展为32位后赋值给v1 ???'const/4'与'const/16'的区别
const/4 v2, 0x3
#数据操作指令
move v1, v2
#数组操作指令
new-array v0, v0, [I         #构建一个int型数组大小为v0也就是0x8将数组地址赋值给v0
array-length v1, v0        #获取v0中数组长度赋值给v1等同于数组复制
#实例操作指令
new-instance v1, Ljava/lang/StringBuilder;  #构造一个StringBuilder对象放在v1中
#方法调用指令
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V   #???StringBulider的构造函数
#跳转指令
if-nez v0, :cond_0                  #如果v0不为0就跳转到cond_0标记处
goto :goto_0  #跳转到goto_0标记处
:cond_0                                #标记
#数据转移指令
int-to-float v2, v2                                        #将v2中的float转换为int
#数据运算指令
add-float v2, v2, v2       #v2累加在v2中
#比较指令
cmpl-float v0, v2, v2         #比较结果为0   如果第三个寄存器大于第二个寄存器结果为-1 相等为0 下于为1
#字段操作指令
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream   
const-string v1, "Hello World" #构造字符串到v1
#方法调用指令
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V  #调用println
:goto_0
return-void  #返回空
.end method

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 507
活跃值: (130)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
第二个,StringBuilder ,其实,你可以自己写个android小程序,反编译一下,对照你的helloworld源码一看不久知道了。这些很多都是固定用法的,没必要太花费心思考虑这些。
对于第一个,const/4 v1, 0x5  ,楼主可以试着将后面的0x5进行修改,0xa看是否能回编译,或者改小点0x4看能否回编,多测试下,会有发现的~
2013-3-21 08:17
0
雪    币: 66
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢提醒.我也把我刚刚试的结果在这里说一下把.
const/4 与 const/16 的区别我理解的是:
const/4 的值必须在-8到7之间 也就是4位.
2013-3-21 19:43
0
雪    币: 335
活跃值: (263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
用这个工具otertool
java to smali,更好比较了解
2013-3-22 16:54
0
游客
登录 | 注册 方可回帖
返回
//