VS2005混合编译ARM汇编代码

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在开发过程中,发现简单的在Storage Memory区域拷贝或粘贴文件不能达到硬件量测的要求,需要直接通过编写ARM汇编指令让CPU直接对Memory进行读写数据。

以前没有用VS2005编写过汇编代码,所以走了点弯路,一直试图用内嵌汇编的方式来build,可恨的VS2005死活不认ARM指令,后来请出 google大神一搜,原来这条路已经有很多先行者试过了,结论是VS2005不能用内嵌汇编的方式build ARM汇编代码!

俗话说的好啊,机器是死的,人是活的!

google大神给我指出了一条通向光明的道路: VS2005中是可以对纯粹的arm汇编文件进行编译的,当然也可以将C编译生成的obj文件和asm汇编文件生成的obj文件进行link。

这种混合编译的方法,网上流传最广的一份代码出自一位叫Larry Bank的老外。

具体方法:

一. 创建编译规则

<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile Name="Arm ASM" Version="8.00">
   <Rules>
      <CustomBuildRule
         Name="Arm asm" DisplayName="Arm asm"
         CommandLine="armasm -o &quot;$(IntDir)\$(InputName).obj&quot; [$Inputs] "
         Outputs="$(IntDir)\$(InputName).obj"
         FileExtensions="*.asm"
         ExecutionDescription="Executing tool..."
      >
      <Properties></Properties>
      </CustomBuildRule>
   </Rules>
</VisualStudioToolFile>

将上面的代码复制到记事本中,并将其保存到vs2005安装目录的Microsoft Visual Studio 8\VC\VCProjectDefaults文件夹下,命名为armcc.rules

二. 在VS2005中添加编译规则

选择需要和ARM汇编代码做混合编译的Project,右键弹出的菜单中选择"Custom Build Rules...”,在弹出的对话框中点"Find Existing..."按钮,选择armcc.rules文件

三. 编写ARM汇编代码,并将其加入VS2005的Project中(以Larry Bank的code为例)

ARM汇编代码,文件命名为armtest.asm:

;      TITLE("Sample App")
;++
        AREA sample, CODE, READONLY ; name this block of code
       
   EXPORT TEST
IMPORT iGlobal
;
; Called from C as int ARMTEST1(int, int, int, int);
; The first 4 parameters are passed in r0-r3, more parameters would be passed on the stack
;
TEST proc
    add r0,r0,r1     ; add all of the inputs together
    add r0,r0,r2
    add r0,r0,r3
    ldr r1,=iGlobal ; get the value of our global variable
    ldr r1,[r1]   ; dereference the pointer (I know there's a pipe stall here)
    add r0,r0,r1 ; we're not concerned with performance in this example
    mov pc,lr     ; return to C with the value in R0   
    endp

    LTORG      ; allow room for the address constant of our global (loaded relative to PC)
    END

将armtest.asm加入VS2005的Project中,编写调用代码:

// Windows CE Sample Application

// File Name: MAIN.C
// Demonstrations how to use ARM assembly language within a C program
// Written by Larry Bank 3/25/2007

#include <windows.h>

int iGlobal;

int TEST(int, int, int , int);

/****************************************************************************
*                                                                          *
* FUNCTION   : WinMain(HANDLE, HANDLE, LPSTR, int)                        *
*                                                                          *
* PURPOSE    : Program entrypoint                                         *
*                                                                          *
****************************************************************************/
int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
int iResult;
TCHAR szTemp[256];

   iGlobal = 5;
   iResult = TEST(1,2,3,4);
   wsprintf(szTemp, L"Result = %d", iResult);
   MessageBox(HWND_DESKTOP, szTemp, L"ASM Result", MB_OK);
      
   return 0;

} /* WinMain() */

四. Build VS2005的Project,当你看到如下信息时,恭喜你~~~你成功了!

========= Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

到这里,可能大家觉得结束了,呵呵,其实才是做了一半!

仔细的朋友可能也发现了,Larry Bank调用armtest.asm中函数的文件MAIN.C在VS2005编译时调用的是C编译器,但是现在很多项目工程会以C++代码编写(*.cpp),在VS2005中会用C++编译器Compile。

如果不注意这点的话,就会出现下面的结果:

error LNK2001: unresolved external symbol iGlobal
error LNK2019: unresolved external symbol "int __cdecl TEST1(int,int,int,int)" (?TEST1@@YAHHHHH@Z) referenced in function wmain
fatal error LNK1120: 2 unresolved externals

出现这个问题原因是:

汇编源文件再编译以后,函数名称以及变量名称没有做任何的更改,而C++源码在经过C++编译器编译以后,函数名称和变量名称都已经有过变化(可查看编译后的object文件),所以连接的时候会报错。

解决的办法有下列几种:

方法一

