嵌入式汇编语言学习经验

发布者:Jinyu521最新更新时间:2018-11-23 来源: eefocus关键字:嵌入式  汇编语言  学习经验 手机看文章 扫描二维码
随时随地手机看文章

最近参与了一个项目,需要用嵌入式汇编写测试程序。汇编程序写过,C程序也写过,但是将它们混合起来写还是第一次,完全没有概念。只能上网找资料,自己慢慢摸索。


自己一直用Windows操作系统,但是我们的项目是在Linux系统上,这两者的汇编语言系统是不同的,windows一直是Intel汇编,而Linux是At&T汇编。为了调试的方便,我决定现在windows中尝试着写点嵌入式汇编,然后再在Linux中写(主要原因是自己对Linux调试不熟悉)。


首先遇到的第一个问题是,格式到底是什么。上网查资料,前篇一律,都是_asm_ _volatile_(…);格式,但是自己弄的时候总是不行,说明网络虽好,但是不可盲目相信。经过多番测试,我发现windows下嵌入式汇编的格式只有_asm关键字,也没有volatile;以前的括号现在也变成大括号,最后也没有引号。我自己写的一个简单测试程序为:


#include


#include


//测试bsf指令


void test()


{


int value,index=32;


_asm {


mov eax,index


bsf ebx,eax


mov value,ebx


}


printf("value is %d/n",value);


}


void main()


{


printf("Hello World/n");


test();


}


Windows嵌入式汇编的特点是:


1. 汇编是Intel汇编,而不是AT&T汇编;


2. 关键字是_asm,而不是其他,这个有可能和自己的环境有关,如果你自己重新定义宏,那就是你自己定义的关键字;


3. 虽说有volatile关键字,但是用上却报错,具体我也不知道怎么用;


4. 没有冒号指定输入输出,要输入和输出的数可以直接在汇编语言中使用;


5. 汇编代码要用大括号包围,而不是小括号,而且最后也没有分号;


6. 如果不用大括号包围,则必须每句汇编代码之前都有_asm关键字。


从上面的叙述中,可以看出貌似windows嵌入式汇编要简单很多。


在windows中搞定之后,就要在Linux中进行测试。我首先做的就是直接复制在windows中的程序到Linux中,很明显自己的无知是要报错的。


有经过多番测试,得到在Linux中执行无误的代码为:


#include


void test()


{


int bsf=0,bsr=0,input=0x12345,flag;


asm volatile ("movl %3,%%eax/n"


"movl %3,%%ebx/n"


"bsf %3,%%cx/n"


"movzwl %%cx,%0/n"


"bsr %3,%%dx/n"


"movzwl %%dx,%1/n"


"pushf/n"


"pop %2/n"


:"=r"(bsf),"=r"(bsr),"=r"(flag)


:"m"(input)


);


printf("bsf value is %d/n",bsf);


printf("bsr value is %d/n",bsr);


printf("flag is %x/n",flag);


}


int main()


{


printf("Hello World/n");


test();


return 0;


}


从结构来看,Linux下的要麻烦不少。首先用的汇编是windows程序员不熟悉的AT&T汇编,而且还要定义输入输出,寄存器用起来还要两个%……总之,比较麻烦。但是我没有贬低Linux的意思,只要用好了,功能还是很强大的。


Linux下嵌入式汇编的特点是:


1. 汇编语言是AT&T,源操作数和目的操作数位置和Intel汇编相反,关于AT&T汇编细节请参考其他文献;


2. 嵌入式汇编的关键字也并不是_asm_ _volatile_,自己摸索出的正确的方式是:asm volatile,这个还是和自己机器的配置有个,如果该关键字不正确,大家可以测试其他类似的关键字,如asm_ ,__asm等,volatile一样;


3. Linux下嵌入式汇编有输入输出和修改标识,放在汇编代码的末尾,用冒号隔开,第一个冒号后是输入参数,格式是”=r”(c语言变量,从汇编代码获得结果到c语言),其中引号中的字母有很多种格式,请参看其它文章,第二个冒号之后是输入,格式是”r”(C语言定义的变量,在汇编语言中应用),字母含义和输出相同;第三个冒号之后表示内存或者某个寄存器会在汇编执行过程中改变,让编译器处理;


