2019独角兽企业重金招聘Python工程师标准>>>

起动文件

cpu/ralink_soc/start.S

    .set noreorder
默认汇编器处在reorder的模式下,该模式允许汇编器对指令进行重新排序,以避免流水线堵塞并获得更好的性能,在这种模式下,是不允许在代码中插入nop指令的。反之,在noreorder模式下,指令的顺序不会被改变也不会对代码进行任何优化。
    .globl _start .text /*标记代码部分的开始*/_start:RVECENT(reset,0)    /* U-boot entry point */RVECENT(reset,1)    /* software reboot */

RVECENT的定义如下,标记reset入口

#define RVECENT(f,n) \
   b f; nop

  • B跳转指令是代码位置无关的,经过汇编后会替换为当前PC值加(减)一个修正值,不管这条指令是在哪一个地址执行,都能跳转到指定的位置。
  • B只能在当前PC的32M范围内跳转,LDR只能在当前PC的4KB(0xfff范围)跳转。

  • LDR PC,=xxx指令将向PC直接装载一个标号xxx的值,但标号经过编译后将被替换为一个与RO相对应的值,这样无论指令在何处执行都能跳转到一个指定的位置。

#if defined(CONFIG_INCA_IP).word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */.word 0x00000000           /* phase of the flash                    */
#elif defined(CONFIG_PURPLE).word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */.word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */
#elseRVECENT(romReserved,2)
#endif
word expression就是在当前位置放一个word型的值,这个值就是expression
#ifdef CONFIG_PURPLE/* 0xbfc00400 */.word   0xdc870000.word   0xfca70000.word   0x20840008.word   0x20a50008.word   0x20c6ffff.word   0x14c0fffa.word   0x00000000.word   0x03e00008.word   0x00000000.word   0x00000000/* 0xbfc00428 */.word   0xdc870000.word   0xfca70000.word   0x20840008.word   0x20a50008.word   0x20c6ffff.word   0x14c0fffa.word   0x00000000.word   0x03e00008.word   0x00000000.word   0x00000000#endif /* CONFIG_PURPLE */.align 4

.align伪指令:

我们并不是第一次遇到align这个词,回想一下链接脚本一节,关键字ALIGN的作用是在链接时,迫使被修饰的内容对齐。这里的.align与ALIGN关键字意义相同,也能够更新位置计数器的值,使代码对齐到某一边界。但此处需要强调的是,该伪指令针对ARM汇编的用法与其他体系结构稍有不同。例如,在m68k、sparc以及运行有ELF文件格式的x86结构中,.align后边的数字直接代表了要对齐的字节数,比如.align 8表示此处代码会按照8字节边界对齐,而在ARM体系结构下,.align后边的数是以幂的形式出现的,正如代码2-5中那样,.align 2表示此处是以4字节对齐的。

为什么需要字节对齐?计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。为此,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被 4整除的地址上,以此类推。这样,两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。

汇编程序结构框架

汇编源程序代码本质上是文本文件。由数据声明、代码段 两部分组成。程序文件应该以.s结尾,以在Spim软件中进行模拟。

数据声明部分

在源代码中,数据声明部分以 .data开始。声明了在代码中使用的变量的名字。同时,也在主存(RAM)中创建了对应的空间。

程序代码部分

在源代码中,程序代码部分以 .text开始。这部分包含了由指令构成的程序功能代码。

代码以main: 函数开始。main的结束点应该调用exit system call,参见后文有关system call 的介绍。

    or  $1,$0, $0or  $2,$0, $0or  $3,$0, $0or  $4,$0, $0or  $5,$0, $0or  $6,$0, $0or  $7,$0, $0or  $8,$0, $0or  $9,$0, $0or  $10,$0, $0or  $11,$0, $0or  $12,$0, $0or  $13,$0, $0or  $14,$0, $0or  $15,$0, $0or  $16,$0, $0or  $17,$0, $0or  $18,$0, $0or  $19,$0, $0or  $20,$0, $0

