RISC:精简指令集,低功耗低性能,以ARM为代表。
CISC:复杂指令集,高功耗高性能,以INtel为代表。
一段C代码如何变成可执行的代码
hello.c >> 预处理器 >> hello.i >> 编译器 >> hello.s >> 汇编器 >> hello.o + printf.o >> hello 过程如下图

计算机系统层级:
用户模式(User Mode): 在用户模式下,代码没有对硬件的直接控制权限,也不能直接访问地址的内存。程序是通过调用系统接口(System APIs)来达到访问硬件和内存。在这种保护模式下,即时程序发生崩溃也是可以恢复的。在你的电脑上大部分程序(Application programs)都是在用户模式下运行的。
内核模式(Kernel Mode): 在内核模式下,代码具有对硬件(虚拟内存,操作系统,进程,内存,io device,处理器。)的所有控制权限。可以执行所有CPU指令,可以访问任意地址的内存。内核模式是为操作系统最底层,最可信的函数服务的。在内核模式下的任何异常都是灾难性的,将会导致整台机器停机。

堆栈

堆栈的基本概念:
1.堆栈是一段连续的存储空间
2.后入先出的工作方式
3.只能从栈顶取出数据
4.能保持数据的执行顺序
用处:保存函数调用的返回地址,应对函数跳转指令(比如JMP指令)
堆栈指针寄存器Rsp: 用于保存一个地址,地址指向堆栈使用的内存地址,也就是栈顶。
关于堆栈只有两条指令:PUSH和POP;
PUSH:把内容加入到堆栈顶端,⼊栈时递减堆栈指针
POP:将堆栈顶端的内容弹出;弹出后,⾃增堆栈指针
汇编用法:
push ax:将寄存器ax中的数据送入栈中;
pop ax :从栈顶取出数据送入ax。
堆栈在函数中的使用:
函数顺次被调用 >> 堆栈顺次保存函数返回地址(下一条指令的地址) >> 执行函数 >> 堆栈逆序弹出返回地址,用作下一条指令的地址。
汇编转C
source:源操作数; dest:目的操作数.操作数有三种类型
立即数(Imm)——用数字文本表达式
寄存器操作数(Reg)——使用 CPU 内已命名的寄存器
内存操作数(Mem)——引用内存位置(指针存储)
reg:寄存器
mem:存储器
下图中:有括号代表地址,用指针变量表示(目的操作数是Mem类型),无括号代表变量,用寄存器变量表示。

计算地址实例:%rdx: 0xf000; %rcx: 0x0100;

xPSR是状态寄存器:记录 ALU 标志(0 标志ZF,进位标志CF,负数标志SF,溢出标志OF),执行状态,以及当前正服务的中断号,以下是 ALU 标志的理解实例;

D锁存器:

时序分析:
1)Clock = 1 Q+ 等于 D (透明)
2)Clock = 0 Q+ 等于Clock 变为低电平时的D
下图为有延迟情况

累加器电路:

时序分析:
1)上升沿输出;
2)上升沿期间Load是高电平就装载In的内容,是低电平就累加;
(tips: Load为高电平,重新装载,前面的内容清空,输出的累加是重新装载的)

C语言if…else转汇编
指令cmpq: 比较大小,即两个数做减法,仅修改标志位
指令jle :前<=后就跳转 Jump if less or equal

C语言CASE语句转汇编
ja: ⼤于则跳转

计算机执行代码过程:
1.取指:读9个字节,PC+9;
2 译码:读栈指针
3 执行:栈指针减去8;
4 访存:把增加的PC写入新的栈;指针指向新的值;
5 回写:更新栈指针
数据冒险:source和destination相同时可触发
当前指令需要前一条指令的计算结果,往往会造成阻塞。
解决冒险的方法
1.调整顺序
2.推迟执行
3.前推策略
控制冒险
控制冒险即跳转指令的冒险。跳转时,需要根据前面某条指令的结果确定分支的选择。
解决方法:停顿

超标量流水线
每个时钟周期可并发多条独立指令,即以并行操作方式将两条或多条指令编译并执行,为此需要配备多个功能部件。
乱序执行
下一条指令的执行不依赖前面那条延时较长的指令,只要有了操作数就能执行,此时可以打乱机器指令顺序,就算指令在后面,只要能执行,就先执行。
虚拟内存
MMU( Memory manage unit) 设置在总线上的内存管理单元, 是用于虚拟内存映射到物理内存的硬件。
①Processor( 处理器) 生成虚拟地址;
②MMU 生成 PTEA(页表条目地址)从内存的页表中请求内容;
③ 内存中的页表返回相应的 PTE 值;
④ PTE 的有效位是 0, MMU 触发异常, 转到异常处理程序;
⑤ 异常处理程序确定内存中的牺牲页, 并将其写会到磁盘上;
⑥缺页处理程序页面调入新的页面, 更新 PTE。
⑦ 由于 PTE 已经被更新好了, 重新发送虚拟地址到 MMU( 后面就和命中的过程一样了)
本文介绍了计算机指令集的两种类型RISC和CISC,以及代码从C到可执行文件的编译过程。详细阐述了用户模式和内核模式的区别,并探讨了堆栈的工作原理及其在函数调用中的作用。此外,还涉及了状态寄存器、数据冒险的解决方法、超标量流水线和虚拟内存的管理机制。内容涵盖了计算机系统的多个层面和技术细节。
1180

被折叠的 条评论
为什么被折叠?