4. 由于有输入和输出选项,所以要在汇编代码中用匹配限制符来指代输入输出的值,格式就是%0---9,最多允许有10个输入输出,顺序就是按输出参数,然后输入参数排下来;


5. 因为匹配限制符用到了%,而AT&T汇编的寄存器本身也需要%,为了区别,就需要在寄存器前用两个%,表示寄存器;


6. 汇编语句要用小括号包围,而且最后还要有分号;


7. 如果按上面代码格式,在每一句汇编代码之后都要有”/n”换行符


以上是我写嵌入式汇编的经验,希望对遇到同样问题的朋友有所帮助。


关键字:嵌入式  汇编语言  学习经验 引用地址:嵌入式汇编语言学习经验

上一篇:软件堆栈和硬件堆栈
下一篇:单片机C语言程序设计:INT0 中断计数

推荐阅读最新更新时间:2024-03-16 16:18

嵌入式】从零开始移植U-boot到mini2440(一)——U-boot编译篇
U-boot版本:2020/5/2 编译环境:Ubuntu 16.04 arm-none-eabi-gcc version 4.9.3 20150529 (prerelease) (15:4.9.3+svn231177-1) 运行环境:mini2440(s3c2440,arm920t) 代码仓库:git@github.com:JingyeLi/u-boot_2440.git commit hash:45516b370859b022b9bf2c9fb87318b1fa2d34a3 GitHub上下载最新的u-boot git@github.com:u-boot/u-boot.git 实际上最新的u-boot(好像是从2017年开
[单片机]
基于嵌入式的杯突试验机测控系统设计与实现
引言   杯突试验机是对金属薄板和带材进行延展性试验的专用设备,也是目前国内评定金属材料塑性变形性能的惟一设备,主要用于检验各种金属薄板在试验过程中的塑性 变形性能及有色金属薄板的各项异性。近年来,随着我国科技力量的不断提升,金属材料的生产加工工艺也取得了长足的进步,为了获得新工艺下材料的各项性能, 杯突试验机得到了更加广泛的应用。   目前国内的杯突试验机测控系统大多是以PLC、人机界面和计算机相结合的方式。这种方式主要存在以下缺点:生产成本高、功耗大、试验操作台与计算机终端的分离给操作人员带来了很大的不便。   针对以上缺点,本文将目前日益成熟的嵌入式技术应用到杯突试验机测控系统的改造中,设计了一种基于嵌入式的杯突试验
[单片机]
基于<font color='red'>嵌入式</font>的杯突试验机测控系统设计与实现
凌华:看好嵌入式计算机与网通之高成长市场 积极参与海外大展
2007年10月16日,北京讯 凌华科技台北总公司公布今年一月份至九月份自结营收累计达到4550万美元,整体而论,亚洲市场今年由于受到半导体与光电设备产业采购支出减缓的影响,前三季业绩成长有限,其中以日本与韩国市场分别成长38%、30%,表现较为突出,显示成立海外据点的功效;至于欧洲市场,前三季年增率则达到10%,以CompactPCI产品销售为主,主要应用于交通运输控制系统;而美国市场在前三季也有3%的成长,网通客户订单仍持续出货中。 在第四季,凌华科技将继续积极抢攻海外市场,除了本月(10月17至18日)参与美国的AdvancedTCA Summit,锁定网通应用客户之外,10月24日至10月25日将作为金牌赞助参加在北京举办
[焦点新闻]
医疗电子为嵌入式系统带来大市场和高要求
嵌入式系统是计算机技术、通信技术、半导体技术、微电子技术、语音图像数据传输技术,甚至传感器等先进技术和具体应用对象相结合后的更新换代产品,反映当代最新技术的先进水平。嵌入式系统是当今非常热门的研究领域,在PC市场已趋于稳定的今天,嵌入式系统市场的发展速度却正在加快。    由于医疗仪器设备固有的自身特点和以上提到的最新发展趋势的要求,用于医疗仪器设备的技术和系统也应该与这些特点和要求相适应。嵌入式系统应用于医疗仪器设备,符合发展趋势带来的要求和变化。    医疗仪器领域大量医疗仪器的应用,如心脏起搏器、放射设备及分析监护设备,都需要嵌入式系统的支持。各种化验设备,如肌动电流描记器、离散光度化学分析、分光光度计等,都需要
[医疗电子]
ARM嵌入式汽车节能控制系统
  引言   由于各种原因,公交车总是不断重复加速—减速或停车—再加速的过程。通过加装本节能装置,当汽车需要制动时,在主控单元的控制下,可将汽车行驶时具有的巨大动能通过空气压缩机转化成高压气体的势能并储存起来,从而实现汽车减速或停车。当汽车需要启动或加速时,用储存起来的高压气体势能代替燃油来驱动汽车,从而实现汽车能量的回收再利用,达到节能的效果。同时由于汽车在起动或加速时能耗最大,如果汽车是用燃油驱动,则此时油料燃烧不充分,燃烧效果最差,而且产生的噪音最大。   系统工作原理   本系统主要由三部分组成,即检测部分,控制部分和执行机构。检测部分包括踏板位置传感器、曲轴位置传感器、压缩机活塞位置传感器、汽车运行速度传感器、储气
[汽车电子]
Silicon Labs无线收发器简化无线嵌入式设计
--Si4455收发器和Si4355接收器具有易用性和最佳Sub-GHz无线性能-- 中国,北京 - 2012年7月23日 -高性能模拟与混合信号IC领导厂商Silicon Laboratories (芯科实验室有限公司, NASDAQ: SLAB)今日宣布推出两款新型EZRadio®无线IC,用于简化在成本敏感型嵌入式应用中添加高性能无线连接的过程。新型EZRadio Si4455收发器和Si4355接收器产品在尺寸、性能和低功耗运行上具有市场领先优势,其开发工具也非常易于使用。EZRadio IC非常适合各类无线应用,例如遥控器、汽车遥控钥匙(RKE)、家庭和楼宇自动化、安全和照明控制、无线传感器网络、健康和健身器
[网络通信]
Silicon Labs无线收发器简化无线<font color='red'>嵌入式</font>设计
嵌入式根文件系统(基于arm)
1 根文件系统 嵌入式可以包含多个文件系统,根文件系统是第一个,当linux启动的时候,第一个必须挂载的是根文件系统,若系统不能从指定设备上挂载根文件系统,则系统出错就退出。本文主要分以下两个部分说明根文件系统,第一个是如何制作根文件系统,第二个则是挂载根文件系统到内核。 2 如何建立根文件系统 根文件系统的制作是学习驱动的重要一步,这里我直接把制作根文件系统的框架思维导图贴出来了。我们制作的根文件系统就是按照这个框架来设计。 2.1 创建目录 本文所创建的根文件名称是rootfs,路径是/home/S5-driver/lesson8/rootfs,这个路径在随后的内核配置中用到多次。接下来在rootfs中创建一系列目录,
[单片机]
<font color='red'>嵌入式</font>根文件系统(基于arm)
地理信息系统的嵌入式开发技术
    摘要: 以MapInfo系统和VB5.0为例系统地介绍了使用嵌入式技术开发地理信息系统(GIS)应用软件的方法。     关键词: 地理信息系统  OLE自动化  回应方法  动态数据交换     地理信息系统(GIS)是近年来兴起的一门新兴技术,由于它能够直观有效地利用和表达地理信息数据,满足了信息综合管理和数据服务可视化的需要,因此在地质勘测、城市规划、交通管理、遥控遥测等许多领域获得了普遍应用。目前国内流行的基础GIS软件主要有MapInfo、ARC/INFO、MGE等几种。为支持应用系统的开发,多数通用GIS系统都提供了专用的开发工具和编程语言,但与通用的编程工具如VisvalC++,Visua
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved