IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【深入理解计算机系统】第三章重点汇总 -> 正文阅读

[C++知识库]【深入理解计算机系统】第三章重点汇总

3.1 程序的机器级表示

现有两个源文件:

main.c 

#include<stdio.h>

void mulstore(long, long, long*);

int main()
{
   long d;
   mulstore(2, 3, &d);
   printf("2 * 3 --> %ld\n", d);
   return 0;
}

long mult2(long a, long b) {
   long s = a * b;
   return s;
}
mstore.c
long mult2(long, long);

void mulstore(long x, long y, long* dest) {
	long t = mult2(x, y);
	*dest = t;
}

执行指令

gcc -Og -o prog main.c mstore.c

其中-o prog表示将main.cmstore.c编译后得到的可执行文件的文件名设置为prog-Og是用来告诉gcc编译器生成符合原始C代码整体结构的机器代码。实际项目中可能会使用-O1-O2(人称吸氧)等编译优化

执行指令

gcc -Og -S mstore.c

将获得mstore.c对应的汇编文件mstore.s

在这里插入图片描述
这其中,以.开头的行都是指导汇编器和链接器工作的伪指令,在查看时可以忽略,得到如下汇编
在这里插入图片描述

其中pushq %rbx表示将寄存器rbx的值压入程序栈进行保存。
这里引入寄存器的北京知识,在Intel x86-64的处理器中包含16个通用目的寄存器:
在这里插入图片描述
这16个寄存器用来存储数据和指针。
其中分为调用者保存寄存器和被调用者保存寄存器
在这里插入图片描述
这里是func_A调用func_B,所以func_A是调用者,func_B是被调用者。因为func_B中修改了寄存器%rbx,而func_A在调用func_B前后也使用了寄存器%rbx,因此需要保证在调用func_B前后,func_A使用%rbx的值应该是一致的。

第一种:在func_A调用func_B前,提前保存%rbx的值,然后再调用结束后再将提前保存的值重恢复到%rbx中,这称为调用者保存。
第二种:在func_B调用%rbx前,先保存%rbx的值,在调用结束后,返回前,再恢复%rbx的值,这称为被调用者保存。

每个寄存器的保存策略不一定相同。

其中调用者寄存器:

%rbx, %rbp, %r12, %r13, %r14, %r15

被调用者寄存器:

%r10, %r11
%rax
%rdi, %rsi, %rdx, %rcx, %r8, %r9

在这里插入图片描述
pushq就是用来保存% rbx的值,在函数返回前,使用popq来恢复%rbx的值。

movq就是将%rdx的值复制到%rbx
这条指令执行后,%rbx的内容和%rdx的内容一致,都是dest指针所指向的内存地址

根据寄存器用法定义
函数multistore的三个参数分别保存在%rdi,%rsi,%rdx

这里的pushq, movq的后缀q都表示数据的大小。早期机器是16位,后来才扩展到32位。Intel用字(word)来表示16位的数据类型,32位的数据类型称为双字,64位的数据类型称为4字。
在这里插入图片描述
其中:
b -> byte
w -> word
l -> long word(double word)
q ->quad word

call mult2@PLT的返回值保存到%rax中。
movq %rax (%rbx) 是指将%rax的值送到%rbx所指向的内存地址处
ret表示函数返回即return

对于从源文件生成机器代码文件
执行gcc -Og -c mstore.c,即可得到机器代码文件mstore.o

借反汇编工具objdump可以将机器代码文件反汇编成汇编文件

objdump -d mstore.o

在这里插入图片描述

3.2 寄存器与数据传送指令

寄存器

这是上述所说的保存寄存器

调用者保存寄存器(Callee Saved)

%rbx, %rbp, %r12, %r13, %r14, %r15

被调用者保存寄存器(Caller Saved)

%r10, %r11 
%rax 保存函数返回值
%rdi, %rsi, %rdx, %rcx, %r8, %r9 传递函数参数

%rsp用于保存程序栈结束位置

指令

操作码

movq, addq, subq, xorq, ret

操作数

  • 立即数(Immediate)
    在AT&T格式的汇编中,立即数以$符号开头,后面跟一个整数,这个整数需要满足标准C语言的定义,如$8
  • 寄存器(Register)
    在64位处理器上,64,32,16,8位的寄存器都可以作为操作数,如%rdx 寄存器带了小括号的情况,表示内存引用,如(%rdx)
  • 内存引用(Memory Reference)
    将内存抽象成一个字节数组,当需要从内存中存取数据时,需要获取目的地址的起始地址addr和数据长度b
mov指令

其中源操作数可以为立即数,寄存器和内存引用,而目的寄存器只能为寄存器或内存引用。同时x86-64位规定,源操作数和目的操作数不能同时为内存引用,因此如果需要将内存地址A的内容赋值给内存地址B,需要进行两次mov操作,第一次mov A register,第二次mov register B

使用movb,movw, movl, movq是与其寄存器的位数对应的,b -> 8, w ->16, l -> 32, q ->64

movq指令的源操作数是立即数时,该立即数只能是32位的补码表示。对该数进行符号位扩展(Signed extended),将64位数传送到目的位置。
当立即数是64位时,使用指令movabsq,该指令的源操作数可以是任意的64位整数,目的操作数只能是寄存器。

当使用movl指令且其目的操作数是寄存器时,会将该寄存器的高4字节设置为全0。x86-64位处理器规定,任何对寄存器生成的32位值的指令都会把该寄存器的高位部分设置为0

当源操作数的数位小于目的操作数,需要进行零扩展或符号位扩展

零扩展
z表示zero零扩展
b, w, l, q分别表示8,16,32,64位
movzbw
movzbl
movzbq
movzwl
movzwq
movl代替了movzlq的功能,所以不需要movzlq

符号位扩展
s表示signed 符号位扩展
b, w, l, q分别表示8,16,32,64位
movsbw
movsbl
movsbq
movswl
movswq
movslq
cltq = movslq %eax, %rax
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-04 13:14:05  更:2022-01-04 13:14:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:49:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码