基本概念
机器语言
机器语言: 机器语言是一种数字语言,专门设计成能够被计算机处理器(Cpu)理解。
汇编语言
汇编语言: 包含用助记符书写的语句,汇编语言不是可移植的
可移植性: 一种语言,如果它的源程序能够在各种各样的计算机系统中进行编译和运行,那么这种语言是被称为可移植得 。
汇编语言和机器语言是一对一的关系:每一条汇编语言指令对应一条机器语言指令
汇编语言的规则: 大多数汇编语言规则都是以目标处理器及其机器语言的物理局限性为基础的。例如,Cpu要求两个指令操作数的大小相同。与C++或者Java相比,汇编语言的规则较少,因为汇编语言是以限制底层数据访问为代价的,而高级语言是用语法规则来减少意外的逻辑错误。
虚拟机
虚拟机概念是一种说明计算机硬件和软件关系的有效方法
通俗的说,虚拟机就是把高级语言翻译成对应的设备的低级语言
简单的练习
#include<iostream>
using namespace std;
int f(const char *p)
{
int n = 0;
for (int i = 15; i >= 0; i--)
{
n = n + (pow(2, i))*(p[15-i]-'0');
}
return n;
}
void test01()
{
const char *p = "1111111111111111";
cout << f(p) << endl;
}
char * f2(int n)
{
char *s;
int a[16];
int i = 0;
int j;
while (n)
{
a[i] = n % 2;
n = n / 2;
i++;
}
int len = i;
s = (char *)malloc(len);
for (i = len - 1,j = 0; i >= 0; i--,j++)
{
s[j] = a[i]+'0';
}
s[j] = '\0';
return s;
}
void test02()
{
int n = 65535;
cout << f2(n) << endl;
}
int main()
{
// test01();
test02();
system("pause");
return 0;
}
以上是一些简单的基础概念,数值和字符的编码以及运算在这里就不详细赘述了,那块内容我会在计算机组成原理中的笔记中详细说明。
x86处理器架构
简单的概念
CPU: 中央处理单元是进行算术和逻辑操作的部件。
算术逻辑单元(ALU): 执行算术运算以及逻辑运算 。
控制单元: 协调参与机器指令执行的步骤序列。
CPU通过主板上CPU插座的引脚与其他部分相连,大部分引脚连接的是数据总线、控制总线和地址总线。内存存储单元用于在程序运行时保存指令与数据。因为所有的数据都是在CPU内执行,所以保存在内存中的程序在执行前需要被复制到CPU中。
总线是一组并行线,用来将数据从一个部分传送到另一个部分。计算机系统通常包括四类总线:数据总线、I/O总线、控制总线和地址总线。
指令的执行周期
通常将指令执行周期简化为3个步骤:取值,译码和执行。
接下来详细总结:
CPU在执行一条机器指令的时候,需要经过一系列预先定义好的步骤,这些步骤被称为指令执行周期。
假设现在指令指针寄存器已经有了要执行指令的地址,下面是执行步骤:
- CPU从被称为指令队列的内存区域取得指令,之后立即增加指令指针的值。
- CPU对指令的二进制位模式进行译码。这种位模式可能会表示该指令有操作数
- 如果有操作数,CPU就从寄存器和内存中取得操作数。有的时候,可能还需要地址计算。
- 使用第三步得到的操作数,CPU执行该指令。同时更新部分状态标志位。
- 如果输出操作数也是该指令的一部分,则CPU还需要存放其执行结果。
内存
计算机从内存读取数据比从内部寄存器读取速度要慢好多,由于绝大多数程序都需要访问变量,计算机的内存就成了速度的瓶颈,解决这个问题的一种方法是将大部分近期使用过的指令和数据存放在高速存储器cache中,其思想是,程序更可能希望重复的反复访问相同的内存和指令,因此,cache保存这些这些值就能使他们快速访问到。
加载并执行程序
程序执行之前,需要将一种工具程序这个程序加载到内存。这种工具程序称为程序加载器。加载后,操作系统将CPU指向程序的入口,即程序开始执行的地址。
- 操作系统在当前磁盘目录下搜索程序的文件名。如果找不到,就会在预定目录列表下搜索文件名。当操作系统无法检索到文件名时,它会发出一个出错信息。
- 如果程序文件被找到,OS就访问磁盘目录中的程序文件基本信息,包括文件大小,及其在磁盘驱动器上的物理位置。
- OS确定内存中下一个可以使用的位置,将程序文件加载到内存。为该程序分配内存块,并将程序大小和位置信息加入表中(有时称为描述符表)。
- OS开始执行程序的第一条机器指令(程序入口),当程序开始执行后,就成为一个进程,OS为这个进程分配一个标识号(进程ID),用于执行期间对其进行追踪。
- 进程自动运行。OS的工作是追踪进程的执行,并响应系统资源的请求。这些资源包括内存、磁盘文件和输入输出设备等。
- 进程结束后,就会从内存中移除。
32位 X86处理器
操作模式
X86处理器有三个主要的操作模式:保护模式、实地址模式和系统管理模式;以及一个子模式:虚拟8086模式,这是保护模式的特殊情况。
寄存器
寄存器是直接位于CPU内的高速存储位置,其设计访问速度远高于传统存储器。
通用寄存器
通用寄存器主要用于算术运算和数据传输。
注意:
- 乘除指令默认使用EAX。它常常被称为扩展累加器寄存器。
- CPU默认使用ECX为循环计数器
- ESP用于寻址堆栈数据。它极少用于一般算术运算和数据传输,通常被称为扩展堆栈指针寄存器
- ESI和EDI用于高速存储器传输指令。
- 高级语言通过EBP来引用堆栈中的函数参数和局部变量。
段寄存器
实地址模式中,16位段寄存器表示的是预先分配的内存区域的基质,这个内存区域称为段。保护模式中,段寄存器中存放的是段描述符表指针。
指令指针
指令指针寄存器(EIP)寄存器中包含下一条将要执行指令的地址。某些机器指令能控制EIP,使得程序分支转向到一个新位置。
EFLAGS寄存器
Flags寄存器包含了独立的二进制位,用于控制CPU的操作,或者是反应一些操作的结果。
内存管理
- 在实地址模式中,只能寻址1MB内存,地址从00000H到FFFFFH。处理器一次只能运行一个程序,但是可以通过中断程序来处理来自外围设备的请求,应用程序被允许访问内存的任何位置,包括那些直接与系统硬件相关的地址。DOS操作系统在实地址模式下运行,Windows 95和98能够引导进入这种模式。
- 在保护模式下,处理器可以同时运行多个程序,它为每个进程(运行中的程序)分配总共4GB的内存。每个程序都分配有自己的保留的内存区域,程序之间禁止意外访问其他程序的代码和数据。
- 在虚拟8086模式中,计算机运行在保护模式下,通过创建一个带有1MB地址空间的虚拟8086机器来模拟运行于实地址模式的80x86计算机。
64位 x86处理器
64位这里就不详细赘述了。
来源:CSDN
作者:Dylinlin
链接:https://blog.csdn.net/qq_42689353/article/details/104793868