or  $des,$src1, $src2即  $des=$src1+$src2

常用MIPS指令集及格式:

http://blog.chinaunix.net/uid-26941022-id-3319288.html

MIPS 指令集(共 31条)

MIPS  指令集(共31条)

助记符

指令格式

示例

示例含义

操作及其解释

Bit #

31..26

25..21

20..16

15..11

10..6

5..0

R-type

op

rs

rt

rd

shamt

func

add

000000

rs

rt

rd

00000

100000

add $1,$2,$3

$1=$2+$3

rd < - rs + rt   ;其中rs=$2,rt=$3, rd=$1

addu

000000

rs

rt

rd

00000

100001

addu $1,$2,$3

$1=$2+$3

rd <- rs + rt   ;其中rs=$2,rt=$3, rd=$1,无符号数

sub

000000

rs

rt

rd

00000

100010

sub $1,$2,$3

$1=$2-$3

rd < - rs - rt   ;其中rs=$2,rt=$3, rd=$1

subu

000000

rs

rt

rd

00000

100011

subu $1,$2,$3

$1=$2-$3

rd < - rs - rt   ;其中rs=$2,rt=$3, rd=$1,无符号数

and

000000

rs

rt

rd

00000

100100

and $1,$2,$3

$1=$2 & $3

rd < - rs & rt   ;其中rs=$2,rt=$3, rd=$1

or

000000

rs

rt

rd

00000

100101

or $1,$2,$3

$1=$2 | $3

rd < - rs | rt   ;其中rs=$2,rt=$3, rd=$1

xor

000000

rs

rt

rd

00000

100110

xor  $1,$2,$3

$1=$2 ^ $3

rd < - rs xor rt   ;其中rs=$2,rt=$3, rd=$1(异或)

nor

000000

rs

rt

rd

00000

100111

nor  $1,$2,$3

$1=~($2 | $3)

rd <- not(rs | rt)   ;其中rs=$2,rt=$3, rd=$1(或非)

slt

000000

rs

rt

rd

00000

101010

slt  $1,$2,$3

if($2<$3) 
  $1=1 else
   $1=0

if (rs < rt) rd=1 else rd=0 ;其中rs=$2,rt=$3, rd=$1

sltu

000000

rs

rt

rd

00000

101011

sltu $1,$2,$3

if($2<$3) 
  $1=1 else
   $1=0

if (rs < rt) rd=1 else rd=0 ;其中rs=$2,rt=$3, rd=$1
  (无符号数)

sll

000000

00000

rt

rd

shamt

000000

sll $1,$2,10

$1=$2<<10

rd < - rt << shamt  ;shamt存放移位的位数,
  也就是指令中的立即数,其中rt=$2, rd=$1

srl

000000

00000

rt

rd

shamt

000010

srl  $1,$2,10

$1=$2>>10

rd < - rt >> shamt ;(logical) ,其中rt=$2, rd=$1

sra

000000

00000

rt

rd

shamt

000011

sra $1,$2,10

$1=$2>>10

rd < - rt >> shamt  ;(arithmetic) 注意符号位保留
 其中rt=$2, rd=$1

sllv

000000

rs

rt

rd

00000

000100

sllv $1,$2,$3

$1=$2<<$3

rd < - rt << rs  ;其中rs=$3,rt=$2, rd=$1

srlv

000000

rs

rt

rd

00000

000110

srlv $1,$2,$3

$1=$2>>$3

rd < - rt >> rs  ;(logical)其中rs=$3,rt=$2, rd=$1

srav

000000

rs

rt

rd

00000

000111

srav $1,$2,$3

$1=$2>>$3

rd < - rt >> rs  ;(arithmetic) 注意符号位保留
 其中rs=$3,rt=$2, rd=$1

jr

000000

rs

00000

00000

00000

001000

jr $31

goto $31

PC <- rs

I-type

op

rs