将汇编中的函数名称和变量名称都更改为C++编译器编译过的函数名称和变量名称,即?TEST1@@YAHHHHH@Z和?iGlobal@@3HA。注意这种方式在名称前面要加上“|”符号。

;      TITLE("Sample App")
;++
        AREA armtest, CODE, READONLY ; name this block of code

    IMPORT |?iGlobal@@3HA|
    EXPORT |?TEST1@@YAHHHHH@Z|
;
; Called from C as int ARMTEST1(int, int, int, int);
; The first 4 parameters are passed in r0-r3, more parameters would be passed on the stack
;
|?TEST1@@YAHHHHH@Z| proc
    add r0,r0,r1     ; add all of the inputs together
    add r0,r0,r2
    add r0,r0,r3
    ldr r1,=iGlobal;|?iGlobal@@3HA| ; get the value of our global variable
    ldr r1,[r1]   ; dereference the pointer (I know there's a pipe stall here)
    add r0,r0,r1 ; we're not concerned with performance in this example
    mov pc,lr     ; return to C with the value in R0   
    endp

    LTORG      ; allow room for the address constant of our global (loaded relative to PC)
    END

方法二

在C++源程序中声明变量和函数的时候用extern "C"修饰,直接告诉编译器这是C函数。

extern "C"
{

     int iGlobal;
     int TEST1(int, int, int , int);
}

转载于:https://my.oschina.net/tonyyang/blog/15031

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国最险六大寺庙,最后一座至今无人登临

全世界只有3.14 % 的人关注了爆炸吧知识来源&#xff1a;「风景线」佛教远离尘世的特性使得很多寺庙修建于偏僻险要的山野&#xff0c;看似岌岌可危的建筑&#xff0c;却能屹立千百年而不倒&#xff0c;这不得不感叹古人智慧的伟大&#xff0c;这6大险要寺庙&#xff0c;绝对能…

c/c++ code JSON

cJSON 初体验 cJSON是一个超轻巧&#xff0c;携带方便&#xff0c;单文件&#xff0c;简单的可以作为ANSI-C标准的JSON解析器。官网地址 cJSON.c /*Copyright (c) 2009 Dave GamblePermission is hereby granted, free of charge, to any person obtaining a copyof this softw…

第五篇

C#中异常捕获如来完成: Try { 有可能出现错误的代码 } Catch { 写出现错误的代码; } ,-- 又称为自加1 和自减1 以前学的是一元运算符,而自加自减是一元运算符. Int age 18; Age age1; 用自加可写为: Int age 18; Age; Console.WriteLine(“age{0}”,age); 这种写法的效率比较…

Dapr牵手.NET学习笔记:发布-订阅

queue&#xff0c;是很好的削峰填谷工具&#xff0c;在业内也是主流&#xff1b;发布订阅&#xff0c;可以有效的解耦两个应用&#xff0c;所以dapr把他们进行了有效的封装&#xff0c;我们使用起来更简单高效。本篇的案例是下完订单后&#xff0c;会把消息发布到redis&#xf…

Java标签移动_如何使用基于鼠标单击的标签移动特定游戏对象?

我有一个由6个孩子的游戏对象组成的3D模型&#xff0c;我希望能够点击模型的每个部分并使该部分沿某个方向移动然后再次点击它然后返回到它原来的位置 . 我给每个零件都带了一个标签和一个盒子对撞机我打算让它们在我用碰撞器和不同的标签点击物体时移动 . 我看到光线投射有帮助…

sql年月日24小时制_Power Query 抓取气象台24小时降水量数据

我们借鉴之前抓取台风路径数据的例子&#xff0c;试一试抓取降水量数据&#xff1a;之前我们访问过这个网站&#xff0c;也试着抓取过数据&#xff0c;不过在谷歌浏览器中我们只能够找到两天的数据&#xff0c;但是通过台风路径数据抓取&#xff0c;我们猜想只要我们向服务器提…

薅羊毛丨5个平价好物,终于终于终于打折了!

▲ 点击查看大家好&#xff0c;超模全新的固定栏目「薅羊毛」上线了&#xff01;既然是薅羊毛&#xff0c;怎么能空着手来&#xff1f;别看今天是草单&#xff0c;但所有产品都是咱们商务部小哥谈了好久才拿下的团购&#xff0c;而且全都包邮。毕竟好用的好吃的&#xff0c;啥都…

50个Web设计师超便利的工具

作为一个 Web 设计师并不容易&#xff0c;不仅考虑设计与架构&#xff0c;还要时刻注意各种小细节&#xff0c;设计师的工作被各种各样的问题包围&#xff0c;你需要一套超级便利的工具帮你解决各种消耗时间和精力的问题。我爱互联网在这里给您介绍了50个非常强大的工具&#x…

linux之拷贝文件/备份文件;按照原来的权限和日期拷贝.

linux下备份成了问题.虽然有人说 tar gz 之类的,貌似也有类似ghost的软件.ghost对linux的支持没那么好,以前备份linux分区ext4,数据全部没有成功备份. 现在我要将vmware虚拟机中一个硬盘的数据转移到另一个vmware硬盘中,因为他占用了5GB的磁盘空间,却只有2GB文件.比如lfs的时候…

[转载] 三十不立,四十迷惑的人生

冯唐说&#xff1a;世界上有两种长大的方式&#xff0c;一种是明白了&#xff0c;一种是忘记了明白不了的&#xff0c;心中了无牵挂&#xff0c;几乎所有人都是后一种方式长大。而我是不是第三种&#xff1f;没明白&#xff0c;也没忘记明白不了的&#xff0c;所以一直迷茫中&a…

Docker小白到实战之Docker Compose在手,一键足矣

前言Docker可以将应用程序及环境很方便的以容器的形式启动&#xff0c;但当应用程序依赖的服务比较多&#xff0c;或是遇到一个大系统拆分的服务很多时&#xff0c;如果还一个一个的根据镜像启动容器&#xff0c;那就有点累人了&#xff0c;到这有很多小伙伴会说&#xff1a;弄…

Hsiaoyang:Google搜索结果页面分析

Hsiaoyang:Google搜索结果页面分析首先请参看Google官方的“搜索结果页”用户在使用搜索引擎的时候&#xff0c;首先会在搜索框中输入关键词&#xff0c;随后SE会返回一个搜索结果呈现给用户。SEO的主要对象是搜索引擎&#xff0c;而了解搜索引擎对搜索结果的展现对于SEO人员的…

什么是python扩展库_什么是目前比较常用的Python扩展库管理工具

展开全部在Python环境中已经有很多成熟的包&#xff0c;可以通过安装这些包来扩展我们的程序。例如&#xff0c;很32313133353236313431303231363533e4b893e5b19e31333365643464多时候Python开发人员都会去PyPI网站去查找自己想要使用的包&#xff0c;然后进行安装。PyPI ( Pyt…

泰国小哥又双叒叕整活,奇怪的美少女出现了......

最近“文艺复兴”又流行起来了&#xff0c;这一次遭殃的是80和90后的童年偶像——水兵月。在推特“重绘水兵月”的标签下&#xff0c;民间的绘画高手甚至业内的大佬&#xff0c;都以自己的画风&#xff0c;对下面这张出自《美少女战士》的截图进行重绘。下面让我们来欣赏网络上…

USING HAVING

USING 用于表连接时给定连接条件&#xff08;可以理解为简写形式&#xff09;&#xff0c;如 SELECT * FROM table1JOIN table2 ON table1.id table2.id 使用 USING 可以写为 SELECT * FROM table1JOIN table2 USING(id) HAVING 引入 HAVING 是因为 WHERE 无法和统计函数一起使…

ASP.NET Core 中如何通过 AuthorizeAttribute 做自定义验证?

咨询区 jltrem&#xff1a;我想在 ASP.NET Core 中用 authorization 特性实现一个自定义验证&#xff0c;在之前的版本中&#xff0c;我可以用系统提供的 bool AuthorizeCore(HttpContextBase httpContext) 方法&#xff0c;但在这个版本中已经没有该方法了。请问当前我该如何实…

python从random生成列表_详解Python利用random生成一个列表内的随机数

详解Python利用random生成一个列表内的随机数首先,需要导入random模块:import random随机取1-33之间的1个随机数&#xff0c;可能重复:random.choice(range(1,34))print得到一系列随机数,执行一次得到一个随机数:print(random.choice(range(1,34)))随机取1-33之间的6个随机数&a…

DataSet与Xml之间的转换

DataSet转化为Xml&#xff0c;Xml转化为DataSet&#xff0c;Ado.net中使用方法DataSet.WriteXml()和DataSet.ReadXml()&#xff0c;由于有多个重载方法&#xff0c;所以这里有多条路径可以实现&#xff0c;可谓条条大道通罗马。这里我就把所有的用法来尝试下&#xff0c;希望给…

和套套一样,一次性橡胶手套制作现场, 这鬼畜的画风

全世界只有3.14 % 的人关注了爆炸吧知识来源&#xff1a;普象工业设计小站ID&#xff1a;iamdesign如果说套套的制作过程很羞羞那同为乳胶制品的乳胶手套制作过程则可以用魔性甚至惊悚来说走进乳胶手套制作的工厂里迎面而来的是数不清的白色之手不停地在转啊转、甩啊甩这画面不…

Installing OpenCV 2.3.1 in Ubuntu

step1&#xff1a;下载 从http://sourceforge.net/projects/opencvlibrary 下载OpenCV源码&#xff0c;下载文件为OpenCV-2.3.1a.tar.bz2。 cd ~ wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.1/OpenCV-2.3.1a.tar.bz2/download step2&#xff1a;…