连续压栈
,如:STMFD r1!, {r4 - r11}
,把r4~r11寄存器,压栈,注意r11先入栈
。
连续出栈
,如:LDMFD r1!, {r4 - r11}
,把栈中数据,加载到r4~r11,注意先加载r4
编写汇编文件:test.s
,并导出函数: void stmfd_test(void);
;/* ASM Test */
AREA |.test|, CODE, READONLY, ALIGN=2
THUMB
REQUIRE8
PRESERVE8
;/* void stmfd_test(void); */
stmfd_test PROC
EXPORT stmfd_test
MRS r1, msp ; get from main stack pointer
ldr r4, =0x44444444
ldr r5, =0x55555555
ldr r6, =0x66666666
ldr r7, =0x77777777
ldr r8, =0x88888888
ldr r9, =0x99999999
ldr r10, =0xAAAAAAAA
ldr r11, =0xBBBBBBBB
STMFD r1!, {r4 - r11} ; push r4 - r11 register
ldr r4, =0x44440000
ldr r5, =0x55550000
ldr r6, =0x66660000
ldr r7, =0x77770000
ldr r8, =0x88880000
ldr r9, =0x99990000
ldr r10, =0xAAAA0000
ldr r11, =0xBBBB0000
LDMFD r1!, {r4 - r11} ; pop r4 - r11 register
BX lr
ENDP
ALIGN 4
END
#include <board.h>
#include <drv_common.h>
#include "test.h"
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
hw_board_init();
stmfd_test();
while (1)
{
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET);
HAL_Delay(1000);
}
}
STMFD: Store Multiple Full Descending stacks
STMFD
连续压栈,如:STMFD r1!, {r4 - r11},把r4~r11寄存器压栈,并且会更新 R1 的值. R1 的值是 R1 = R1 - 8 * 4
@whj467467222 上图显示的给出了 在执行指令前后 R1 值的变化.在执行指令之前是
0x20000418
更新之后是0x200003F8
.符合上一个回复提到的计算结果.