rt

immediate

addi

001000

rs

rt

immediate

addi $1,$2,100

$1=$2+100

rt < - rs + (sign-extend)immediate ;其中rt=$1,rs=$2

addiu

001001

rs

rt

immediate

addiu $1,$2,100

$1=$2+100

rt < - rs + (zero-extend)immediate ;其中rt=$1,rs=$2

andi

001100

rs

rt

immediate

andi $1,$2,10

$1=$2 & 10

rt < - rs & (zero-extend)immediate ;其中rt=$1,rs=$2

ori

001101

rs

rt

immediate

andi $1,$2,10

$1=$2 | 10

rt < - rs | (zero-extend)immediate ;其中rt=$1,rs=$2

xori

001110

rs

rt

immediate

andi $1,$2,10

$1=$2 ^ 10

rt <- rs xor (zero-extend)immediate ;其中rt=$1,rs=$2

lui

001111

00000

rt

immediate

lui $1,100

$1=100*65536

rt <- immediate*65536 ;将16位立即数放到目标寄存器高16
         位,目标寄存器的 低16位填0

lw

100011

rs

rt

immediate

lw $1,10($2)

$1=memory[$2
 +10]

rt < - memory[rs + (sign-extend)immediate] ;rt=$1,rs=$2

sw

101011

rs

rt

immediate

sw $1,10($2)

memory[$2+10]
 =$1

memory[rs + (sign-extend)immediate] <- rt ;rt=$1,rs=$2

beq

000100

rs

rt

immediate

beq $1,$2,10

if($1==$2) 
 goto PC+4+40

if (rs == rt) PC <- PC+4 + (sign-extend)immediate<<2

bne

000101

rs

rt

immediate

bne $1,$2,10

if($1!=$2)
 goto PC+4+40

if (rs != rt) PC <- PC+4 + (sign-extend)immediate<<2

slti

001010

rs

rt

immediate

slti $1,$2,10

if($2<10) 
  $1=1 else
   $1=0

if (rs <(sign-extend)immediate) rt=1 else rt=0 ;
    其中rs=$2,rt=$1

sltiu

001011

rs

rt

immediate

sltiu $1,$2,10

if($2<10) 
  $1=1 else
   $1=0

if (rs <(zero-extend)immediate) rt=1 else rt=0 ;
   其中rs=$2,rt=$1

J-type

op

address

j

000010

address

j 10000

goto 10000

PC < - (PC+4)[31..28],address,0,0   ;address=10000/4

jal

000011

address

jal 10000

$31<-PC+4;
 goto 10000

$31<-PC+4;PC < - (PC+4)[31..28],address,0,0
   ;address=10000/4

注 意:因为MIPS16只有16个16位的寄存器,所以JAL指令中$31改成$15,  所有立即数均无需扩展,LUI指令直接就是将立即数付给RT寄存器。

转载于:https://my.oschina.net/yuyang/blog/287010

