基本块的组成部分是啥? (例如分支、目标、入口、出口)

Posted

技术标签:

【中文标题】基本块的组成部分是啥? (例如分支、目标、入口、出口)【英文标题】:What constitutes the parts of a basic block? (e.g. branches, targets, entry, exit)基本块的组成部分是什么? (例如分支、目标、入口、出口) 【发布时间】:2022-01-10 19:24:16 【问题描述】:

以下示例来自Computer Organization and Design: the Hardware/Software Interface: Fifth Edition。在书中,作者将编译 C 代码后生成的 MIPS 代码描述为“基本块”,他们将其定义为

一系列指令 没有分支,除了可能在末尾,并且没有分支目标或分支 标签,但可能在开头除外。

那么,给定以下 C 代码和生成的 MIPS 代码,MIPS 代码的哪一部分是入口、出口、分支或分支目标?这段代码似乎不符合定义,因为循环结束前有一个分支语句。如果有人可以提供基本块的另一个示例,甚至更好的是非示例,这将有助于我理解定义。

while (save[i] == k)
      i += 1;
LOOP:   sll     $t1, $s3, 2
        add     $t1, $t1, $s6
        lw      $t0, 0($t1)
        bne     $t0, $s5, EXIT
        addi    $s3, $s3, 1
        j       LOOP
EXIT:

【问题讨论】:

这可以很容易地优化成一个基本块,在底部使用beq 作为没有其他分支的循环分支。 (就像一个 dowhile() 循环样式,这对于 asm 来说很正常。)您也可以将指针数学优化为指针 increment 所以 lw $t0, ($t1) / add $t1, $t1, 4 / beq $t0, $s5, LOOP .在加载和分支之间进行增量还可以填充加载延迟槽,避免经典 MIPS 流水线的停顿。 【参考方案1】:

如果您了解它们的用途和用途,那就更容易了。它们用于控制流分析。

基本块是一系列指令,在这些指令中,程序的控制既不能分支也不能分支。 IE。执行不能从基本块的中间开始,一旦第一条指令执行完毕,基本块中的所有指令都会被执行。

所以这是你的例子的控制流程图:

LOOP
 |
 |
 |  +---------+
 +->| Block 1 | <---+
    | ------- |     |
    | sll     |     |
    | add     |     |
    | lw      |     |
    | bne     |     |
    +---------+     |
       |            |
 +-----+            |
 |     |            |              
 |     \/           |
 |  +---------+     |
 |  | Block 2 |     |
 |  | ------- |     |
 |  | addi    |     |
 |  | j       |     |
 |  +---------+     |
 |     |            |
 |     +------------+
 |
 \/
EXIT

另外要注意的是,在一个可执行标签中是不存在的。当汇编指令说跳转到标签时,在二进制中它将跳转到该标签下指令的地址。

【讨论】:

以上是关于基本块的组成部分是啥? (例如分支、目标、入口、出口)的主要内容,如果未能解决你的问题,请参考以下文章

引用 JSON 树结构的分支的最佳方法是啥?

我们所说的“分支”到底是啥意思?

C语言的分支语句有哪几种?C语言分支结构的基本形式是啥,区别是啥?

在迷宫中行走所有可能块的算法

网页中的基本元素是啥?

组件的基本概念