以下内容可直接复制到keil5 内,适合初学者食用。
@是单行注释符号
@.text .global .end _start: _stop:
.text @伪操作不占用任何的代码段空间
.global _start @只是告诉编译器代码是如何编译的
_start: @代码起始段
@ mov r0, #0xFF -----> 编译器将指令编译成机器码,放在代码段空间。
@<opcode>{cond}{S} Rd, Rn, oprand2 指令基本语法格式
@<opcode> :指令码,指令的名字
@{cond} :条件码 实现指令有条件的执行
@{S} :状态标志位,加S影响Cpsr的NZCV位,不加不影响
@Rd, :目标寄存器,只能是一个寄存器。
@Rn, :第一个操作寄存器,只能是一个寄存器。
@oprand2 :第二个操作数,可以是一个寄存器/立即数/经过移位操作的寄存器
@ mov r0, #0x12 把r0 赋值为0x12 r0=0x12
@ mvn r2, r1 把r1取反后给r2赋值 r2=~(r1)
@ add r4, r3, r2 r4=r3+r2 结果不影响CPSR的NZCV位
@ adds r4, r3, r2 r4=r3+r2 带S结果影响CPSR的NZCV位(32位以上的运算使用)
@ adc r4, r3, r2 r4=r3+r2+C 带有符号位的加法运算
@ C是CPSR的C位 因为大于32位运算进位了所以要加C
@ sub r4, r3, r2 r4=r3-r2 结果不影响CPSR的NZCV位
@ subs r4, r3, r2 r4=r3-r2 带S结果影响CPSR的NZCV位(32位以上的运算使用)
@ sbc r5, r1, r2 r5=r1-r2-!c 带有符号位的减法运算
@ C是CPSR的C位 因为大于32位运算借位了所以要减去c取反
@ lsl r1, r0, #4 r1=r0<<4 高位移出 低位补0 (无符号左移)
@ lsr r1, r0, #4 r1=r0>>4 低位移出 高位补0 (无符号右移)
@ asr R1, r0, #4 r1=r0>>4 低位移出 高位补符号位 (有符号的右移)
@ ror r1, r0, #4 r1=r0>>4 低位移出 补到符号位 (循环右移)
@ 如果目标寄存器和第一个操作寄存器相同可以就写一个
@ and 按位相与 与0清0 与1不变
@ orr 按位相或 或1置1 或0不变
@ eor 异或1取反 异或0不变
@ bic 按位清除
@ cmp r0, #100 比较r0和100的大小一般和助记符一起使用
@ cmn r1, r2 比较r1 和~r2的大小 搭配助记符使用
@比如:
@ cmp r0, #100
@ addhi r0, r0, r1 如果r0<r1 就做加法运算 r0=r0+r1
@ b 跳转指令 不保存下一条指令的地址到LR寄存器 比如 b stop 不需要返回的跳转
@ bl 需要返回的跳转指令 保存下一条指令的地址到LR寄存器 需要返回时候用BL 比如函数调用
@ msr 特殊寄存器CPSR的写指令 msr cpsr, r0 把r0的值写到cpsr中
@ mrs 特殊寄存器CPSR的读指令 mrs r0, cpsr 把cpsr的值读取到r0中
stop: @代码结束段
b stop
.end
还有一道初学汇编常做的题,就是求1~100之内所有数字的和
以下是代码详解:
.text
.globl _start
_start:
mov r0, #0
mov r1, #1
loop:
cmp r1, #100
bhi stop
add r0,r1
add r1, #1
b loop
stop:
b stop
.end
希望大家喜欢谢谢。