[ CALL指令有多少种写法 ] 之读书笔记
原文为360的安全专家很久之前的一篇文章,偶然发现后收获不少。特以笔记的形式记录下来, 便于加深理解。
Intel有公开的指令集格式文档,你需要的是第二卷的上半部分,指令集从A到M。这篇文档的难度超出一般人想象,里面有众多晦涩的标识、与硬件紧密相关的介绍,拿到这后,即使直接翻到目录的CALL 指令一节,也不见得能够弄清楚。
深入理解C++中的RVO
## 前言
考虑存在这样一个类如HeavyObject,其拷贝赋值操作比较耗时,通常你在使用函数返回这个类的一个对象时会习惯使用哪一种方式?或者会根据具体场景选择某一种方式?
```c
// style 1
HeavyObject func(Args param);
// style ...
烂尾工程: Java实现的汇编语言编译器
一个半拉子工程, 用Java实现的汇编语言编译器的介绍. 代码中使用中文命名. An unfinished project, an assembler implemented in Java, with naming in Chinese.
go语言如何使用rbp, rsp, 参数如何传递, 为什么go的返回值写在后面
# 为什么go的返回值写在后面
go一直被鼓吹语法比java好, 性能跟c一样. 让我们来看一看go语言各部分对应的二进制指令, 是如何实现的
现在的想法是写个一系列文章, 把go的所有语法的实现方式都分析一遍, 不知道会不会半途而废
### 本文所有的分析方法, 结论都是本人猜测的, 查各种文档太费时间了, 当然不是乱猜, 都是有依据的
先看栈回溯最基本的方法, rbp, r
go string的内部实现
# go string 内部实现
这个string的探索
来来个例子
```
func boo(a int, b int)(int, string){
return a + b, "abcd"
}
```
```
81079 000000000044dfa0 :
81080 44dfa0:>------48 c7 44 24 18 00 00 >--movq $0x0
操作系统的中断处理
/*
define SAVE_ALL
"cld; \n\t"
"pushq %rax; \n\t"
"pushq %rax; \n\t"
"pushq %es, %rax; \n\t"
"pushq %rax; \n\t"
"pushq"
.
一个有趣的过程 movq %rcx, %gs:0x80000000不能通过编译
# movq %rcx, %gs:0x80000000不能通过编译
今天有同事提问, 为什么
```
movq %rcx, %gs:0x7fffffff //可以通过编译
movq %rcx, %gs:0x80000000 //不能通过编译
```
其实就是一个立即数的差别, 应该是无差的, 好吧, 让我们来研究一下
# 第一步
先看一下```movq %rcx, %g
架构师杂谈JVM之JIT
JIT技术是JVM中最重要的核心模块之一。我的课程里本来没有计划这一篇,但因为不断有朋友问起,Java到底是怎么运行的?既然Hotspot是C++写的,那Java是不是可以说运行在C++之上呢?为了澄清这些概念,我才想起来了加了这样一篇文章,算做番外篇吧。
Linux 程序 Linux编译 Linux编译过程的来龙去脉
Linux 程序编译过程的来龙去脉
大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类,一种是编译型语言,例如C,C++,Java,另一种是解释型语言,例如Python、Ruby、MATLAB 、JavaScript。