最近参加了一个项目,需求用嵌入式汇编写测验程序。汇编程序写过,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嵌入式汇编的特点是:
1. 汇编是Intel汇编,而不是AT&T汇编;
2. 关键字是_asm,而不是其他,这个有或许和自己的环境有关,假如你自己从头界说宏,那便是你自己界说的关键字;
3. 虽然有volatile关键字,可是用上却报错,详细我也不知道怎样用;
4. 没有冒号指定输入输出,要输入和输出的数能够直接在汇编言语中运用;
5. 汇编代码要用大括号围住,而不是小括号,并且最终也没有分号;
6. 假如不必大括号围住,则有必要每句汇编代码之前都有_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”换行符以上是我写嵌入式汇编的经历,期望对遇到相同问题的朋友有所协助。