AREA Program1, CODE, READONLY
ENTRY
CODE32
;声明其后的代码是32位的ARM指令
ARM_CODE ADR R0, THUMB_CODE+1
伪指令,会被真实的指令所替代
把表达式THUMB_CODE+1的值传送到寄存器R0中
BX R0
跳转指令并进行工作状态转换(从ARM工作状态转换到Thumb工作状态)
不再跳回来的简单跳转,没有返回地址
从ARM工作状态转换到Thumb工作状态要求
BX指令的操作数R0的第0位的值是1
R0的内容是 THUMB_CODE+1(奇数),
R0的第0位变成0后即跳转的目标地址(THUMB_CODE)
其中THUMB_CODE(标号)是Thumb指令MOV R0, #10的地址,是偶数
CODE16
;声明其后的代码是16位的thumb指令
THUMB_CODE MOV R0, #10
MOV R1, #20
ADD R0, R1
; thumb指令, 把R0 <= R0+R1
; ARM指令,ADD R0, R0,R1
B .
END
B . 是单条指令构建的无限循环 等同于:
halt B halt REA Program2, CODE, READONLY
ENTRY
CODE32
START LDR R0 ,= 0x12345678 ;该伪指令访问存储器
; 合法的立即数前有#,LDR伪指令加载的数据没有#
把0x12345678加载到寄存器R0中
0x12345678不是合法的立即数,不能直接出现在指令码中,
而是存放在存储器中(文字池)
LDR R1 ,= 0x30100000
;0x30100000是地址
LDR R2 ,= 0x87654321
STR R2, [R1]
;把R2中的内容存放到地址为0x30100000(R1的内容)
LDR R3, [R1]
;真实指令,读存储器地址为0x30100000(R1的内容)的存储单元
; R3的内容是 0x87654321
AND R3, R3, #0x000000FF
;把8~31位(高3个字节)清零,截取R3的最低字节0~7位
;此时,R3的内容是0x00000021
ADD R0, R0, R3, LSL #2 ;R0+0x21*4,R3不变
; R0 <= 0x12345678 + 0x84
; R0 <= 0x123456FC
STR R0, [R1]
B .
END
AREA ExampleProgram, CODE, READONLY
ENTRY
MAIN MOV R1, #0x10
MOV R2, #0x20
MOV R3, #0x30
LDR SP, =StackUser+29*4
; 设置好堆栈指针
BL SUB1
; 调用子程序SUB1,把返回地址(B . 这条指令的地址)
; 存放到LR中
B .
SUB1 STMFD SP!, {R0-R7,LR} ;满递减堆栈
;保存寄存器的顺序:LR,R7,...,R0
MOV R3, R1 ; 0x10,0x10
MOV R1, R2 ; 0x20,0x20
MOV R2, R3 ; 0x10,0x10
;R1和R2的内容交换,R3是中间暂存
BL DELAY
; 调用子程序DELAY,把返回地址
; (LDMFD SP!, {R0-R7,PC} 的地址)保存在LR中
LDMFD SP!, {R0-R7,PC}
; 恢复寄存器的顺序是R0,...,R7,LR=>PC
; LR=>PC引起处理器跳转到B .指令处执行
;SUB1子程序结束
DELAY MOV R3, #100 ;控制循环次数的循环变量
DELAY_L1 SUBS R3, R3, #1 ;S的作用是设置CPSR的Z位
; 减的结果为0,则设置CPSR[Z]=1
BNE DELAY_L1 ;循环体执行100次
;减的结果不等于0则循环继续,否则退出循环
MOV PC, LR ;跳转到BL DELAY的下一条指令
AREA MyStacks, DATA, READWRITE
StackUser SPACE 30*4
; SPACE伪指令,分配120个字节的存储单元,初始化为0,首地址为StackUser
END
NumCount EQU 0x30003000 ;定义地址常量NumCount,地址0x30003000属于哪个BANK?
AREA ExampleProgram, CODE, READONLY
ENTRY
MAIN LDR R0, =NumCount ;把地址0x30003000加载到R0中
;R0是一个字的地址
MOV R1, #0x000000AB
STR R1, [R0] ;把R1的内容保存到地址为0x30003000
;的字存储单元(4个字节)
LDR R2, [R0] ;R2的内容是0x000000AB
ADD R2, R2, #1 ;R2的内容是0x000000AC
STR R2, [R0] ;把R2的内容保存到地址为0x30003000
HALT B HALT ;单条指令的空操作无限循环
END
实验四 汇编语言程序设计
实验习题(写在实验报告上)
程序1(exp4-p1.s):
1. 指令BX R0的功能是什么?
答:调用地址为THUMB_CODE的Thumb子程序。
2. 指令BX R0的操作数的内容是什么?R0的第0位的值是什么?
该值有何特殊意义?
答:R0 中包含了所调用子程序的入口地址(R0-1)
R0[0]是处理器工作状态切换标志:
1:从ARM工作状态切换到Thumb工作状态
0:从Thumb工作状态切换到ARM工作状态
3. 指令BX和指令B的相同点和区别分别是什么?
程序2(exp4-p2.s):
1. 指令ADD R0, R0, R3, LSL #2执行前后寄存器R0和R3的值分别是什么?
答:执行前R0内容是0x12345678,执行后R0内容是0x123456FC;
寄存器R3在本条指令执行前后内容不变,是0x00000021
2. 程序执行到END的时候,寄存器R0、R1、R2和R3的值是什么?
3. 程序执行到END的时候,
地址为0x30100000的内存单元的值是什么?(指字节)0xFC
地址为0x30100001的内存单元的值是什么? 0x56
地址为0x30100002的内存单元的值是什么? 0x34
地址为0x30100003的内存单元的值是什么? 0x12
按小端存放方式
程序3(exp4-p3.s):
1. 在程序执行BL SUB1之前,R1、R2、R3中寄存的值分别是什么(填写十六进制数据)?
2. 在程序执行完BL SUB1之后,R1、R2、R3中寄存的值分别是什么(填写十六进制数据)?
3. 在执行子程序SUB1时,在执行BL DELAY指令之前,执行MOV R2, R3指令之后,R1、R2、R3中寄存的值是什么(填写十六进制数据)?
4. 写出本程序中的循环结构的代码,该循环结构的循环体执行了多少次?
5. 如果把标号DELAY_L1处的指令SUBS R3, R3, #1改成SUB R3, R3, #1,程序的功能会发生怎样的变化?发生这种变化的原因是什么?
S 设置CPSR 的条件码标志位 NZCV,Z=0时,条件NE成立
6. BL指令和B指令有何异同?
程序4(exp4-p4.s):
1. 程序运行到B HALT指令时,R0中寄存的数据是什么(填写十六进制数据)?
2. 在S3C2410A中,NumCount所指向的存储单元位于( )中。
A. bank5 B. bank6 C. bank7 D. 特殊功能寄存器
3. 把NumCount加载到寄存器R0,能不能用MOV R1, NumCount实现?如果不能请说明原因。
4. 刚执行完(1)处的指令STR R1, [R0]后,地址0x30003000处的字节内容是 。执行完(2)处的指令STR R1, [R0]后,地址0x30003000处的字节内容是 。
5. 已知标号MAIN的值是0x00008000,则(1)处的指令STR R1, [R0]的地址是什么?
6. 指令HALT B HALT的功能是什么? 根据以上内容写个实验小结
最新发布