常用汇编语言语法 | 您所在的位置:网站首页 › 汇编语言基本语句 › 常用汇编语言语法 |
目录 指令及其含义: 指令:LDR(load) 指令:LDR(伪指令) 指令:STR(Srote) 指令:ldm 指令:stm 指令:B 指令:BL 指令:MOV(move) 指令:MOV(move) 指令:sub 指令:add 指令:cmp 指令:bne 指令:MRS 指令:MSR 指令:bic 指令及其含义:① 指令:LDR(load)含义:读内存命令 例子: 指令:LDR R0 ,[R1] --假设R1的值为x 命令解析:读取地址x上的数据(4个字节)保存到R0中。 ② 指令:LDR(伪指令)含义:伪指令(并不存在的指令,最终被解析成真正的汇编指令) 例子: LDR R0,=0x12345678 命令解析:把0x12345678的值赋值给R0 补充:伪指令的含义 一条ARM指令为 32 位 ,其中肯定是由某些字节来表示MOV本身,某一位用来指定使用的寄存器(比如R0),剩下的位就不足32位了,如果我们需要使用命令:MOV R0 ,#0x12345678 ,此时MOV指令剩下的位已经不足32为了,所以这条指令就会出错,所以MOV指令不能写任意值,只能写简单的值(被称为立即数)。 ③ 指令:STR(Srote)含义:写内存命令 例子: 指令:LDR R0 ,[R1] --假设R1的值为x 命令解析: 例子: 指令:STR R0 ,[R1] --假设R1的值为x 命令解析:把R0的值(4字节)写到地址x中去。 ④ 指令:ldm含义:读内存读取数据,然后把读取的数据写入多个寄存器 命令解析: 例子: ldmia sp, {fp, sp, pc} 假设:sp=4080 例子:ia的含义是过后增加(Increment After),就是先读取后增加,而且的顺序的依据是:高编号的寄存器存储在高地址 fp,sp, pc 这三个的寄存器编号分别如下所示(ARM编程手册查看) pc->R15,sp->R13,fp->R11.所以存取的顺序是:fp-sp-pc(与指令顺序无关) 附录: 其他形式简单的描述指令的行为,意思分别是过后增加(Increment After)、预先增加(Increment Before)、过后减少(Decrement After)、预先减少(Decrement Before)。 ⑤ 指令:stm含义:把多个寄存器的值写入内存 例子: 指令:stmdb sp!, {fp, ip, lr, pc} 解析:假设sp=4096,db是预先减少(Decrement Before)的意思,就是先减少后存入sp开始的地址,而且存取的顺序的依据是:高编号的寄存器存储在高地址。fp, ip, lr, pc 这四个的寄存器编号分别如下所示(ARM编程手册查看) pc->R15,lr->R14,ip->R12,fp->R11.所以存取的顺序是:pc-lr-ip-fp(与顺序无关) 存储的大体如下,先减后存入: 提示:sp!的含义代表的是,sp会等于执行完此条语句后的值,比如存入四个寄存器,那么得减掉4次,那么sp=4096-16=4080。 感叹后表示执行完语句后sp的值会被改变. 附录: 其他形式简单的描述指令的行为,意思分别是过后增加(Increment After)、预先增加(Increment Before)、过后减少(Decrement After)、预先减少(Decrement Before)。 ⑥ 指令:B含义:跳转指令 ⑦ 指令:BL含义:跳转到指定指令,把返回地址(下一条指令的地址)保存在lr寄存里边 例子: BL xx aa 解析:命令跳转到xx处执行,且lr寄存器保存aa的地址,以便继续运行 ⑧ 指令:MOV(move)含义:赋值指令 例子1: MOV R0,R1 命令解析:把R1的值赋值给R0 (即为:R0=R1) 例子2: MOV R0,#0x100 命令解析:把0x100赋值给R0 ⑨ 指令:MOV(move)含义:赋值指令 例子1: MOV R0,R1 命令解析:把R1的值赋值给R0 (即为:R0=R1) 例子2: MOV R0,#0x100 命令解析:把0x100赋值给R0 ⑩ 指令:sub含义:减法指令 例子1: 指令:sub ro ,r1,#5 解析:其含义是:r0 = r1 -5; 例子2: 指令:sub ro ,r1,r2 解析:其含义是:r0 = r1 -r2 ⑪ 指令:add含义:加法指令 例子1: 指令:add ro ,r1,#5 解析:其含义是:r0 = r1 + 5; 指令:add ro ,r1,r2 解析:其含义是:r0 = r1 + r2; ⑫ 指令:cmp含义: cmp(compare)指令进行比较两个操作数的大小 例子:例:cmp oprd1,oprd2 其含义为第一个操作减去第二个操作数,但不影响第两个操作数的值,它影响flag的CF,ZF,OF,AF,PF.
若执行指令后:ZF=1,则说明两个数相等,因为zero为1说明结果为0. 当无符号时: 若CF=1,则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1oprd2. 当有符号时: 若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2; 若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1 |
CopyRight 2018-2019 实验室设备网 版权所有 |