読者です 読者をやめる 読者になる 読者になる

YDiary

メモ的な

Smali基本文法

Smali基本语法 - lee0oo0 - 博客园
が分かりやすかったのでそのまま訳しただけ

.field private isFlag:z  変数定義
.method  メソッド
.parameter  メソッドパラメータ
.prologue  メソッドの始まり
.line 12  ソースコードだと12行目
invoke-super  親クラスのメソッド呼び出し
const/high16 v0, 0x7fo3  v0に0x7fo3を割り当て
invoke-direct  メソッド呼び出し
return-void  voidを返す
.end method  メソッドの終わり
new-instance  インスタンスの生成
iput-object  オブジェクトの割り当て
iget-object  オブジェクトの取得
invoke-static  スタティックメソッドの呼び出し

条件分岐命令:

"if-eq vA, vB, :cond_**"  vAがvBと等しければ:cond_**に飛ぶ  
"if-ne vA, vB, :cond_**"  vAがvBと等しくなければ:cond_**に飛ぶ  
"if-lt vA, vB, :cond_**"  vAがvBより小さければ:cond_**に飛ぶ  
"if-ge vA, vB, :cond_**"  vAがvB以上ならば:cond_**に飛ぶ  
"if-gt vA, vB, :cond_**"  vAがvBより大きければ:cond_**に飛ぶ  
"if-le vA, vB, :cond_**"  vAがvB以下ならば:cond_**に飛ぶ  
"if-eqz vA, :cond_**"  vAが0ならば:cond_**に飛ぶ  
"if-nez vA, :cond_**"  vAが0でないならば:cond_**に飛ぶ  
"if-ltz vA, :cond_**"  vAが0より小さければ:cond_**に飛ぶ  
"if-gez vA, :cond_**"  vAが0以上ならば:cond_**に飛ぶ  
"if-gtz vA, :cond_**"  vAが0より大きければ:cond_**に飛ぶ  
"if-lez vA, :cond_**"  vAが0以下ならば:cond_**に飛ぶ  

========================================

javaでのif文:

private boolean ifSense(){
  boolean tempFlag = ((3-2)==1)? true : false;
  if (tempFlag) {
    return true;
  }else{
    return false;
  }
}

Smaliでのif文:

.method private ifSense()Z
  .locals 2

  .prologue
  .line 22
  const/4 v0, 0x1 //v0に1を入れる

  .line 24
  .local v0, tempFlag:Z
  if-eqz v0, :cond_0 //v0が0に等しいか判断する,等しければcond_0に飛ぶ

  .line 25
  const/4 v1, 0x1 //v0が0と等しくない場合

  .line 27
  :goto_0
  return v1

  :cond_0
  const/4 v1, 0x0 //v0が0と等しい場合

  goto :goto_0
.end method

###メモ:if文の条件を満たす場合は,そのまま下に行きreturnされる.満たさない場合は:cond_0に飛んだ後に,goto命令でgoto_0に飛び,returnされる.

========================================

javaでのfor文:

private void forSense(){
  listStr = new ArrayList<String>(COUNT);
  for (int i = 0; i < COUNT; i++) {
    listStr.add("现在轮到我上场乐");
  }
}

Smaliでのfor文:

.line 40
  const/4 v0, 0x0

  .local v0, i:I
  :goto_0
  if-lt v0, v3, :cond_0 //if-ltでv0とv3を比較,v0<v3ならcond_0に飛ぶ

  .line 43
  return-void

  .line 41
  :cond_0 //ラベル
  iget-object v1, p0, Lcom/example/smalidemo/MainActivity;->listStr:Ljava/util/List; //オブジェクトの取得

  const-string v2, "\u73b0\u5728\u8f6e\u5230\u6211\u4e0a\u573a\u4e50"

  invoke-interface {v1, v2}, Ljava/util/List;->add(Ljava/lang/Object;)Z //Listはインターフェースなので,インターフェースメソッドaddを実行する

  .line 40
  add-int/lit8 v0, v0, 0x1 //第二オペランドのv0レジスタに0x1を加え,第一オペランドのv0レジスタに代入する

  goto :goto_0 //goto_0に飛ぶ

###メモ:v0<v3を判断する部分に,ラベルgoto_0をセットする.条件を満たせばcond_0に飛び,その後またgoto_0に戻り条件を判断する.