汇编怎么输入_一位过来人的嵌入式汇编语言学习经验
笔者最近参与了一个项目,需要用嵌入式汇编写测试程序。汇编程序写过,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"换行符。
以上是笔者写嵌入式汇编的经验,希望对遇到同样问题的朋友有所帮助。
↓↓↓↓点击,查看更多新闻
汇编怎么输入_一位过来人的嵌入式汇编语言学习经验相关推荐
- 机顶盒ttl无法输入_哪位大神帮帮忙,B860 AV1.1 TTL 无法输入命令
本帖最后由 wuli小茶 于 2018-1-27 11:10 编辑 求大神帮我下,请问这是什么情况,我想刷机,买了CH340G型号的USB转TTL模块,按教程连接后打开SecureCRT或putty都 ...
- 学习Python很难?过来人给你分享学习经验
最近看到不少人在网上提问,Python难吗?好学吗?我英语不好,能学Python吗--我的回答是:统统不是问题,只要你肯用心去学,并保持时刻学习的态度,没有什么是学不会的,至于就业,你可以根据自身的学 ...
- python输入一个三位数、输出它的逆序数_从键盘任意输入一个3位整数
从键盘任意输入一个3位整数,编程计算并输出它的逆序数 程序哪里错了??为什么输出的是一个长长的负数 编写程序,输入一个3位正整数, www.zhiqu.org 时间: 2020-11-24 # ...
- 使用arm混合汇编计算两个64位的和_混合使用C、C++和汇编语之: C、C++ 和 ARM 汇编语言之间的调用...
12.4C' target='_blank' style='cursor:pointer;color:#D05C38;text-decoration:underline;'>C.C++和ARM汇 ...
- 编写一个python程序判断用户输入的8位银行卡_用Python编写的程序,提示用户输入一个由7位数字组成的帐号?...
我在上一门Python入门课程,但有点困在作业上.任何建议或资源将不胜感激!在 问题是: 用Python编写一个程序,提示用户输入由7位数字组成的帐号.在 从用户处获取该帐号后,验证该帐号是否有效.您 ...
- python输入一个三位整数、求逆序数_输入一个三位正整数,要求其输出对应的逆序数...
针对" 输入一个三位正整数,要求其输出对应的逆序数 "的问题,下面由网络工程师-黎明为您解答: 1.第一步,我们第一要写开头: 2.#include 3.voidmain() 4. ...
- Java黑皮书课后题第3章:**3.15(游戏:彩票)修改程序清单3-8,产生三位整数的彩票。程序提示用户输入一个三位整数,然后依照规则判定用户是否赢得奖金
**3.15(游戏:彩票)修改程序清单3-8,产生三位整数的彩票.程序提示用户输入一个三位整数,然后依照规则判定用户是否赢得奖金 题目 题目概述 破题 代码 题目 题目概述 **3.15(游戏:彩票) ...
- Java黑皮书课后题第3章:3.12(回文数字)编写一个程序,提示用户输入一个三位的整数,然后确定它是否是回文数
3.12(回文数字)编写一个程序,提示用户输入一个三位的整数,然后确定它是否是回文数 题目 题目描述 示例 破题 代码 题目 题目描述 3.12(回文数字)编写一个程序,提示用户输入一个三位的整数,然 ...
- 输入一个三位正整数,输出百位数,十位数,个位数
课本例题 #include<stdio.h> int main() {/*x,bw,sw,gw分别用来存放三位正整数及其百位,十位和个位数*/int x, bw, sw, gw;print ...
最新文章
- pc站转手机站的首页(扫二维码)
- Oracle RMAN 清除归档日志
- 虚拟机VMware安装centos7详细步骤
- 2018多校1 hdu6298 6300 6308
- Android Lifecycle组件使用
- c++ template笔记(1)模板函数
- 检查列表中的所有元素在Python中是否相同
- KM算法--带权二分匹配
- ZooKeeper 会话的秘密
- eviews建立时间序列模型_如何用eviews分析时间序列(全面).pdf
- Rockchip瑞芯微UART调试指南
- 网站被劫持了怎么办?
- GraphRNN: Generating Realistic Graphs with Deep Auto-Regressive Models
- minigui 交叉编译
- 强化学习的学习之路(十)_2021-01-10:K臂老虎机介绍及其Python实现
- java标识符规范书写的规则
- C++ 对txt文档进行编辑
- 图片一键添加水印工具V1.0-免费版
- android加速度传感器转为线性速度,如何在android的驱动程序中对加速度传感器的数据进行方向和坐标的转...
- hive建表报错FAILED: ParseException line 2:0 Failed to recognize predicate ‘date‘. Failed rule: ‘identifi