diff --git "a/content/posts/Thumb \346\261\207\347\274\226\346\214\207\344\273\244\351\233\206\357\274\214Thumb \346\214\207\344\273\244\347\274\226\347\240\201\346\226\271\345\274\217\357\274\214\347\274\226\350\257\221 Thumb \346\261\207\347\274\226\344\273\243\347\240\201.md" "b/content/posts/Thumb \346\261\207\347\274\226\346\214\207\344\273\244\351\233\206\357\274\214Thumb \346\214\207\344\273\244\347\274\226\347\240\201\346\226\271\345\274\217\357\274\214\347\274\226\350\257\221 Thumb \346\261\207\347\274\226\344\273\243\347\240\201.md" index 352b515..a3e772a 100644 --- "a/content/posts/Thumb \346\261\207\347\274\226\346\214\207\344\273\244\351\233\206\357\274\214Thumb \346\214\207\344\273\244\347\274\226\347\240\201\346\226\271\345\274\217\357\274\214\347\274\226\350\257\221 Thumb \346\261\207\347\274\226\344\273\243\347\240\201.md" +++ "b/content/posts/Thumb \346\261\207\347\274\226\346\214\207\344\273\244\351\233\206\357\274\214Thumb \346\214\207\344\273\244\347\274\226\347\240\201\346\226\271\345\274\217\357\274\214\347\274\226\350\257\221 Thumb \346\261\207\347\274\226\344\273\243\347\240\201.md" @@ -1,6 +1,6 @@ +++ title = 'Thumb 汇编指令集,Thumb 指令编码方式,编译 Thumb 汇编代码' -date = 2024-11-04T02:29:37.450311+08:00 +date = 2024-11-04T02:39:15.327917+08:00 draft = false +++ @@ -107,7 +107,9 @@ int main() { ``` 执行下面命令把 hello_thumb.c 编译成 thumb 汇编代码文件 hello_thumb.s +``` armv7a-linux-androideabi35-clang -S -mthumb hello_thumb.c -o hello_thumb.s +``` -mthumb 表示使用 thumb 汇编 关于ARM程序生成过程可以参考这篇文章【[详解ARM64可执行程序的生成过程](https://cyrus-studio.github.io/blog/posts/%E8%AF%A6%E8%A7%A3arm64%E5%8F%AF%E6%89%A7%E8%A1%8C%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E6%88%90%E8%BF%87%E7%A8%8B/)】 @@ -184,7 +186,9 @@ main: ``` 执行下面命令把 thumb 汇编文件编译成可执行程序 hello_thumb。 +``` armv7a-linux-androideabi35-clang hello_thumb.s -o hello_thumb +``` 把 hello_thumb 推送到 android 设备并执行 ``` diff --git a/public/index.xml b/public/index.xml index de4afec..62dab45 100644 --- a/public/index.xml +++ b/public/index.xml @@ -6,12 +6,12 @@ Recent content on CYRUS STUDIO Hugo zh-cn - Mon, 04 Nov 2024 02:29:37 +0800 + Mon, 04 Nov 2024 02:39:15 +0800 Thumb 汇编指令集,Thumb 指令编码方式,编译 Thumb 汇编代码 https://cyrus-studio.github.io/blog/posts/thumb-%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4%E9%9B%86thumb-%E6%8C%87%E4%BB%A4%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F%E7%BC%96%E8%AF%91-thumb-%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81/ - Mon, 04 Nov 2024 02:29:37 +0800 + Mon, 04 Nov 2024 02:39:15 +0800 https://cyrus-studio.github.io/blog/posts/thumb-%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4%E9%9B%86thumb-%E6%8C%87%E4%BB%A4%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F%E7%BC%96%E8%AF%91-thumb-%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81/ 版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ Thumb指令集 ARM 指令集:最早在 1985 年随第一代 ARM 处理器问世。ARM 指令集一开始是 32 位固定长度的指令,用于各种计算任务。 Thumb 指令集:在 1994 年的 ARM7TDMI 处理器中首次引入。这是在 ARM 指令集基础上开发的一个 16 位指令集,旨在优化嵌入式系统中代码密度和内存效率。 寄存器 Thumb 跟 ARM 是一样的。 随着 ARM 架构的演进,后来加入了 32 位的 Thumb 指令,称为 Thumb-2 指令集。 以简单的加载立即数到寄存器为例,解释一下 16 位和 32 位的 Thumb 指令的区别 16 位 Thumb 指令 MOVS R0, #1 // 将立即数 1 加载到 R0,指令长度为 16 位 32 位 Thumb 指令 MOV.W R0, #65535 // 将较大的立即数 65535 加载到 R0,指令长度为 32 位 由于 16 位 Thumb 指令长度有限,无法直接处理大立即数,而 32 位 Thumb 指令支持更大的立即数范围。32 位指令格式可以容纳更多位的立即数、更复杂的操作码。 diff --git a/public/posts/index.xml b/public/posts/index.xml index 6ae2bc8..e8bd18b 100644 --- a/public/posts/index.xml +++ b/public/posts/index.xml @@ -6,12 +6,12 @@ Recent content in Posts on CYRUS STUDIO Hugo zh-cn - Mon, 04 Nov 2024 02:29:37 +0800 + Mon, 04 Nov 2024 02:39:15 +0800 Thumb 汇编指令集,Thumb 指令编码方式,编译 Thumb 汇编代码 https://cyrus-studio.github.io/blog/posts/thumb-%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4%E9%9B%86thumb-%E6%8C%87%E4%BB%A4%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F%E7%BC%96%E8%AF%91-thumb-%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81/ - Mon, 04 Nov 2024 02:29:37 +0800 + Mon, 04 Nov 2024 02:39:15 +0800 https://cyrus-studio.github.io/blog/posts/thumb-%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4%E9%9B%86thumb-%E6%8C%87%E4%BB%A4%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F%E7%BC%96%E8%AF%91-thumb-%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81/ 版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ Thumb指令集 ARM 指令集:最早在 1985 年随第一代 ARM 处理器问世。ARM 指令集一开始是 32 位固定长度的指令,用于各种计算任务。 Thumb 指令集:在 1994 年的 ARM7TDMI 处理器中首次引入。这是在 ARM 指令集基础上开发的一个 16 位指令集,旨在优化嵌入式系统中代码密度和内存效率。 寄存器 Thumb 跟 ARM 是一样的。 随着 ARM 架构的演进,后来加入了 32 位的 Thumb 指令,称为 Thumb-2 指令集。 以简单的加载立即数到寄存器为例,解释一下 16 位和 32 位的 Thumb 指令的区别 16 位 Thumb 指令 MOVS R0, #1 // 将立即数 1 加载到 R0,指令长度为 16 位 32 位 Thumb 指令 MOV.W R0, #65535 // 将较大的立即数 65535 加载到 R0,指令长度为 32 位 由于 16 位 Thumb 指令长度有限,无法直接处理大立即数,而 32 位 Thumb 指令支持更大的立即数范围。32 位指令格式可以容纳更多位的立即数、更复杂的操作码。 diff --git "a/public/posts/thumb-\346\261\207\347\274\226\346\214\207\344\273\244\351\233\206thumb-\346\214\207\344\273\244\347\274\226\347\240\201\346\226\271\345\274\217\347\274\226\350\257\221-thumb-\346\261\207\347\274\226\344\273\243\347\240\201/index.html" "b/public/posts/thumb-\346\261\207\347\274\226\346\214\207\344\273\244\351\233\206thumb-\346\214\207\344\273\244\347\274\226\347\240\201\346\226\271\345\274\217\347\274\226\350\257\221-thumb-\346\261\207\347\274\226\344\273\243\347\240\201/index.html" index a3d9319..85ee405 100644 --- "a/public/posts/thumb-\346\261\207\347\274\226\346\214\207\344\273\244\351\233\206thumb-\346\214\207\344\273\244\347\274\226\347\240\201\346\226\271\345\274\217\347\274\226\350\257\221-thumb-\346\261\207\347\274\226\344\273\243\347\240\201/index.html" +++ "b/public/posts/thumb-\346\261\207\347\274\226\346\214\207\344\273\244\351\233\206thumb-\346\214\207\344\273\244\347\274\226\347\240\201\346\226\271\345\274\217\347\274\226\350\257\221-thumb-\346\261\207\347\274\226\344\273\243\347\240\201/index.html" @@ -43,8 +43,8 @@ - - + + @@ -201,9 +201,9 @@

编译 Thumb 汇编指令

执行下面命令把 hello_thumb.c 编译成 thumb 汇编代码文件 hello_thumb.s -armv7a-linux-androideabi35-clang -S -mthumb hello_thumb.c -o hello_thumb.s --mthumb 表示使用 thumb 汇编

+

执行下面命令把 hello_thumb.c 编译成 thumb 汇编代码文件 hello_thumb.s

+
armv7a-linux-androideabi35-clang -S -mthumb hello_thumb.c -o hello_thumb.s
+

-mthumb 表示使用 thumb 汇编

关于ARM程序生成过程可以参考这篇文章【详解ARM64可执行程序的生成过程

打开 hello_thumb.s 可以看到,结构上和 ARM 汇编是差不多的,多了一些 thumb 标记,如:.code 16、.thumb_func 标记为 16 位 thumb,还有使用到 thumb 指令。

    .text                                // 指令区段开始
@@ -273,9 +273,9 @@ 

编译 Thumb 汇编指令

执行下面命令把 thumb 汇编文件编译成可执行程序 hello_thumb。 -armv7a-linux-androideabi35-clang hello_thumb.s -o hello_thumb

-

把 hello_thumb 推送到 android 设备并执行

+

执行下面命令把 thumb 汇编文件编译成可执行程序 hello_thumb。

+
armv7a-linux-androideabi35-clang hello_thumb.s -o hello_thumb
+

把 hello_thumb 推送到 android 设备并执行

adb push .\hello_thumb /data/local/tmp
 adb shell chmod +x /data/local/tmp/hello_thumb
 adb shell /data/local/tmp/hello_thumb
diff --git a/public/sitemap.xml b/public/sitemap.xml
index beb442a..3ba514e 100644
--- a/public/sitemap.xml
+++ b/public/sitemap.xml
@@ -3,13 +3,13 @@
   xmlns:xhtml="http://www.w3.org/1999/xhtml">
   
     https://cyrus-studio.github.io/blog/
-    2024-11-04T02:29:37+08:00
+    2024-11-04T02:39:15+08:00
   
     https://cyrus-studio.github.io/blog/posts/
-    2024-11-04T02:29:37+08:00
+    2024-11-04T02:39:15+08:00
   
     https://cyrus-studio.github.io/blog/posts/thumb-%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4%E9%9B%86thumb-%E6%8C%87%E4%BB%A4%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F%E7%BC%96%E8%AF%91-thumb-%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81/
-    2024-11-04T02:29:37+08:00
+    2024-11-04T02:39:15+08:00
   
     https://cyrus-studio.github.io/blog/posts/adb-%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95%E6%89%8B%E5%8A%A8%E4%BF%AE%E6%94%B9-adb-%E8%B0%83%E8%AF%95%E6%8E%88%E6%9D%83%E4%BF%A1%E6%81%AF/
     2024-11-03T04:49:00+08:00