汇编实验
总阅读次
文章目录
ADS开发环境实验
IDE:ARM Developer Suite v1.2
新建工程
编写代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22AREA takethat,CODE,READONLY ;/*声明一段名为takethat的CODE*/
ENTRY ;/*指定函数的入口*/
START
MOV R0,#0xFF ;/*把#0xFF传送到R0*/
MOV R1,#0xEF000000 ;/*把#0XEF000000传送到R1*/
MOV R2,#0x2F000000 ;/*把#0x2F000000传送到R2*/
MVN R3,#0Xff ;/*把#0xFF取反后传送到R3*/
ADD R4,R2,R1 ;/*把R2加R1的值传送到R4*/
ADDS R5,R2,R1 ;/*把R2加R1的值传送R5,s表示会影响cpsr*/
ADCS R6,R2,R1 ;/*把R2加R1的值,再加上carry的值后传送到R6.
;s表示值会影响cpsr*/
SUB R4,R2,R1 ;/R2减R1的值传送到R4*/
SUBS R4,R2,R1 ;/*R2减R1的值传送到R4, s表示影响cpsr*/
RSB R5,R2,R1 ;/*R1减R2的值传送到R5*/
RSBS R5,R2,R1 ;/*R1减R2的值后传送到R5,
; s表示会影响cpsr*/
SBC R6,R1,R2 ;/*R1减R2的值再减去!CARRY
;后传送到R6*/
RSC R7,R1,R2 ;/*R2减R1的值再减去!CARRY ;后传送到R7*/
stop
BL stop
END ;/*程序结束*/
代码解读:
AREA
语法
- AREA 段名 属性1 属性2
作用 - 用于定义一个代码或数据段
- 短命若以数字开头,则段名需要&nbps;| 括起来,如 |1takethat|
- 属性字段表示该代码段(或数据段)的相关属性,多个属性用都好分隔。
**常见属性如下:
CODE
>定义代码段
DATA
>定义数据段
READONLY
>指定本段为只读,代码段默认为READONLY
READWRITE
>指定本段为可读可写,数据段的默认为READWRITE
COMMON
>定义一个通用的段,不包含任何的用户和数据。各源文件中同名的COMMON段共享一段存储单元.
1 | AREA takethat,CODE,READONLY ;/*声明一段名为takethat的CODE*/ |
ENTRY
语法格式:
ENTRY
作用
ENTRY伪指令用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个ENTRY(也可以有多个,当有多个ENTRY时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个ENTRY(可以没有)。
START
作用:START: 作为汇编程序的一个标号,定义了程序的入口,既程序从START:处开始执行。
若程序的第一条指令就是程序的入口,则START可以缺省。
其中 START 可以用其他字符代替,但是对应的END START中的START也必须用同字符代替。
若第一个START缺省,则END START中的 START 也必须去掉。
MOV
语法格式
MOV source, destination
source 和 destination 的值可以是内存地址,存储在内存中的数据值,指令语句中定义的数据值,或者寄存器。
应该注意的是:
- 目的操作数与源操作数类型要一致;
- 汇编还提供许多mov变体,如:movzx,movsx等等。
作用
传送指令MOV(move)把一个字节、字或双字操作数从原位置传送到目的未知,源操作数的内容不变。
该操作属于复制性质,不属于搬家性质。
MVN
:传送取反值
与MOV不同之处是在传送之前位被反转了,所以把一个被取反的值传送到一个寄存器中
指令 | 说明 | 示例 |
---|---|---|
sub | 2个操作对象**相减 ** |
sub ax,9 给ax减9,之后的结果赋值给ax |
add | 2个操作对象**相加 ** |
ADD R4,R2,R1 把R2加R1的值传送到R4 |