条件跳转指令
- 让不占用相同资源的任务同时进行,这也是CPU流水线的初衷。但理想是美好的,现实是骨感的,对于程序来说,指令不只是一个简单的任务,有时候我们需要做判断,来决定要执行的具体任务,这就是分支,在
语言中体现为条件跳转指令。
- 例如我们这里给任务清单加一个,如果烧开水时被烫伤,则直接去医院的特殊任务。
- 特点:一旦触发去医院这个支线,则后面的任务都不用做了,直接跳过。
汇编看 if-else
int func(int x) {
if (x > 0) {
return 1;
} else {
return 2; DWORD PTR -4[rbp], 0
jle .L2
mov eax, 1
jmp .L3
.L2:
mov eax, 2
.L3:
pop rbp
ret
## 归纳得出 if-else 转换成汇编后的固定格式
• if (条件 > 0) { // 大于才执行 A,否则 B
• cmp 条件, 0
• 分支 A;
• } else {
- jle .L2 // 小于等于才跳到 0 码力 |
47 页 |
8.45 MB
| 2 年前 3
0 码力 |
29 页 |
1.54 MB
| 2 年前 3
2. Source-to-Image (S2I) 构建
Source-to-Image (S2I) 是一种用于构建可重复生成的 Docker 格式容器镜像的工具。它通过将应用程序源代码注入容器镜像并汇编新镜像来生成可随时运行的镜像。新镜像融合了基础镜像(构建器)和构建的源代码,并可搭配 buildah run 命令使用。S2I 支持递增构建,可重复利用以前下载的依赖项和过去构建的工件等。
S2I Docker 格式容器镜像,以此利用现有的生态系统。请注意,S2I 目前依靠 tar 来注入应用程序源代码,因此镜像需要能够处理 tar 压缩的内容。|
|---|---|
|速度|使用 S2I 时,汇编过程可以执行大量复杂操作,无需在每一步创建新层,进而能实现快速的流程。此外,可以编写 S2I 脚本来重复利用应用程序镜像的旧版本,而不必在每次运行构建时下载或构建它们。|
|---|---|
|可修 Serial,即新构建将按顺序运行,而不是同时运行。
3 您可以指定导致创建新构建的触发器的列表。
source 部分定义构建的来源。源类型决定主要的输入源,可以是 Git(指向代码库存储位置)、Dockerfile(从内联 Dockerfile 构建)或 Binary(接受二进制有效负载)。可以同时拥有多个源。如需详细信息,请参阅每种源类型的文档。
5 strategy 部分描述用于执行构建的构建策略。您可以在此处指定
0 码力 |
101 页 |
1.12 MB
| 2 年前 3
给Go编译器提交过127个补丁,累计六万余行;
拥有Go官方git仓库提交权限;
全球贡献者排名长期处于前50名;
世界上90%的gopher都用过我写的代码;
编译器的重要性
只有1%的程序员懂汇编语言
汇编语言无法构建大型系统
操作系统内核也需要编译器才能运行起来
编译理论是图灵奖大户,仅次于计算复杂度理论
操作系统有后门,编译器的后门更致命
编译器的难题:任务爆炸
N种语言 *
前端语法分析:Source->AST
’ alt=‘OCR图片’/>
前端语义分析:常量折叠
GOPHER CHINA 2020
中国 上海 / 2020-11.21-22
前端语义分析:内联
func A(a b int) int {
return a * b
}
func B(a, b, c int) int {
return A(a, b) + c
}
return a*b + c
}
GOPHER CHINA 2020
中国 上海 / 2020-11.21-22
’ alt=‘OCR图片’/>
前端语义分析
类型检查
确定变量的作用域
内联
常量折叠/常量传播
闭包分析
逃逸分析
导入 (import/include)
其它
’ alt=‘OCR图片’/>
SSAIR
func ssa(n uint) uint
0 码力 |
36 页 |
1.63 MB
| 1 月前 3
关键字声明生成的 C 程序。安全这个词是指所有的硬件寄存器都应被 push 到硬件堆栈中。
inline
内联约定表示调用者不应该调用过程,而是直接内联其代码。
需注意,Nim 自身并不内联,而是留给 C 编译器,它将生成 __inline 过程,这只是给编译器的提示,编译器则可能忽略,也有可能内联那些没有 inline 的过程。
fastcall
对于不同的 C 编译器其含义不同,有一种是表示 block myBlockName:
stmt1
break myBlockName
stmt2
## 汇编语句
不安全的 asm 语句支持将汇编代码直接嵌入到 Nim 代码中。在汇编代码中引用 Nim 的标识符需要包含在特定字符中,该字符可以在语句的编译指示中指定。默认特定字符是 ' ':
{
"push stackTrace:off 'raiseOverflow'
theEnd:
""
{
pop.
}
}
如果使用 GNU 汇编器,则会自动插入引号和换行符:
替代:
proc addInt(a, b: int): int =
asm ""
"addl %%ecx, %%eax\n"
0 码力 |
127 页 |
7.05 MB
| 1 年前 3
被复制时,只有它的直接部分(第17章)被复制了。
## 不含函数体的函数声明
我们可以使用Go汇编(Go assembly)来实现一个Go函数。Go汇编代码放在后缀为.a的文件中。一个使用Go汇编实现的函数依旧必须在一个*.go文件中声明,但是它的声明必须不能含有函数体。换句话说,一个使用Go汇编实现的函数的声明中只含有它的原型。
## 某些有返回值的函数可以不必返回
如果一个函数有返回值 动,并且此过程可能需要一段不确定的时长才能完成。所以一个不再被使用的内存块的回收时间点(第43章)是不确定的。
一个例子:
import "unsafe"
// 假设此函数不会被内联 (inline)。
// go: noinline
func createInt() *int {
return new(int)
}
func foo() {
p0, y, z 使用模式四:将非类型安全指针值转换为uintptr值并传递给syscall.Syscall函数调用。
通过对上一个使用模式的解释,我们知道像下面这样含有uintptr类型的参数的函数定义是危险的。
// 假设此函数不会被内联。
func DoSomething(addr uintptr) {
// 对处于传递进来的地址处的值进行读写...
}
上面这个函数是危险的原因在于此函数本身不能保证传递进来的地址处的内
0 码力 |
608 页 |
1.08 MB
| 2 年前 3