简单来说,PC-relatve 是PC相对寻址。与之相反的是绝对寻址(在当前PC所在的region中寻址)

[讨论] 谈谈SH系列的 Delay Slot 延迟槽 和 branch指令

今天在调试SH2A时,CPU很意外的进入了delay slot中断。
对于Delay Slot这个概率,不是很清楚,于是网上搜索了一下资料。

我们可以将Delay Slot翻译为延迟槽。流水线结构的CPU在执行分支branch或者跳转jump指令时,由于此过程时间比较长,需要延迟一下,故可在此段时间内执行下一条指令,这就是branch delay slot的概念。

但如果在延迟槽的时间内执行一条未译码的指令时(也就是该指令来不及译码,延迟槽就结束了),会发生此类中断(SH2A为例)。所以常常可见编译器将高级语言翻译为汇编代码时,插入NOP指令来等待延迟。


先看段代码:(取自 linux 2.6.17 for godson2)

801ea9d4:     02202021     move   a0,s1
801ea9d8:     27a50014     addiu   a1,sp,20
801ea9dc:     0c0ce551     jal   80339544 <pcibios_resource_to_bus>
801ea9e0:     02403021     move   a2,s2
801ea9e4:     8e240010     lw     a0,16(s1)
...

pcibios_resource_to_bus 的原型是:

void __devinit
pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, struct resource *res);

其中,在有HOTPLUG的情况下

__devinit <=> __init <=> __attribute__ ((__section__ (".init.text")))

表示把该 pcibios_resource_to_bus 生成的机器码置于初始化代码节(详细定义于include/linux/init.h)
jal (jump and link) 类似于x86 的 call

回到最上面的汇编码,很明显在调用 pcibios_resource_to_bus 前,先要向 a0, a1, a2 中置入3个参数, 可是我们看到第三个参数居然在 jal 后面!这就是 branch delay slot,从名字猜测应该是跳转延迟,也就是当执行到 jal 这条指令时,延迟一下,把下面的 move 指令执行完后再执行这条 jal 。

一直以来就这样理解,有点困惑,今天特意查了下:(取自维基百科)

Many of these early RISC designs also shared a not-so-nice feature, the branch delay slot. A branch delay slot is an instruction space immediately following a jump or branch. The instruction in this space is executed whether or not the branch is taken (in other words the effect of the branch is delayed). This instruction keeps the ALU of the CPU busy for the extra time normally needed to perform a branch. Nowadays the branch delay slot is considered an unfortunate side effect of a particular strategy for implementing some RISC designs, and modern RISC designs generally do away with it (such as PowerPC, more recent versions of SPARC, and MIPS).

可以看出,上面的 “move a2, s2” 是位于 branch delay slot 中的,应该是跳转类型的指令执行时间相对来说有点长,需要处于 branch delay slot 中的指令,占据 ALU 来赢去跳转类型指令相对多的执行时间。

如果把 “move a2, s2” 移到 jal 指令前,那处于branch delay slot 的就是 “lw a0,16(s1)”, 很明显当CPU执行到"jal 80339544" 时,由于时间稍长,那 “lw a0, 16(s1)” 就会被执行,很明显这将导致传给 pcibios_resource_to_bus 的第一个参数被覆盖.显然这类指令顺序的调整是编译器干的.

