指令和运算

为什么不同的CPU厂不能理解一个语言

%

CPU支持的指令集不同


如何获得程序的机器码和汇编代码

  1. gcc -g -c -o 三个参数的作用?

%

g为了调试;c只编译不连接;o输出文件

$ gcc -g -c test.c 
$ objdump -d -M intel -S test.o

指令的分类

%

第一类是算术类指令。我们的加减乘除,在 CPU 层面,都会变成一条条算术类指令。

第二类是数据传输类指令。给变量赋值、在内存里读写数据,用的都是数据传输类指令。

第三类是逻辑类指令。逻辑上的与或非,都是这一类指令。

第四类是条件分支类指令。日常我们写的“if/else”,其实都是条件分支类指令。

最后一类是无条件跳转指令。写一些大一点的程序,我们常常需要写一些函数或者方法。在 调用函数的时候,其实就是发起了一个无条件跳转指令


机器码的分类

%

R 指令是一般用来做算术和逻辑操作,里面有读取和写入数据的寄存器的地址。如果是逻辑 位移操作,后面还有位移操作的位移量,而最后的功能码,则是在前面的操作码不够的时 候,扩展操作码表示对应的具体指令的。

I 指令,则通常是用在数据传输、条件分支,以及在运算的时候使用的并非变量还是常数的 时候。这个时候,没有了位移量和操作码,也没有了第三个寄存器,而是把这三部分直接合 并成了一个地址值或者一个常数。

J 指令就是一个跳转指令,高 6 位之外的 26 位都是一个跳转后的地址。


把一个加法指令码解析成机器码

add $t0,$s2,$s1
# $t0 = $1 + $2

%

add的opcode是0;rs对应第一个寄存器s1;rt对应第2个寄存器; rd代表目标临时寄存器t0

得到16进制的机器码 0X02324020, 以每4位作为一个纸带的列,得到下面的纸带


你可能感兴趣的:(计组,#,深入浅出-极客,计组,基础)