Ralink-Uboot学习相关推荐

  1. UBOOT学习1——UBOOT移植流程

    UBOOT学习1--UBOOT移植流程 1.创建板级目录 在board/ 目录下创建目录更改文件(使用imx6ull) (1)创建板级.c文件 (2)更改镜像配置文件imximage.cfg 2.创建 ...

  2. uboot和系统移植-第1部分-2.1 uboot学习前传

    uboot和系统移植-第1部分-2.1 uboot学习前传 第一部分.章节目录 2.1.1. 为什么要有uboot (1)uboot最主要作用是用来启动操作系统内核.因为操作系统内核本身不能自己启动自 ...

  3. OK6410开发板Uboot学习总结----(三)从SD卡启动分析

    前面讲了Uboot启动流程和如何修改调试串口,相信大家对Uboot已经有了初步的了解,今天来进行更深一点的分析.上篇文章 OK6410开发板Uboot学习总结----(二)修改调试打印串口 遗留一个问 ...

  4. f1c100s入坑笔记(4)-uboot学习stepbystep-1

    一. 分析uboot之前先简单学习一下Lin参考下的汇编指令,参考 http://blog.sina.com.cn/s/blog_59b189220100au1k.html 1. Linux汇编与wi ...

  5. Uboot和系统移植----------(1)uboot学习前传

    Author: 想文艺一点的程序员 自动化专业 工科男 再坚持一点,再自律一点 CSDN@想文艺一点的程序员 来自朱有鹏嵌入式的学习笔记 文章目录 一.为什么要有uboot 1.计算机系统的主要部件 ...

  6. U-BOOT学习之2014.4版Uboot启动流程分析

    一.前言 老大给我布置了一个任务:某某项目uboot开发之usb增强ic驱动. 不知道大家看到这个任务懵不懵,反正我最开始是蒙的.后来又问了一下,才明白到底要做啥. 任务是这样的:因为这个项目的usb ...

  7. uboot学习预备知识

    为什么要有uboot 计算机系统的主要部件 (1)计算机系统就是有CPU来做核心进行运行的系统.典型的计算机系统有:PC机(台式机+笔记本).嵌入式设备(手机.平板电脑.游戏机).单片机(家用电器像电 ...

  8. 1 uboot学习前传

    2.1.1.为什么要有uboot 2.1.1.1.计算机系统的主要部件 (1)计算机系统就是有CPU来做核心进行运行的系统.典型的计算机系统有:PC机(台式机+笔记本).嵌入式设备(手机.平板电脑.游 ...

  9. uboot学习 0.1

    1.为什么要有uboot uboot的使用,和相关应用 环境变量和命令得连接 ddr和flash如何使用Uboot来管理, Uboot是如何来引导操作系统的? uboot是来启动操作系统内核的,操作系 ...

  10. uboot学习之BL3的流程

    BL2的最后通过汇编调用了board_init_r函数,此时进入BL3的阶段,此时的主要工作: 这一阶段涉及的文件及任务如下 arch/arm/lib/board.c            1. bo ...

最新文章

  1. SQL优化的一些知识
  2. C#教程01:关于C#
  3. 显示部分数据标签_长春市农贸市场监测数据显示:粮油和水果价格平稳,部分副食品价格小幅波动...
  4. 上厕所时间超长也能被开除?法院:超出正常生理需求范围!
  5. [.net基础]访问修饰符
  6. Uniapp 微信小程序登陆页面
  7. wps2005导致图标全无解决方案
  8. 我的世界java版版本号_我的世界JAVA版1.17版本内容预览
  9. 科研入门必备知识之论文种类--Journal、magazine、transactions、proceedings
  10. Error: rendered manifests contain a resource that already exists.
  11. 泰坦尼克号Python数据分析
  12. 创建一个8*8的国际象棋棋盘(黑块为0,白块为1)
  13. C. NEKO's Maze Game
  14. Java集成流行的打印插件lodop
  15. 【爬树合集】难啃的骨头——红黑树
  16. Mysql聚簇索引和非聚簇索引原理(数据库)
  17. 数据结构-----引论
  18. Incaseformat 蠕虫病毒威胁通告
  19. 南邮《算法分析与设计A》2018-2019学年第一学期期末考试回忆
  20. 【资源下载】动手为王 - 整合迁移与数据恢复实践

热门文章

  1. 你见过1-bit CPU吗?
  2. 程序员求职跳槽攻略,太全了
  3. 次时代游戏场景设计,这些3D游戏建模带你走上次时代巅峰
  4. 了解4-20mA信号
  5. 四、Zabbix监控-SNMP方式监控网络设备、服务器
  6. 北京招聘J2EE Web开发工程师和网页设计师
  7. 【渝粤教育】电大中专电子商务网站建设与维护 (16)作业 题库
  8. 庆祝打破“看电影-丢东西”模式
  9. js 实时显示不同时区时间
  10. 触摸屏软件下载v2.4