05-计算机指令:让我们试试用纸带编程
在软硬件接口中,CPU帮我们做了什么事?
-
从硬件的角度来看,CPU就是一个超大规模集成电路,通过电路实现了加法、乘法乃至各 种各样的处理逻辑。
-
从软件工程师的角度来讲,CPU就是一个执行各种计算机指令的逻辑机器。
计算机指令(Instruction Code), CPU支持的语言,就是计算机指令 集,英文叫Instruction Set。
从编译到汇编,代码怎么变成机器码?
我们需要把整个程序翻译成一个汇编语言的程序,这个过程我们一般叫编译成汇编代码。 针对汇编代码,我们可以再用汇编器翻译成机器码
汇编语言(ASM,Assembly Language),编译(Compile),汇编器(Assembler),机器码(Machine Code)
解析指令和机器码
常见的指令分为五大类。
- 第一类是算术类指令。我们的加减乘除,在CPU层面,都会变成一条条算术类指令。
- 第二类是数据传输类指令。给变量赋值、在内存里读写数据,用的都是数据传输类指令。
- 第三类是逻辑类指令。逻辑上的与或非,都是这一类指令。
- 第四类是条件分支类指令。日常我们写的“if/else”,其实都是条件分支类指令。
- 第五类是无条件跳转指令。写一些大一点的程序,我们常常需要写一些函数或者方法。在调用函数的时 候,其实就是发起了一个无条件跳转指令


MIPS的指令是一个32位的整数,高6位叫操作码(Opcode),也就是代表这条指令具体是一条什么样的指 令,剩下的26位有三种格式,分别是R、I和J。
我以一个简单的加法算术指令add $t0, $s1, $s2,为例
对应的MIPS指令里opcode是0,rs代表第一个寄存器s1的地址是17,rt代表第二个寄存器s2的地址是18,rd 代表目标的临时寄存器t0的地址,是8。因为不是位移操作,所以位移量是0。

总结延伸
06-指令跳转:原来if…else就是goto
CPU是如何执行指令的?
逻辑上,我们可以认为,CPU其实就是由一 堆寄存器组成的。而寄存器就是CPU内部,由多个触发器(Flip-Flop)或者锁存器(Latches)组成的简单 电路。


从if…else来看程序的执行和跳转
// test.c
#include <time.h>
#include <stdlib.h>
int main()
{
srand(time(NULL));
int r = rand() % 2;
int a = 10;
if (r == 0)
{
a = 1;
} else {
a

本文深入探讨了CPU如何执行计算机指令,包括算术、数据传输、逻辑、条件分支和无条件跳转等指令。介绍了MIPS指令格式以及函数调用中的栈操作,阐述了函数调用如何通过压栈和出栈实现,并解释了函数调用可能导致的栈溢出问题。此外,还讨论了动态链接和共享库的概念,以及如何通过地址无关码和全局偏移表(GOT)实现在不同程序中共享同一代码库。动态链接库允许代码在运行时复用,解决了内存管理和程序执行效率的问题。
最低0.47元/天 解锁文章
6435

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



