1、传送CPSR的内容到R013MOV R2,R0 ;指令实现的功能是将寄存器R0的值传送到寄存器R2。14ADD R1,R1,#3 ;指令实现的功能是将R1+3的结果送R1是保存。15ADD R2,R1,R0 ; 指令实现的功能是将以R0中的内容为地址的单元中的值与R1相加,结果送R2保存。16LDR R1,R0+4 ; 指令实现的功能是将R0的内容加4后送R1。17LDR R1,R0+4!指令实现的功能是将R0的内容加4后送R1,然后R0的内容自增4个字节。18AND R0,R0,#3 ;该指令保持R0的0、1位,其余位清零。19B 0x1200 ;跳转到绝对地址0x1200处执行。20CMN
2、 R1,R2 ;指令实现的功能是将寄存器R1的值与寄存器R2的值相加,根据结果设置CPSR的标志位。1、 写一条 ARM 指令,完成操作r1 = r2 * 4MOV R1,R2,LSL #22. 写一条 ARM 指令,完成操作r1 = r2 * 3ADD R1,R2,R2,LSL #13. 初始值R1=23H,R2=0FH执行指令BIC R0, R1,R2,LSL #1后,寄存器R0,R1的值分别是多少? R0=21H,R1=23H 4. 初始值R2=5,R3=9,R4=3,执行指令SUBS R2, R3,R4,LSR #2后,寄存器R2,R3的值分别是多少?R2=9,R3=95. ADDR0
3、, R0, R0, LSL #2;执行结果R0=5*R0ADDR5, R3, R1, LSL #2;R5R3+R1*4SUB R1, R1, R2, LSR # 2 ;R1R1R24,因为R2右移2位相当于R2除以4。LSL # n ;逻辑左移n位(1n31),低端空位补0。LSR # n ;逻辑右移n位(1n32) ,高端空位补06 LDR R2,R3,#0x0C ;前变址, 传数前计算地址; 读取R30x0C地址上的存储单元的内容,放入R2。STR R1,R0,#4!; R04R1,R0=R04,符号“!”表明指令在完成数据传送后应该更新基址寄存器,否则不更新;属于回写前变址。LDR R0
4、,R1,#4 ;后变址: 先进行R1-R0操作然后R1+4-R1,操作完毕后,R1 = R1+4。不需要!号。7. 多寄存器寻址即是一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:LDMIA R1!,R2R7,R12;将R1指向的单元中的数据读出到R2R7、R12中(R1自动增加) LDMIAR0 !,R1,R2,R3,R4R1R0 R2R0+4 R3R0+8 R4R0+12STMIA R0!将寄存器R2R7、R12的值保存到R0指向的存储单元中, (R0自动增加),R1R7将R1R7的数据保存到存储器中。存储指针在保存第一个值之后增加,增
5、长方向为向上增长R0R1R0+4R2R0+8R3R0+12R4R0+16R5R0+20R6R0+24R7R0保持自动增值8. LDR R2,R3,#0x0C读取R30x0C地址上的一个字数据内容,放入R2。属前变址。参看教材第125页。R04R1,R0=R04,符号“!属回写前变址。LDR R1,R0,R3,LSL #1将R0R32地址上的存储单元的内容读出,存入R1。9 写一段 ARM汇编程序:循环累加队列myarray中的所有元素,直到碰上零值元素,结果放在r4中。程序框架如下,补充代码完成上述功能。AREA total, CODE READONLYENTRYstartMOV r4, #0
6、ADR r0, myarray在此补充代码loopLDR r1, r0, #4ADDr4, r4, r1CMPr1, #0BNEloopstopB stopmyarrayDCD 0x11DCD0x22DCD 0x0END10并编写了如下的汇编程序:问:现执行上述程序,请列出R0,R1,R2的最终值,并告知整个程序的功能。R0=1R1=2R2=1功能:对R0和R1分别赋值0,1,在R1为5的条件下循环给R0赋值R0和R1之和,给R1加1,取得RESULT的地址赋值于R2,将R0的值保存在RESULT中11读如下程序test.s:test.c:请列出上述程序执行后R0,R1的值,并说明上述程序的作
7、用。R0=31R1=23test.c调用s_program函数,将54赋值R0,23赋值R1,两者相减后,赋值给R0,R0作为返回值赋值给num,然后输出num。12有如下C语言定义的函数myproint mypro(int a, int b)a=a*b;return (a);请补充完成调用上述函数的汇编程序,实现11与22相乘,并要求将结果保存在地址为0x40001000处:area test3, code, readonlyimport myproentrycode32start mov r0,#11 (1) mov r1,#22 (2) BL mypro (3) Ldr r3,=0x40
8、001000 (4) Str r0,r3 (5) END13程序段如下,实现下面流程图,试补充编写ARM汇编代码。程序段:MOV r2, #15MOV r3, #9补充代码B stop程序:Start: CMP r2,r3 SUBLT r3,r3,r2 SUBGT r2,r2,r3 BNE start14明指令STMIAr8!, r0-r7的操作功能。将R0-R7八个寄存器中的32位数据,存储到R8地址指针为起始地址的内存中,地址的操作方式是先操作、后增加,并更新地址。15汇编程序调用C程序的方法为:首先在汇编程序中使用IMPORT伪指令事先声明将要调用的C语言函数;然后通过BL指令来调用C函
9、数。 (写出注释能把程序写出来,给出程序能将注释写出来)例如在一个C源文件中定义了如下求和函数:int prom(int x,int y) return(x&y);调用prom ()函数的汇编程序结构如下:IMPORT prom ;声明要调用的C函数MOV r0,1MOV r1,2BL prom ;调用C函数prom16 C程序调用汇编子程序的方法为:首先在汇编程序中使用EXPORT伪指令声明被调用的子程序,表示该子程序将在其他文件中被调用;然后在C程序中使用extern关键字声明要调用的汇编子程序为外部函数。例如在一个汇编源文件中定义了如下求和函数:EXPORT prom ;声明prom子程
10、序将被外部函数调用prom ;求与子程序prom AND r0,r0,r1 MOV pc,lr 在一个C程序的main()函数中对prom汇编子程序进行了调用:extern int prom (int x,int y); /声明prom为外部函数void main() int a=1,b=2,c; c= prom (a,b); /调用prom子程序综合编程1、教材第六章关于GPIO的应用,列举了一个I/O管脚控制4个LED发光二极管的例子,但我们实验箱所提供的LED发光二极管位于不同的引脚,它们分别使用 了S3C2410 的 GPC5,GPC6,GPC7,如下图,请修改原程序段以实现三个灯的交
11、替闪烁(注:未用引脚设置为input状态)。(写出注释能把程序写出来,给出程序能将注释写出来)博创经典版LED接线原理图相关寄存器定义:#define rGPCCON (*(volatile unsigned *)0x56000020) #define rGPCDAT (*(volatile unsigned *)0x56000024) #define rGPCUP (*(volatile unsigned *)0x56000028)端口初始化:void port_init(void) rGPCCON = 0x56aa; rGPCUP = 0xff; / GPF所有端口都不加上拉电阻所有LED交替亮灭:void led_on_off(void) int i; rGPCDAT=0; /所有LED全亮 for(i=0;i100000;i+); rGPCDAT=0xE0; /所有
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1