汇编

连接脚本,map.lds
SECTIONS
{

/* 机器代码的地址 */

. = 0x0;

/* 4个字节对齐 */

. = ALIGN(4);

/* 代码段 */

.text : { start.o(.text) *(.text)}

. = ALIGN(4);

/* 常量数据段 */

.rodata : { *(.rodata) }

. = ALIGN(4);

/* 初始化数据段 */

.data : { *(.data) }

/* 未初始化数据段 */

. = ALIGN(4);

.bss : { *(.bss) }

}
*********************************
程序各个部分在CPU中的分布
栈(从上到下)
堆(从下到上)
数据段
代码段
**************************
这两个看上去相反了,连接脚本看上去没有栈,其实栈在你的代码段里边,从视频里看出来;
**************************************
应用程序
void niuniu(void)
{
led_init();
uart_init();
int a;
int b=666;
puts("led test ");

while(1)
{
led_on(2);
led_on(4);
delay(10000);
led_off(2);
led_off(4);
delay(10000);
}
}
***********************************
puts("led test ");这里边的led test 字符串是当做常量来处理的,
/* 常量数据段 */

.rodata : { *(.rodata) }

. = ALIGN(4);

在反汇编的语言中看图。
****************************************************************
连接器组织这些连接脚本.lds
**********************************************************************
问:栈段 代码段可以换位么?
可以只是我们有协议。
连接地址必须是4的倍数。
多连接地址改的不是1,则程序不会运行因为程序的运行必须从cpu 0地址开始。
4个字默认对齐,写不写无关。
.text (start.0.*.o必须放到开头)

*****************************************************************8

有录像视频
1 汇编语言与机器语言的关系?
机器语言是01代码,而汇编语言是英文简写,汇编语言机器识别不了,必须转变为机器语言。
2 汇编语言与高级语言的关系?
c语言是面向过程的的高级语言语言,高级语言,结构化,模块化。高级语言的一般的人能用,减少对程序员的要求。汇编还是机器的思考方式,高级语言是人类的思考方式,高级语言先变成汇编语言后变成机器语言。
3 arm-linux-objdump是干什么的?
把操作系统下的可执行的.elf文件(机器语言)变为.dis汇编语言。 这是反汇编。
4 对于led.bin来说,nandflash的前4个字节存的是什么?
ea000006这个东西,目的是为了跳转。
5 对于led.bin来说,cpu启动会从哪里取第一条机器指令,取得是什么?
cpu的启动或者复位后,会跳到地址总线的0地址,我们从地址总线的0地址获得我们需要数据。取得的也是ea000006;
6 我们学习汇编语言的目标是什么?
能读懂,不要求会写。
7 对于led.bin来说,发生中断以后,运行的第一条机器指令是什么,cpu的通过地址总线的什么地址取到的?
放生中断以后会跳到地址总线的18,数据是ea000011,执行这个跳转指令。
8 C++的出现为了减少程序员的工作量。
9 AMD完全兼容inter.
10 c语言程序前面必须有一段程序的引导程序,汇编语言,。
11 nop指令什么也不干,只是占用地址。
12 机器语言32位.
13 .bin 无操作体统下的可执行文件。.elf有操作体统下的可执行文件。
14 nandflash 256m,norflash 2m,
norflash(1) 基于总线,运行速度慢,(2)单位存储量少,对多支持4G(寻址少。总线32位,对多支持4G)
15 程序放到SRAM中,程序重启时,CPU从0地址开始运行。
16 .text代码段
17 地址总线从哪里取。数据总线,取东西(数据);
18 我们的start.s中
系统调用是特权模式,我们的中断实现,是从特权模式到外部中断的转变。
除了用户模式,其他6个都是特权模式。
除了系统模式,其他5个都是异常模式。
irp 外部中断(一般称为中断),FIQ,快速中断。
复位以后进去特权模式.
19 CPU arm920T,芯片S3C2440.
20 37个寄存器,31个通用寄存器,6个状态寄存器。
7个模式,用户模式,快速中断模式,外部中断模式,特权模式,数据访问模式,未定义指令中止模式,系统模式。
1个r0~r7
2个r8
2个r9,
2个r10;
2个r11;
2个r12;
6个r13; 栈指针寄存器;
6个r14; 链接寄存器;
1个r15; 程序计数器;
1个cpsr; 当前程序状态寄存器;
5个spsr; 保存程序状态寄存器;
21

=========================

1 没有4096的地址,最多4095.可是我们的栈定义的时候就是4096,因为我们用的是满递减栈。有图。
2 cpsr不需要入栈,因为有spsr,r0~r12则需要入栈。
3 栈有两个作用,(1)保存arm寄存器。(2)函数调用局部变量。
4 stmfd sp! {r0~r12,lr}
解释stmfd 意思满递减栈,而!的意思是跟新sp,sp=sp-4;lr连接寄存器,特权模式下运行下一条指令。
原sp r3
r2
r1
现sp r0(注意入栈顺序)
5 stmfd 入栈,ldmfd出栈,
6 中断流水线,arm9支持5级,其实支持3流水线,只是在某个特定的步骤情况多,分的步骤多。
arm7 3级流水线,arm95级流水线。
7 ATPES默认执行满递减栈的约定。能实现汇编语言和c语言直接的混用。
8 fp sp的变体,保存sp。
9 push {fd,lr}
add {fp,sp,#4}这两部是惯性的操作,我们不管。

10 ldr____指令 ldr r3,[pc,#28](pc由16进制转化为10进制然后+28,然后加赋给ldr(也可以先转化为16进制在给r3))
____伪指令
11 .word表示4个字节的空间。
12 函数传参,一般用4个以下,r0~r3,如果用的多了,就会用到栈
13 逻辑左移,lsl r2,r0,r2(r0=1,r2=6)1左移6位,给r2.。
14 mvn反转。
15 push{fp}
16 我们所说的程序就是裸机程序。
17

原文地址:https://www.cnblogs.com/coding4/p/5604783.html