我们做一些操作会有一点麻烦,比方进行一个if then的判断操作。比如要比较a>b,则去调用某个函数,这就要先去比较a,b的值,然后就会跳转,跳转又会比较大小,less than,就是BLLT,然后跳转到loop,我们通过这些来实现if then的操作。循环,先定义一个loop,然后有一些语句跳转到这个语句,然后进行条件判断跳出,然后又进行if then的方式来进行判断。其实这样是很麻烦的。为了方便,引入了相当于宏。c语言里有宏的概念,引入类似于宏的方式,把复杂的有好几天指令进行跳转的完成的小功能级进行新的标签设定,这就是伪指令。
伪指令作用:我们的指令已经可以做各类操作了,但我们操作起来太麻烦了。比如我现在要设置一个值给寄存器R0,但下次我修改了寄存器R0之后又需要读出来刚才的值,那我们就要先临时保存值到SPSR,CPSR,然后不断切换。再比如,我们要做一个循环,就要用label结合BL不断进行,但如果我们要循环很多次。我们就定义了一些类似于带参数的宏的操作一样,来定义我们的伪指令,方便我们更好的实现汇编程序逻辑。伪指令只是在汇编器之前作用,汇编以后翻译为标准的汇编令集。
伪指令的类别伪指令可分为ARM汇编伪指令和GNU汇编伪指令。伪指令又类似于学c语言的时候的预处理,在预处理的时候把它定义于一堆的宏转化为真正的c语言的代码。同样,伪指令是在定义好之后的汇编,汇编的时候会把它翻译成标准指令,也许一条简单的伪指令可以翻译成很多条标准的汇编指令集,所以这就是伪指令最重要的作用。
ARM汇编伪指令是ARM公司的,GNU汇编伪指令是GNU平台的。他们有自己的汇编器,不同的汇编器的解释语法可以设成不同。汇编语言分成两块:标准指令集和非标准指令集。伪指令,我们说了,是类似于宏的东西,是为了简化工作的,所以这种非标准指令集在不同的汇编器下,支持的语法是稍微有点差别的。今天讲解ARM汇编伪指令,在工作中也常常会遇到GNU的。其实都大同小异,无非是GNU的喜欢前面加个点来表示伪指令。操作:这些都是标准指令,这个开始标识,这是一块代码区域,这个不是标准指令,只是告诉我们一个含义,这就是伪指令。同样enter也是伪指令,只是为了标识用的,包括macro,还有这些大家以前没怎么看过的都是伪指令。
现在再看一下GNU伪指令:这个是一个裸板程序,这个裸板程序是点灯的,是板子上控制灯的程序,而且是混合编程的,有c语言和汇编的。来看一下:这个地方.globl,
就是一个伪指令,这个得意思其实是跟刚才入口出是蛮像的。.globl是全局访问的区域段。define也是一个伪指令,去定义一些变量。这个loopl跟之前的是一样的,这里是一个伪指令,后面有一个冒号,所以大家只需简单地做一个转换就行了。 这里start的意思就是start为入口函数,相当于代表了enter加start标签。这里globl的含义是export,对外导出。这两种伪指令是有一定的差别的,今天还是学ARM的标准的汇编伪指令,GNU伪指令都是大同小异的。