Dalvik汇编语言
<h3 id="dalvik虚拟机-jit即时编译">Dalvik虚拟机 JIT(即时编译)</h3><blockquote>
<p>JIT (Just-in-time Compilation,即时编译),又称为动态编译,是一种通过在运行时将字节码翻译为机器码的技术,使得程序的执行速度更快。Android 2.2版本系统的Dalvik虚拟机引入了JIT 技术,官方宣称新版的Dalvik 虚拟机比以往执行速度快3~6倍。</p>
</blockquote>
<p>两种字节码编译方式</p>
<ul>
<li>method方式: 函数或者访问为单位进行编译</li>
<li>trace方式:以trace为单位进行编译</li>
</ul>
<blockquote>
<p>method方式很好理解,那什么是trace方式呢?在函数中一般很少是顺序执行代码的,多数的代码都分成了好几条执行路径,其中函数的有些路径在实际运行过程中是<strong>很少被执行的,这部分路径被称为“冷路径”</strong>,而<strong>执行比较频繁的路径被称为“热路径”</strong>。采用传统的method 方式会编译整个方法的代码,这会使得在“冷路径”上浪费很多编译时间,并且耗费更多的内存;<strong>trace方式编译则能够快速地获取“热路径”代码,使用更短的时间与更少的内存来编译代码。</strong></p>
<p>目前,Dalvik 虚拟机默认采用trace方式编译代码,同时也支持采用method方式来编译。</p>
</blockquote>
<h1 id="dalvik汇编">dalvik汇编</h1>
<p>Dalvik 虚拟机为自己专门设计了一套指令集,并且制定了自己的指令格式与调用规范。我们将 Dalvik指令集组成的代码称为Dalvik汇编代码,将这种代码表示的语言称为Dalvik汇编语言</p>
<h2 id="dalvik指令格式">Dalvik指令格式</h2>
<ul>
<li>每16位的字采用空格分隔开来。</li>
<li>每个字母表示四位,每个字母按顺序从高字节开始,排列到低字节。每四位之间可能使用竖线“”来表示不同的内容。</li>
<li>顺序采用A~Z的单个大写字母作为一个4位的操作码, op表示一个8位的操作码。</li>
</ul>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946832.png" alt="image-20221203182826324" loading="lazy"></p>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946834.png" alt="image-20221203183137642" loading="lazy"></p>
<h2 id="指令集">指令集</h2>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946835.png" alt="image-20221203191003223" loading="lazy"></p>
<h4 id="空指令nop">空指令:nop</h4>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946836.png" alt="image-20221203192344797" loading="lazy"></p>
<h4 id="move">move</h4>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946837.png" alt="image-20221203192516258" loading="lazy"></p>
<h4 id="return">return</h4>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946838.png" alt="image-20221203192538683" loading="lazy"></p>
<h4 id="const">const</h4>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946839.png" alt="image-20221203192559907" loading="lazy"></p>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946840.png" alt="image-20221203192609093" loading="lazy"></p>
<h4 id="monitor">monitor</h4>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946841.png" alt="image-20221203192628544" loading="lazy"></p>
<h4 id="check">check</h4>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946843.png" alt="image-20221203192653133" loading="lazy"></p>
<h4 id="array">array</h4>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946844.png" alt="image-20221203192717225" loading="lazy"></p>
<h4 id="throw">throw</h4>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946845.png" alt="image-20221203192737373" loading="lazy"></p>
<h4 id="goto--if-">gotoif-..</h4>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946846.png" alt="image-20221203192749259" loading="lazy"></p>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946847.png" alt="image-20221203192800411" loading="lazy"></p>
<h4 id="cmpl-type">cmpl-type</h4>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946848.png" alt="image-20221203192837927" loading="lazy"></p>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946849.png" alt="image-20221203192844358" loading="lazy"></p>
<h4 id="iget-iput-sget-sput">iget iput sget sput</h4>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946850.png" alt="image-20221203193231551" loading="lazy"></p>
<h4 id="invoke">invoke</h4>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946851.png" alt="image-20221203193253191" loading="lazy"></p>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946852.png" alt="image-20221203193308243" loading="lazy"></p>
<h4 id="unop">unop</h4>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946853.png" alt="image-20221203193400637" loading="lazy"></p>
<h4 id="binop">binop</h4>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946854.png" alt="image-20221203193439584" loading="lazy"></p>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946855.png" alt="image-20221203193451780" loading="lazy"></p>
<h3 id="dalvik的hello-world">Dalvik的hello world</h3>
<p>编写smali语法来编写一段Dalvik的指令集</p>
<p>新建一个hello.smali,类程序框架:</p>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946856.png" alt="image-20221203194044173" loading="lazy"></p>
<p>在 .porlogue下面写入</p>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946857.png" alt="image-20221203194132969" loading="lazy"></p>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946858.png" alt="image-20221203194146097" loading="lazy"></p>
<p>编译他smali文件,使用smali.jar</p>
<pre><code class="language-bash">java -jar smali.jar -o class.dex hello.smali
</code></pre>
<p>dex为可执行文件</p>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946859.png" alt="image-20221203194343812" loading="lazy"></p>
<p>运行</p>
<p><img src="https://crabin-01-1309266318.cos.ap-guangzhou.myqcloud.com/image/202212031946860.png" alt="image-20221203194407158" loading="lazy"></p>
<pre><code class="language-bash">adb push Hello.zip /data/local/
adb shell dalvikvm -cp /data/local/Hello.zip HelloWorld
</code></pre><br><br>
来源:https://www.cnblogs.com/crabin/p/17092314.html
頁:
[1]