您的位置 首页 FPGA

嵌入式汇编语言学习经历

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

最近参加了一个项目,需求用嵌入式汇编写测验程序。汇编程序写过,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”换行符以上是我写嵌入式汇编的经历,期望对遇到相同问题的朋友有所协助。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/128574.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部