【Verilog语法】PC-relatve branch 以及 Delay Slot 的含义相关推荐

  1. 【Verilog语法】分支延迟槽

    参考:MIPS中的跳转/分支指令 关于跳转指令 Branch delay slot 分支延迟槽 第一次看见分支延迟槽是在这里 查了一下解释: 以下内容摘自:MIPS中的分支延迟槽和存储延时槽 在最初的 ...

  2. [转]verilog语法学习心得

    verilog语法学习心得 1.数字电路基础知识: 布尔代数.门级电路的内部晶体管结构.组合逻辑电路分析与设计.触发器.时序逻辑电路分析与设计 2.数字系统的构成: 传感器  AD  数字处理器  D ...

  3. Verilog 语法入门知识

    Verilog 语法入门知识 一.变量类型 ①数值 数值表示采用 <二进制位数>'<数值表示的进制><数值>的结构. 其中进制可以为b.o.d.h分别代表二.八.十 ...

  4. Verilog语法-005—宏定义

    Verilog语法-005-宏定义 1.Verilog宏定义-`ifdef `ifndef `ifdef FOR_FPGA //如果定义了FOR_FPGA宏,则会执行如下 语句/或者没有语句 `els ...

  5. 【系统设计】Verilog语法及示例(2)

    参考Verilog语法 | 教程 (ustc.edu.cn) 1.7 D触发器 D触发器是一个具有记忆功能.具有两个稳定状态的信息存储器件,是构成时序逻辑的最基本逻辑单元.其具有两个稳定状态,即&qu ...

  6. verilog语法学习目录

    verilog语法实例学习(1) Verilog中注释 Verilog代码中的信号 标识符 信号的值 Verilog中的数字 Verilog中的参数 verilog语法实例学习(2) 线网类型 变量类 ...

  7. Verilog语法之运算符

    本文转自知乎罗成的文章Verilog语法之四:运算符 总的文章小白如何快速入门Verilog Verilog HDL语言的运算符范围很广,其运算符按其功能可分为以下几类: 算术运算符(+,-,×,/, ...

  8. Verilog语法和典型电路

    这里写目录标题 Verilog语法知识 Q:锁存器 Q:D触发器 Q:消除毛刺 Q:同步复位和异步复位 Q:边沿检测 Q:握手信号 Q:脉冲展宽(单bit慢采快) Q:二进制与格雷码的转换 Q:二进制 ...

  9. Verilog语法之变量

    本文转自知乎罗成的Verilog语法之三:变量 总的文章链接地址小白如何快速入门Verilog 本文首发于微信公众号"花蚂蚁",想要学习FPGA及Verilog的同学可以关注一下. ...

最新文章

  1. 动态路由选择协议(三)链路状态路由选择协议
  2. linux中用gtk编写的聊天室能运行的,CHAT_ROOM
  3. 我爱Java系列---【 maven依赖版本冲突的解决方法】
  4. 澳大利亚科学家开发出可用于脑机接口的新型碳基生物传感器
  5. 反思各种型格人做事方法
  6. idea取消comiit_IDEA 合并多次commit为一个?
  7. sudo apt-get update
  8. CodeForces: 360(div1)361(div2)
  9. vue学习之二ECMAScript6标准
  10. java aac rtp封装_分享一段H264视频和AAC音频的RTP封包代码
  11. C#求数组中元素的全排列
  12. python display方法_在Python中縮放和顯示圖像的最快方法是什么?
  13. 如何为iPhone 5屏幕分辨率开发或迁移应用程序?
  14. 深度学习2.0-31.CIFAR100与VGG13实战
  15. java 静态方法 非静态变量_深度分析:Java 静态方法/变量,非静态方法/变量的区别,今天一并帮你解决!...
  16. 在线光纤网速测试软件,adsl网速测试(中国移动宽带专用测速软件)
  17. VectorDraw web library javascript Crack
  18. html和css如何制作小球,雨林寒舍 | CSS3制作3D跳动的小球
  19. Java编程笔记6:接口
  20. 服务器摆放需要预留U位么_办公沙发摆放有何讲究?

热门文章

  1. 加拿大达内科技_美股继续暴跌模式 达内教育却“暴走”股价近翻倍
  2. POJ1151(线段树+扫描线求矩形面积并)
  3. 视频码率,帧率和分辨率的区别
  4. delphi中的ParamStr
  5. c++ reference counting引用计数原理
  6. 网页出现不河蟹弹窗?那是被劫持了!
  7. 第07讲:入门首选,Requests 库的基本使用
  8. LeetCode解题的常见模式套路
  9. Robolectric测试框架使用文档
  10. 音视频技术开发周刊 | 197