河南金建建设有限公司网站,制作营销网页,江西建设厅网站,创建网站需要哪些步骤一#xff0c;map.lds文件
链接脚本文件
作用#xff1a;给编译器进行使用#xff0c;告诉编译器各个段#xff0c;如何进行分布 /*输出格式#xff1a;32位可执行程序#xff0c;小端对齐*/
OUTPUT_FORMAT(elf32-littlearm, elf32-littlearm,…一map.lds文件
链接脚本文件
作用给编译器进行使用告诉编译器各个段如何进行分布 /*输出格式32位可执行程序小端对齐*/
OUTPUT_FORMAT(elf32-littlearm, elf32-littlearm, elf32-littlearm)
/*OUTPUT_FORMAT(elf32-arm, elf32-arm, elf32-arm)*/
/*输出架构arm架构*/
OUTPUT_ARCH(arm)
/*入口_start*/
ENTRY(_start)
/*段*/
SECTIONS
{. 0x00000000;/*入口地址*/. ALIGN(4);/*4字节对齐*/.text :{./Objects/start.o(.text) /*第一个文件存放start.o文件指定start.o位置*/*(.text) /*其余文件没有要求编译器随便放*/}. ALIGN(4);.rodata : /*只读数据段*/{ *(.rodata) }. ALIGN(4);.data : /*数据段*/{ *(.data) }. ALIGN(4);__bss_start .; .bss : /*.bss段*/{ *(.bss) }__bss_end__ .;
}
二汇编
1.汇编指令编译器将一条编译指令编译生成机器码占用代码段空间
2.伪指令伪指令本身不是一条指令编译器可以将器编译生成多条指令共同完成一条指令功能
3.伪操作指导编译器对代码如何进行编译所有以 . 开头的伪操作伪操作不占用代码段空间 基本格式
opcede{cond}{s}Rd,Rn,#oprand2
opcede指令码
{cond}条件码1加条件码指令有条件执行2不加条件码指令默认无条件执行
{s}:加s影响CPSR寄存器不加s不影响CPSR寄存器
Rd目标寄存器
Rn第一操作寄存器
#oprand2第二操作数 1立即数从判断的数中找到0~0xff之间的数 判断的这个数所有1包含将找到的0~0xff之间的数循环右移偶数位 低位移出补到高位如果能够得到你要判断的那个数说明这个数就是立即数 2寄存器 3有效数将一个数按位取反之后如果这个数为立即数说明这个数为有效数
注意事项
1.{cond}{s}需要连在一起编写
2.Rd,Rn,#oprand2需要用逗号分隔开
3.{cond}{s}和Rd,Rn,#oprand2需要用空格隔开
4.一条汇编指令占用一行并且没有分号不区分大小写
三指令
1.数据操作指令
1.1数据搬移指令 MOV MVN
相当于赋值
指令格式{cond}{s} Rd,#oprand2
mov 将第二操作数进行赋值
mvn 将第二操作数,按位进行取反之后进行赋值
1.2伪指令 LDR
可用于所有数的赋值
格式ldr 寄存器值
1.3移位操作指令 LSR LSR ROR ASR
指令格式{cond}{s} Rd,Rn,#oprand2
lsl逻辑左移 特点无符号数左移高位移出低位补0
lsr逻辑右移 特点无符号数右移低位移出高位补0
ror循环右移 特点低位移出补到高位
asr算数右移 特点低位移出高位补符号位
1.4位运算操作指令 AND ORR EOR BIC
格式{cond}{s} Rd,Rn,#oprand2
and:按位与 与0清0与1不变
orr:按位或 或0不变或1置1
eor:按位异或 异或0不变异或1取反相同为0相异为1
bic:按位清零 第二操作哪一位写1对应位进行清0
1.5算术运算指令 ADD ADC SUB SBC MUL
指令格式{cond}{s} Rd,Rn,#oprand2
add普通加法指令
adc带进位加法指令 CPSR寄存器中C位标志位
sub普通减法指令
sbc带借位减法指令
mul乘法指令 没有第二操作数{cond}{s} Rd,Rn
1.6比较指令 CMP
指令格式{cond} Rn,#oprand2
注意点
1比较指令没有目标寄存器
2比较指令本质做减法运算
3比较指令的执行结果会影响CPSR寄存器的NZCV位并且不需要加s
4比较指令和条件码搭配使用
5前面我们所有学习的指令都是默认无条件执行比较指令有条件指令 2.跳转指令 B BL
指令格式b / bl{cond} 标签 跳转到标签下第一条指令执行
b有去无回不会保存函数返回地址到LR寄存器中
bl有去有回会保存函数返回地址到LR寄存器中
3.特殊功能寄存器指令 MRS MSR
指令格式
mrs{cond} Rn,cpsr 将CPSR寄存器中的值读到Rn目标寄存器中
msr{cond} cpsr,Rn 将Rn寄存器中的值写到CPSR寄存器中
4.内存操作指令
1.单寄存器操作指令 LDR STR
指令格式:
ldr/ldrb/ldrh Rn,[Rm] 将Rm指向内存空间中的数据读到Rn目标寄存器中
str/strb/strh Rn,[Rm] 将Rn寄存器中的值写到Rm指向地址空间中
ldr looad 加载 将内存中值读到寄存器中
str store 写入 将寄存器中的值写到某一块内存空间
r register 4字节
b byte 1字节
h half word 2字节
2.多寄存器操作指令 LDM STM
指令码ldm stm
指令格式
stm{cond} Rm,{寄存器列表} 将寄存器列表中数据写到Rm指向的连续地址空间中
ldm{cond} Rm,{目标寄存器列表} 将Rm指向连续地址空间中内容读到目标寄存器列表中
备注1寄存器列表连续用-分隔开 r1-r5
2寄存器列表不连续用,分隔开 r1,r2,r3,r5
5.栈指针操作指令 SP
栈指针寄存器 sp
满栈栈指针指向这块空间有有效数据
空栈栈指针指向这块空间没有有效数据
增栈栈指针向高地址方向移动
减栈栈指针向低地址方向移动
栈种类
满增栈 满减栈 空增栈 空减栈
满增栈stmfa/ldmfa Full Accending
满减栈stmfd/ldmfd Full Desascending ARM默认采用满减栈
空增栈stmea/ldmea Empty Accending
空减栈stmed/ldmed Empty Desascending
常用满减栈
指令格式例
stmfd sp!,{寄存器列表} 将寄存器列表中数据写入到栈指针指向连续地址空间中
ldmfd sp!,{目标寄存器列表} 将栈指针指向连续地址空间中内容读到目标寄存器列表中