欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux内核中的汇编语言

程序员文章站 2024-02-01 19:01:58
...

Intel 和AT&T

汇编语言源代码主要采用两种语法:AT&T语法和Intel语法,尽管它们都属于第二代语言,但是二者的语法却存在巨大的差异。AT&T汇编语法以%作为所有寄存器名称的前缀,以$作为文字常量(也叫做立即操作数)的前缀。它这样对操作数排序:源操作数位于左边,目的操作数位于右边,使用AT&T语法,GNU汇编器(Gas)和许多其他GNU工具(如gcc和gdb)都使用AT&T语法。

Intel语法与AT&T语法不同,它不需要寄存器和文字前缀,它的操作数排序方式与AT&T语法操作数恰恰相反:源操作数位于右边,目的操作数位于左边,使用Intel语法的汇编器包括微软汇编器(MASM)、Borland的Turbo汇编器(TASM)和Netwide汇编器(NASM).

1、大小写

intel格式的指令使用大写字母,而AT&T格式的使用小写字母。

2、间接寻址语法

intel中基地址使用[],而AT&T使用(),另外处理复杂操作数的语法也不同,intel为segreg:[base+index*scale+disp],而AT&T中为%segreg:disp(base,index,scale)。

3、后缀

AT&T语法中大部分指令操作码的最后一个字母表示操作数大小,b表示byte,w表示word,l表示long。intel中处理内存操作数时也有类似的语法:BYTE PTR, WORD PTR, DWORD PTR

linux的汇编

1、类型.word

#if defined(CONFIG_EVT1)&&!defined(CONFIG_FUSED)
    .word 0x2000
    .word 0x0
    .word 0x0
    .word 0x0
#endif

word相当于int类型,是GNU汇编中的元素,word=32bit=4字节

2、关键字.global

.global就是相当于c语言中的Extern,声明此变量,并且告诉链接器此变量是全局的,外训可以访问。

3、标号

symbol后面加上一个冒号,表示其是一个标号label,类似c语言goto后面的标号。

4、LDR指令

(1)ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。

(2)ldr(load register)指令将内存内容加载入通用寄存器。

(3)str(store register)指令将寄存器内容加入内存空间中。

LDR{条件} 目的寄存器,<存储器地址>

用于从存储器中将一个32位的字数据传送到目的寄存器中。

5、MRS指令

MRS{条件} 通用寄存器,程序状态寄存器(CPSR或SPSR)

6、bic指令

BIC{条件}{S} 目的寄存器,操作数1,操作数2

用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

7、orr指令

orr{条件}{S} 目的寄存器,操作数1,操作数2

用于两个操作数上进行或运算,并把结果放置到目的寄存器中,操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

8、msr指令

msr{条件} 程序寄存器(CPSR或SPSR)_<域>,操作数

msr指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。

9、align

.align {alignment} {,fill}{,max}其中:alignment用于指定对齐方式,可能的取值为2的次幂,缺省为4。fill为填充内容,缺省用0填充。max是填充字节数最大值,如果填充字节数超过max,就不进行对齐。

10、ldm stm

批量数据加载/存储指令

LDM(或STM){条件}{类型} 基址寄存器{!} ,寄存器列表{^}

11、cmp指令

cmp的功能是相当于减法指令,只是不保存结果,cmp指令执行后,将对标志寄存器产生影响,其他相关指令通过识别这些被影响的标志寄存器来得知比较结果。