基本块的组成部分是啥? (例如分支、目标、入口、出口)
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
另外要注意的是,在一个可执行标签中是不存在的。当汇编指令说跳转到标签时,在二进制中它将跳转到该标签下指令的地址。
【讨论】:
以上是关于基本块的组成部分是啥? (例如分支、目标、入口、出口)的主要内容,如果未能解决你的问题,请参考以下文章