网站建设开发流程按钮做电子简历的网站
网站建设开发流程按钮,做电子简历的网站,西安包装设计公司,wordpress 小说插件文章目录单寄存器加载存储指令多寄存器加载存储指令栈操作指令ARM中所有的运算都是在通用寄存器中完成的这就需要将需要运算的数据从内存加载到通用寄存器#xff0c;运算完毕后再把运算结果由通用寄存器写回内存 加载指令#xff1a;将数据由内存拿到寄存器存储指令#xf…文章目录单寄存器加载存储指令多寄存器加载存储指令栈操作指令ARM中所有的运算都是在通用寄存器中完成的这就需要将需要运算的数据从内存加载到通用寄存器运算完毕后再把运算结果由通用寄存器写回内存加载指令将数据由内存拿到寄存器存储指令将数据由寄存器写回内存单寄存器加载存储指令mov r0, #0x48000000 ldr r1, [r0] [r0]----r1 str r1, [r0] r1------[r0]ldr{cond} rd, 地址模式 ldr r1, [r0] [r0]----r1 [r0]等价于*p ----------------------------------------- ldr r1, [r0,#0x08] [r00x08]---r1 ldr r1, [r0,r2] [r0r2]-----r1 ldr r1, [r0,r2, lsl #2] [r0r2*4]----r1 ------------------------------------------ ldr r1, [r0,#0x08]! [r00x08]---r1 r0r00x08 ldr r1, [r0,r2]! [r0r2]-----r1 r0r0r2 ldr r1, [r0,r2, lsl #2]! [r0r2*4]----r1 r0r0r2*4 ----------------------------------------------------- ldr r1, [r0], #0x08 [r0]-----r1 r0r00x08 ldr r1, [r0], r2 [r0]-----r1 r0r0r2 ldr r1, [r0], r2, lsl #2 [r0]---r1 r0r0r2*4 ldr{cond}b r1, [r0] 将0x48000000内存中一个字节加载到r1高位补0 ldr{cond}sb r1, [r0] 将0x48000000内存中一个字节加载到r1高位补符号位 ldr{cond}h r1, [r0] 将0x48000000内存中两个字节加载到r1高位补0 ldr{cond}sh r1, [r0] 将0x48000000内存中两个字节加载到r1高位补符号位.text .global _start _start: mov r0, #0x100 ldr r1, [r0] mov r2, #0xfc add r1, r1, r2 str r1, [r0] ldrb r3, [r0] ldrsb r4, [r0] mov r2, #0x80 strb r2, [r0, #1] ldrh r5, [r0] ldrsh r6, [r0] b . .data .space 1024 .end练习将地址0x100开始的连续64字节数据拷贝到地址0x200位置处.text .global _start _start: mov r0, #0x100 mov r1, #16 mov r2, #1 init: str r2, [r0], #0x04 add r2, r2, #1 subs r1, r1, #1 bne init mov r0, #0x100 mov r3, #0x200 mov r1, #16 memcpy: ldr r2, [r0], #4 str r2, [r3], #4 sub r1, r1, #1 cmp r1, #0 bne memcpy b . .data .space 1024 .end多寄存器加载存储指令ldm{cond}XX Rd{!} registers{^} stm{cond}XX Rd{!} registers{^} cond, 可以条件执行 XX:地址模式 默认IA IA, Increment After先操作后增加 IB, Increment Before先增加后操作 DA, Decrement After 先操作后递减 DB, Decrement Before 先递减后操作 !, 更新基址寄存器Rd registers, 寄存器列表 {r0,r2, r4-r8} ^, 指令中使用的寄存器都是用户模式下的寄存器 若特权模式下的ldm指令 且寄存器列表中包含PC寄存器 cpsr spsr 规律编号低的寄存器对应低地址内存单元 编号高的寄存器对应高地址内存单元.text .global _start _start: mov r10, #0x100 mov r0, #0x11 mov r1, #0x22 mov r4, #0x33 stmia r10, {r0,r1,r4} stmib r10, {r0,r1,r4} stmda r10, {r0,r1,r4} stmdb r10, {r0,r1,r4} b . .data .space 1024 .end练习使用多寄存器加载、存储指令将地址0x100开始的连续64字节数据拷贝到地址0x200位置处.text .global _start 将_start声明为全局的 _start: mov r0, #0x100 mov r1, #16 mov r2, #1 init: str r2, [r0], #0x04 add r2, r2, #1 subs r1, r1, #1 bne init mov r0, #0x100 mov r3, #0x200 mov r1, #4 memcpy: ldmia r0!, {r4-r7} stmia r3!, {r4-r7} subs r1, r1, #1 bne memcpy b . .data .space 1024 .end栈操作指令栈操作指令类似于多寄存器加载存储指令ldm{cond}XX SP{!} registers{^} stm{cond}XX SP{!} registers{^} XX, 地址模式 默认EA E, empty A, ascend F, full D, descend EA FA ED FD 满减栈 ARM中默认使用。 push {r0, r3} 等价与 stmfd sp!, {r0,r3} 压栈 pop {r0, r3} 等价与 ldmfd sp!, {r0,r3} 弹栈C语言中局部变量在栈中分配空间voidfunc(void){inta0x123;intb0x456;intc0x789;}intmain(void){func();return0;}arm-linux-gnueabihf-gcc test.c -otest-marm arm-linux-gnueabihf-objdump -Dtest1.asmvim1.asm