计算机系统基础知识

基本介绍

计算机系统基础主要是一门针对于计算机底层汇编如何实现的相关知识。想入门计算机类专业的同学可以先从这门课入手,虽然比较难,但他主要针对的是计算机底层,可以更直观的帮助你了解计算机运行的实质。下面罗列出一些简单的知识点,如果感兴趣的同学可以去读《深入理解计算机系统》(CS:APP)

数据的存储、表示和操作

1. 进制数的基本转换和十六进制的表示
首先进制的转换,要学会2、8、10、16进制相互转换,而机器底层主要用的是二进制和十六进制。
2进制转16进制:
例如:1111101101100110101
首先我们将二进制数按每四位从左往右依次隔开,最右边不够四位的话要用0补足,即 0111 1101 1011 0011 0101
接着我们算出每一组数的十进制值为多少,即7 13 11 3 5
最后,按照十六进制的表示,0-9不用改变,10-15用a-f表示就可以了,即7cb35
16进制转2进制:
和2进制转16进制方法相反,先将十六进制数的每一位转成十进制表示法;然后将每一位十进制数转换成四位的二进制数即可

2. 基本操作符
与(&):对应位置都是1才是1
或(|) :对应位置有1就为1
异或(^):不同变1,相同变0
取反(~):1变0,0变1

3.逻辑移位操作
左移(<<):

  • 移除最高位的n位,最低位后面补0

右移(>>):

  1. 无符号数:最低位移除,最高位补0
  2. 有符号数:看最高位是什么,如果最高位是0,移除最低位,最高位补0;如果最高位是1,移除最低位。最高位补1

4.常用数据字节数

这里要注意的是long和pointer型在32位的占4字节;64位是8字节(这也是32位和64位中的一点小区别);而无论什么类型的指针都是8字节
5.大端模式和小端模式
大端模式:低地址放高位字节
小端模式:低地址放低位字节
注:x86用的是小端模式

6.数组的存储
数组在内存中是升序排列。每一项的地址大小主要看数组的类型。
例如: int b[3]
int型是4个字节,假设它的首地址是100,那么数组在内存的储存情况如下
a[0] 100-103
a[1] 104-107
a[2] 108-10B
7.结论
只要是整数,在计算机中以补码形式存储
计算机不会算减法,而是通过用补码的加法来代替的

汇编语言基础

1、基本常用指令

数据传送指令:顾名思义就是将一个东西传入另一个地方去请添加图片描述
栈指令:入栈和出栈
请添加图片描述
算术和逻辑指令
请添加图片描述
控制指令:用来比较两个数,cmp指令一般是用减法形式,通过两个数相减的值是大于0还是小于0来判断大小
请添加图片描述

跳转指令:一般是跟控制指令搭配使用,jmp是无条件跳转
请添加图片描述
2.常用寄存机及其作用
请添加图片描述
3.寻址方式请添加图片描述
寄存器寻址:通过去读寄存器存储的地址来寻址
立即数寻址:如mov $0x3f,%eax
将0x0000003f这个数值装进%rax的低4个字节,%rax高4个字节被自动清0。是否为立即数寻址重点查看有无$符号。
直接寻址:mov 0x6001f0,%rax
将0x6001f0单元为起始地址的内容传送至%rax中。
间接寻址:mov (%rcx),%rax
将%rcx的值作为地址,去该地址处取数据,传送至%rax中。
变址寻址:如mov 0x3c(%rbp),%rax
将%rbp的值 + 0x3c作为地址,将该地址所存储的内容传送至%rax
BIS(有时也叫做BSI寻址):如:
mov 0x4006c8(%rbx, %rcx, 8),%rax
将0x4006c8 + %rbx + %rcx*8 作为地址,将该地址所存储的内容传送至%rax。

符号、链接与ELF

1.符号的概念
“符号”指的是进程(虚拟内存)中始终有效的特殊地址与该地址内容的名字的结合体。也就是说符号是将某一个变量名与“始终有效的”地址对应起来。所以,全局变量名、函数名、任何static型变量名都属于符号;而局部变量名(有时也被称为auto型变量)不属于符号,因为局部变量是放在栈里,不具有恒定地址(每次被创建时位置不确定)。
2.符号的分类
强符号:有函数体的函数名,带初值的全局变量都是强符号。
弱符号:无函数体的函数名,不带初值的全局变量为弱符号。
全局符号:在某一个模块m内被定义,但是除m以外还可以被其他模块所引用符号。例如:非static型函数和非static型全局变量。
外部符号:在某一个模块m中被引用,但是由其他的模块定义的全局符号。
本地符号:在某一个模块m内被定义,但只能在m内部被引用的符号。例如:static型函数和static型全局变量。
3.链接
链接的本质是“合并相同的节”。
链接把若干个可重定位目标文件合并变成可执行目标文件。
链接的两个重要步骤:符号解析(将符号的定义和符号引用之间一一确定对应关系);重定位(调整修改链接前(实际地址无法被确认的)那些调用和引用位置)。重定位是针对符号进行的,局部变量不属于符号,所以不会进行重定位。
4.符号解析规则:
规则 1: 多个(同名的)强符号定义是不被允许的。链接过程会报错。
规则 2: 当一个强符号和多个(同名的)弱符号同时存在时,以强符号为准。
规则 3: 如果有多个(同名的)弱符号定义(无同名强符号),随机选择一个为准。
5.ELF目标文件格式
在这里插入图片描述
ELF 头
Word(数据字)的大小, 字节顺序(模式), 文件类型 (.o, exec, .so), 机器类型, 等等。
段头表
页的大小, 虚拟地址内存段(或节)相关信息,段的大小等。
.代码节
程序代码
.rodata节
只读数据: 跳转表
.data节
被初始化了的全局变量
.bss节
未被初始化的全局变量
“Block Started by Symbol”
“Better Save Space”
有节头但不占用任何空间
.symtab节
符号表
过程/静态变量的名称
节名称和位置(部分位置相关信息)
.rel.text节
.text节的重定位信息
可执行文件的指令中所包含的需要被修改的地址信息
需要被修改的指令(相关信息)
.rel.data节
.data节的重定位信息
合并而成的可执行文件中的那些需要被修改的指针的值。
.debug节
用于符号化调试的信息 (gcc -g)
节头表
每个节的偏移量和大小

6.ELF头(程序的脸)
主要包含内容有:
魔幻数字(magic number),ELF类型(32bit/64bit等),数据表示模式(整数存储方式【一般为2进制补码】,大小端模式信息)OS/ABI(对应的操作系统类型,二进制接口类型),文件类型(可重定位目标文件/可执行目标文件/共享库)机器类型(IA32/x86_64/ARM64等)入口地址(程序的第一条指令的存放位置),段(程序)头表位置,节头表位置

  • 11
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值