由于Android以及Jetson TK的编译工具链中的汇编器仍然不支持大部分的32位Thumb-2指令,比如add.w,因此我们只能通过手工写机器指令码来实现想要的指令。下面我将简单地介绍如何在ARM GCC汇编器中手工去写机器指令码。

对于GCC或Clang的汇编器,我们使用.long或.short来写机器指令码。.long直接插入在指令汇编中,表示一个四字节的整型数据;.short直接插入在汇编中,表示一个双字节的整型数据。

然后,我们举一个add.w指令的例子,由于Android NDK r9d以及当前的Jetson TK1都不支持该指令的汇编。我们先看一下ARM官方对此指令编码的描述:

上图中我们可以看到add.w指令有两个双字节构成。而左边的16位放在低地址;而右边的16位放在高地址。这么做的好处是,处理器的译码器(decoder)在Thumb模式下总是从低双字节到高双字节进行解析,而左边的16位编码包含了Thumb指令类别,从而使得译码器可以知道是否当前指令是一条完整的指令,因为Thumb-2有32位宽和16位宽两种形式的指令类别。因此,如果我们要写:

add.w     r0, r0, r1, LSL #1

那么我们就要这么写机器指令码:

.long 0x0041eb00

或者是:

.short 0xeb00

.short 0x0041

这里,imm3与imm2合并成一个5位的移位立即数;两个比特位的type形式如下:

00: LSL(逻辑左移)

01: LSR(逻辑右移)

10: ASR(算术左移)

11: 若5位立即数为00000,那么为RRX(带进位标志的循环右移一位);否则为ROR(循环右移)

下面举一个稍微完整的例子:

.text
.align .globl MyASMTest .thumb .thumb_func
MyASMTest: // add.w r0, r0, r1, LSL #
.long 0x0041eb00 // equivalent
.short 0xeb00
.short 0x0041 adr r1, MyARMTest
bx r1 .arm MyARMTest: movw r12, #
add r0, r0, r12
bx lr

然后,我们可以在C语言中做如下调用:

#include <stdio.h>

extern int MyASMTest(int, int);

int main(void)
{
int result = MyASMTest(, );
printf("The result is: %d\n", result);
} // 最终输出90

经过Google工程师的提醒,对于ARM GCC的汇编器,在汇编文件最上面加入.syntax unified之后,Thumb-2 T3 encoding汇编也能正常使用了,比如:

.syntax unified
.text
.align
.globl helloThumb .thumb
.thumb_func
helloThumb: add.w r0, r0, r1, lsl #
bx lr

以上汇编能顺利通过。

在基于Android以及Jetson TK平台上如何写32位的Thumb-2指令的更多相关文章

  1. 【基于Android的ARM汇编语言系列】之五:ARM指令集与Thumb指令集

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...

  2. Win7 64位系统上配置使用32位的Eclipse(转)

    Win7 64位系统上配置使用32位的Eclipse 博客分类: Eclipse eclipse  最近工作电脑换成了64位的win7系统,之前个人电脑上安装的jdk和Eclipse都是32位的.而新 ...

  3. Android系统移植(一)-让android系统在目标平台上运行起来

    编号),文件系统采用ubifs格式,控制台设备为ttyS1,波特率为115200 启动的第一个应用程序是/init (6)确保控制台的设置和硬件保持一致,如:硬件上串口用的是UART1,则内核启动参数 ...

  4. IIS 64位上發佈32位asp.net設置

    錯誤:無法載入檔案或組件 'Maticsoft.Web' 或其相依性的其中之一. 試圖載入格式錯誤的程式. 解決:新增應用程序池——高級設置——啟用32位應用程式——True

  5. MacOSX64位机器上gcc编译32位x264静态库

    x264最新包地址:http://www.videolan.org/developers/x264.html 编译命令: ./configure --enable-static --host=i386 ...

  6. 如何在Win7 x64上的配置32位的PostgreSQL ODBC数据源

    在Win7 x64下安装最新版的PostgreSQL 9.x 后,从其官网下载最新的 ODBC驱动,分为普通的32位和64位版本,正常安装后,从已安装软件列表里可以看到两个版本的驱动都已经正确显示出来 ...

  7. 【毕业设计】基于Android的家校互动平台开发(内含完整代码和所有文档)——爱吖校推(你关注的,我们才推)

    ☆ 写在前面 之前答应大家的毕业答辩之后把所有文档贡献出来,现在答辩已过,LZ信守承诺,把所有文档开源到了GitHub(这个地址包含所有的代码和文档以及PPT,外层为简单的代码).还望喜欢的朋友们,不 ...

  8. 【基于Android的ARM汇编语言系列】之三:ARM汇编语言程序结构

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...

  9. C# 编译器选项 /platform(指定输出平台)32位程序运行到x64平台的问题

    如果说你编译的exe运行时报错: “尝试读取或写入受保护的内存.这通常指示其他内存已损坏” 这很有可能是你是以非托管的方式错误地引用了64位的API中去. 为什么会这样? 那你就要考虑VS的编译器选项 ...

随机推荐

  1. Echarts如何添加鼠标点击事件?防止重复触发点击事件

    Echarts如何添加鼠标点击事件? 1.通常我们只使用了以下代码,通过配置项和数据显示图表. var myChart = echarts.init(document.getElementById(' ...

  2. oracle 的普通语法

    select sysdate from dual -- 时间 select SYS_GUID() from dual --唯一

  3. 【JavaWeb】通过邮件找回密码

    前言 本文将介绍忘记密码时通过发送重置密码邮件找回密码的实现思路.整个实现过程中最重要的就是以下三点: 如何发送邮件到用户指定邮箱 邮件中的重置密码链接构成是怎么样的 验证重置密码链接的合法性(是否过 ...

  4. 5-修改windows的远程桌面端口3389

    一.注意点 1.Windows远程桌面端口默认是3389,是一个高危端口,所以需要改为其他的: 2.修改完注册表后,要重启机器,才能生效: 二.操作步骤 1.打开注册表 命令:regedit 2.进入 ...

  5. keil结合st-link使用SWO的两种调试方法笔记

    通过strongerHuang的教程,实现了SWO的两种调试方法, 1.在keil调试的过程中,使用debug printf viewer打印信息, 2.在STM32 ST-LINK Utility中 ...

  6. dp四边形优化

    如果dp[i][j]=min(dp[i][k]+dp[k+1][j]+w[i][j]);且满足dp[a][c]+dp[b][d]<=dp[a][d]+dp[c][d](a<b<=c& ...

  7. windows版idea 2018.3.5版 永久激活教程

    1.下载idea并安装:https://download.jetbrains.com/idea/ideaIU-2018.3.5.exe?_ga=2.179947812.1869744014.15658 ...

  8. React顶层API

    1.React.Children相关 1. React.Children.map(props.children, mapFunc) 1)该方法用于在props.children不透明的情况下,安全的遍 ...

  9. KiCad:Cursor Ghosting

    造冰箱的大熊猫@cnblogs 2019/8/11 装下KiCad学习下,结果鼠标在界面上划过时,留下一串鼠标残影,原来英文管这个叫“cursor ghosting”. 解决方法:依旧粗暴简单,从官网 ...

  10. Vue(一)

    什么是Vue? 用于构建用户界面的渐进式框架