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

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

嵌入式汇编Windows

首先遇到的第一个问题:格式到底是什么。上网查资料,千篇一律,都是_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嵌入式汇编的特点是:

  • 汇编是Intel汇编,而不是AT&T汇编;

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

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

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

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

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

测试Linux

从上面的叙述中,可以看出貌似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"换行符。

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

↓↓↓↓点击,查看更多新闻

汇编怎么输入_一位过来人的嵌入式汇编语言学习经验相关推荐

  1. 机顶盒ttl无法输入_哪位大神帮帮忙,B860 AV1.1 TTL 无法输入命令

    本帖最后由 wuli小茶 于 2018-1-27 11:10 编辑 求大神帮我下,请问这是什么情况,我想刷机,买了CH340G型号的USB转TTL模块,按教程连接后打开SecureCRT或putty都 ...

  2. 学习Python很难?过来人给你分享学习经验

    最近看到不少人在网上提问,Python难吗?好学吗?我英语不好,能学Python吗--我的回答是:统统不是问题,只要你肯用心去学,并保持时刻学习的态度,没有什么是学不会的,至于就业,你可以根据自身的学 ...

  3. python输入一个三位数、输出它的逆序数_从键盘任意输入一个3位整数

    从键盘任意输入一个3位整数,编程计算并输出它的逆序数 程序哪里错了??为什么输出的是一个长长的负数 编写程序,输入一个3位正整数, www.zhiqu.org     时间: 2020-11-24 # ...

  4. 使用arm混合汇编计算两个64位的和_混合使用C、C++和汇编语之: C、C++ 和 ARM 汇编语言之间的调用...

    12.4C' target='_blank' style='cursor:pointer;color:#D05C38;text-decoration:underline;'>C.C++和ARM汇 ...

  5. 编写一个python程序判断用户输入的8位银行卡_用Python编写的程序,提示用户输入一个由7位数字组成的帐号?...

    我在上一门Python入门课程,但有点困在作业上.任何建议或资源将不胜感激!在 问题是: 用Python编写一个程序,提示用户输入由7位数字组成的帐号.在 从用户处获取该帐号后,验证该帐号是否有效.您 ...

  6. python输入一个三位整数、求逆序数_输入一个三位正整数,要求其输出对应的逆序数...

    针对" 输入一个三位正整数,要求其输出对应的逆序数 "的问题,下面由网络工程师-黎明为您解答: 1.第一步,我们第一要写开头: 2.#include 3.voidmain() 4. ...

  7. Java黑皮书课后题第3章:**3.15(游戏:彩票)修改程序清单3-8,产生三位整数的彩票。程序提示用户输入一个三位整数,然后依照规则判定用户是否赢得奖金

    **3.15(游戏:彩票)修改程序清单3-8,产生三位整数的彩票.程序提示用户输入一个三位整数,然后依照规则判定用户是否赢得奖金 题目 题目概述 破题 代码 题目 题目概述 **3.15(游戏:彩票) ...

  8. Java黑皮书课后题第3章:3.12(回文数字)编写一个程序,提示用户输入一个三位的整数,然后确定它是否是回文数

    3.12(回文数字)编写一个程序,提示用户输入一个三位的整数,然后确定它是否是回文数 题目 题目描述 示例 破题 代码 题目 题目描述 3.12(回文数字)编写一个程序,提示用户输入一个三位的整数,然 ...

  9. 输入一个三位正整数,输出百位数,十位数,个位数

    课本例题 #include<stdio.h> int main() {/*x,bw,sw,gw分别用来存放三位正整数及其百位,十位和个位数*/int x, bw, sw, gw;print ...

最新文章

  1. pc站转手机站的首页(扫二维码)
  2. Oracle RMAN 清除归档日志
  3. 虚拟机VMware安装centos7详细步骤
  4. 2018多校1 hdu6298 6300 6308
  5. Android Lifecycle组件使用
  6. c++ template笔记(1)模板函数
  7. 检查列表中的所有元素在Python中是否相同
  8. KM算法--带权二分匹配
  9. ZooKeeper 会话的秘密
  10. eviews建立时间序列模型_如何用eviews分析时间序列(全面).pdf
  11. Rockchip瑞芯微UART调试指南
  12. 网站被劫持了怎么办?
  13. GraphRNN: Generating Realistic Graphs with Deep Auto-Regressive Models
  14. minigui 交叉编译
  15. 强化学习的学习之路(十)_2021-01-10:K臂老虎机介绍及其Python实现
  16. java标识符规范书写的规则
  17. C++ 对txt文档进行编辑
  18. 图片一键添加水印工具V1.0-免费版
  19. android加速度传感器转为线性速度,如何在android的驱动程序中对加速度传感器的数据进行方向和坐标的转...
  20. hive建表报错FAILED: ParseException line 2:0 Failed to recognize predicate ‘date‘. Failed rule: ‘identifi

热门文章

  1. 如何使用 Kafka、MongoDB 和 Maxwell’s Daemon 构建 SQL 数据库的审计系统
  2. 送给水深火热的 Gopher 们的解药
  3. 二叉树和栈的基本操作
  4. ​冲刺最后一公里——音视频场景下的边缘计算实践
  5. ALHLS:Apple低延迟HLS技术
  6. 使用级联SFU改善媒体质量和规模
  7. FFmpeg代码导读——基础篇
  8. SSH原理与运用(一):远程登录
  9. 区块链技术的五大颠覆性价值
  10. 【PAT甲级 约会】1061 Dating (20 分) C++ 全部AC