加深对ARM汇编中对stmfd和ldmfd的理解
时间:11-10
来源:互联网
点击:
AREASTMFD,CODE,READONLY
ENTRY
CODE32
START
subsp,sp,#4 ;经过此条语句过后,sp的值由原来的0变为了0xfffffffc
movr0,#0x1d ;将0x1d赋值给r0寄存器
movr1,#0x1c;将0x1c赋值给r1寄存器
stmfdsp!,{r0};将r0中的值压入堆栈,压入过程是,由于r0中的值为32位的,首先将sp减去4,将r0中的低八位放入sp这个位置(即fffffff8处放的是0x1d)
第九位到第十六位放入sp+1的地址即(fffffff9处放的是0x00),将第十七位到第二十四位放入sp+2的位置(fffffffa处放的是0x00),将第二十五位到第三十二位放入
sp+3的位置(fffffffb处放的是0x00).
strr1,[sp,#4];将r1中的值压入堆栈,压入过程是,由于r1中的值为32位的,将r0中的低八位放入sp+4(fffffffc处放的是0x1c)这个位置
第九位到第十六位放入sp+5的地址(fffffffd处放的是0x00),将第十七位到第二十四位放入sp+6的位置(fffffffe处放的是0x00),将第二十五位到第三十二位放入
sp+7的位置(ffffffff处放的是0x00).
.
ldmfdsp!,{r2,r3};将堆栈中的内容出栈,出栈过程是,将sp这个位置的值放入r2中的低八位,将sp+1这个位置的值放入r2中的第九
位到第十六位,将sp+2这个位置的值放入r2中的第十七位到第二十四位,将sp+3这个位置的值放入r2中的第二十
五位到第三十二位。(即r2中的值为0x0000001d)将sp+4这个位置的值放入r3中的低八位,将sp+5这个位置的值放入r3中的第九位到第十六位,将sp+6这个位置的值放入r3中的第十七位到第二十四位,将sp+4这个位置的值放入r3中的第二十
五位到第三十二位(即r2中的值为0x0000001c)。同时sp=sp+8。
bSTART
END
ENTRY
CODE32
START
subsp,sp,#4 ;经过此条语句过后,sp的值由原来的0变为了0xfffffffc
movr0,#0x1d ;将0x1d赋值给r0寄存器
movr1,#0x1c;将0x1c赋值给r1寄存器
stmfdsp!,{r0};将r0中的值压入堆栈,压入过程是,由于r0中的值为32位的,首先将sp减去4,将r0中的低八位放入sp这个位置(即fffffff8处放的是0x1d)
第九位到第十六位放入sp+1的地址即(fffffff9处放的是0x00),将第十七位到第二十四位放入sp+2的位置(fffffffa处放的是0x00),将第二十五位到第三十二位放入
sp+3的位置(fffffffb处放的是0x00).
strr1,[sp,#4];将r1中的值压入堆栈,压入过程是,由于r1中的值为32位的,将r0中的低八位放入sp+4(fffffffc处放的是0x1c)这个位置
第九位到第十六位放入sp+5的地址(fffffffd处放的是0x00),将第十七位到第二十四位放入sp+6的位置(fffffffe处放的是0x00),将第二十五位到第三十二位放入
sp+7的位置(ffffffff处放的是0x00).
.
ldmfdsp!,{r2,r3};将堆栈中的内容出栈,出栈过程是,将sp这个位置的值放入r2中的低八位,将sp+1这个位置的值放入r2中的第九
位到第十六位,将sp+2这个位置的值放入r2中的第十七位到第二十四位,将sp+3这个位置的值放入r2中的第二十
五位到第三十二位。(即r2中的值为0x0000001d)将sp+4这个位置的值放入r3中的低八位,将sp+5这个位置的值放入r3中的第九位到第十六位,将sp+6这个位置的值放入r3中的第十七位到第二十四位,将sp+4这个位置的值放入r3中的第二十
五位到第三十二位(即r2中的值为0x0000001c)。同时sp=sp+8。
bSTART
END
ARM汇编stmfdldmf 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)