目录
一、汇编基本语法
1、汇编指令的最典型书写模式
二、常用汇编指令
1、push压栈指令
2、pop出栈指令
3、sub指令
4、add指令
5、movs数据传输指令
6、str指令
7、ldr指令
8、bl指令
9、MOVW指令
10、MOVT指令
三、代码分析
1、代码段1
一、汇编基本语法
1、汇编指令的最典型书写模式
标号
操作码 操作数 1, 操作数 2, … ;注释。
标号:是可选的,如果有,它必须顶格写。标号的作用是让汇编器来计算程序转移
的地址。
操作码:操作码是指令的助记符,它的前面必须有至少一个空白符,通常使用一个“Tab”键来
产生。
操作数:一般跟在操作码后面,一个操作码后可以跟多个操作数。
注释:;是注释符号 类似C语言的 “//” 和 “/*” 。
二、常用汇编指令
1、push压栈指令
把若干寄存器的值压入堆栈中。
示例:
push {r7};将寄存器R7的值压入栈中。
push {r7, lr};将寄存器R7和LR的值压入栈中。
2、pop出栈指令
从堆栈中弹出若干的寄存器的值。
示例:
pop {r7}; 将栈顶的值弹出到R7寄存器中。
pop {r7, pc};将栈顶的两个值弹出到R7和PC寄存器中。
3、sub指令
减法指令。有以下多种用法:
SUB Rd, Rn ;同C语言 Rd -= Rn; //Rd减去Rn并将结果保存到Rd。
SUB Rd, Rn, #imm3 ;同C语言 Rd = Rn-imm3; //Rn减去立即数imm3并将结果保存到Rd。
SUB Rd, #imm8 ;同C语言 Rd -= imm8; //Rd减去立即数imm8并将结果保存到Rd。
SUB Rd, Rn, Rm ;同C语言 Rd = Rn-Rm; //Rn减去Rm并将结果保存到Rd。
示例:
sub sp, sp, #16; sp寄存器中的值减去立即数16,将结果赋值到sp寄存器中。表示栈向下生长。
4、add指令
加法指令。有以下多种用法:
ADD Rd, Rn, Rm ;同C语言 Rd = Rn+Rm;Rn加上Rm并将结果保存到Rd。
ADD Rd, Rm ;同C语言 Rd += Rm;Rd加上Rm并将结果保存到Rd。
ADD Rd, #imm ;同C语言 Rd += imm;Rd加上立即数imm并将结果保存到Rd。
示例:
add r7, sp, #0; sp寄存器的值加零,将结果保存到寄存器R7。
5、movs数据传输指令
movs r0, #10;将立即数10保存到寄存器R0。
6、str指令
把一个寄存器按字存储到存储器中。把CPU内部寄存器的数据写出到外部RAM等存储器。
STR R0,[R1,#12] ;将R0中的字数据写入以R1+12为地址的存储器中。
7、ldr指令
从存储器读取数据到寄存器中。从RAM等存储器读取数据到CPU的寄存器中。
ldr r2, [r7, #12]; 从以R1+12为地址的存储器中读取数据到R2寄存器。
8、bl指令
转移并连接。用于呼叫一个子程序,返回地址被存储在 LR 中。对应C语言的函数调用。
BL Putc;调用值程序Putc,Putc为子程序的入口地址。
9、MOVW指令
将16位立即数传送到寄存器的低半字[15:0]中,并将高半字[31:16]清零。
10、MOVT指令
将16位立即数传送到寄存器的高半字[31:16]中。
三、代码分析
1、代码段1
int a = 0;
int b = 1;
int c = a + b;