CMU15213_Lecture_05_Machine Level Programming I: Basics

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014485485/article/details/82845803

试图还原老师讲课的思路。

 

History of Intel processors and architectures

Intel x86 Processors,Backwards compatible up until 8086, introduced in 1978

使用的是Complex instruction set computer (CISC):

1.Many different instructions with many different formats

2.Hard to match performance of Reduced Instruction Set Computers (RISC)

但是Intel就是做的很好,不管是速度还是功耗。

 

从前做芯片不需要考虑太多路径延迟,因为那时候时钟频率还比较低,所以留给信号走的时间也长,但是随着芯片制造技术(晶体管制造)的发展,时钟频率越做越高,相同面积的晶体管数越来越多,现在已经达到分子级别,频率越高,功耗也会越大,怎样继续提升速度成了一个问题,目前的解决方法是采用并行技术,多个核(processors)一起运行,而不是单纯追求单核具有更高的速度。

 

摩尔定律,Moore’s Law:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。这一定律揭示了信息技术进步的速度。

 

C, assembly, machine code

什么是Architecture?

The parts of a processor design that one needs to understand to write assembly code.

比如说,特定的指令集,寄存器,

什么是Microarchitecture?

Implementation of the architecture.可以说是程序员(写的代码)和机器的沟通的桥梁。

比如说,cache的大小,核的频率

 

 

理解一下Microarchitecture:给你一个instruction set architecture,它提供了某个interface,在这个接口上可以有很多不同的实现,比如说在不同的cache size下,程序员的表现是不同的,不管是大cache还是小cache,设计出的程序都是正确的, 虽然代码执行起来不可见,但是相同的指令产生的结果必然是相同的。或许时间会不一样,比如从一个slower memory里取数据,和从cache里取是不一样的。处理器的速度会有不同,处理器的核心数会有不同,

而Architecture是处理器设计的一部分,是可见的。

 

附上知乎上一位用户的回答:通常说X86架构、ARM架构、MIPS架构、Alpha架构、PPC架构等,这恐怕就是你说的CPU架构,其实也就是ISA架构,各家CPU公司所采用的指令集不同。同样指令集可以用不同的微架构来实现,例如酷睿系列处理器就有Sandy Bridge、Haswell等不同的微架构来实现。

 

汇编程序员眼中的计算机:
 

 

名词解释

PC: Program counter,程序计数器

§ Address of next instruction § Called “EIP” (IA32) or “RIP” (x86-64)

Register file ,寄存器

§ Heavily used program data

Condition codes,条件语句

§ Store status information about most recent arithmetic operation § Used for conditional branching

Memory ,内存

§ Byte addressable array § Code and user data § Stack to support procedures

 

Turning C into Object Code

将c code feed给GCC,先是preprocessor,输出仍是c code,preprocessor会做一些简单的处理,例如pruning(删除不用的变量等)和substitution(宏定义,条件编译等),然后hand to proper compiler,将C转换到assembly,然后传给assembler,将assembly转换为machine code(查表的方式)。汇编语言和机器码在本质上同一种语言。只是写法不一样。最后linker,处理所有的symbol(包括变量名,函数名),得到可执行文件。我们将这个process image加载到memory,从start point开始执行,执行过程中,我们可以map到额外的函数,称为动态链接。

 

静态链接 vs 动态链接

Static linker libtaries vs dynamic linker libraries

Compile time linker vs run time linker

快 vs 慢

程序小 vs 灵活

 

最开始人们直接写机器码,汇编出来以后,人们写汇编代替写机器码,然后用assembler转换(注意不是compiler),此时将assembly文件称为source code,后缀名为.s,所有的.s文件又被转化为object coed,即.o文件,是代码的最终表示。不过现在,assembly只是中间产物了,人们写C语言或者其他高级语言,它们被称为source code。

 

汇编的一些特点

Data Types,数据类型:

“Integer” data of 1, 2, or 4 bytes ,包括数值和地址

Floating point data of 4, 8, or 10 bytes

No aggregate types such as arrays or structures,都是数字表示,在底层语言里没必要设计复杂的数据类型,只会会开辟连续的内存

 

Operations,操作:
Perform arithmetic function on register or memory data

Transfer data between memory and register,包括load 和 store

Transfer control,包括条件语句,无条件转移等

在Intel architecture中,不能在内存里同时进行两个操作

 

Disassembler,将machine code转化为assembly:objdump -d p

 

Assembly Basics: Registers, operands, move

Integer Registers (IA32)

 

Operand Types,操作数的类型

Immediate: Constant integer data, 以$开头

Register: One of 8 integer registers,%esp and %ebp reserved for special use,如%eax

Memory: 4 consecutive bytes of memory at address given by register,如(%eax)

Cannot do memory-memory transfer with a single instruction,内存和内存之间不能用一条指令完成数据传递。

关于寄存器:https://www.cnblogs.com/awpatp/archive/2009/10/30/1593248.html

 

内存地址模式:

(R) :Mem[Reg[R]],  movl (%ecx),%eax

D(R)  :Mem[Reg[R]+D],  movl 8(%ebp),%edx

(Rb,Ri) Mem[Reg[Rb]+Reg[Ri]]

D(Rb,Ri) Mem[Reg[Rb]+Reg[Ri]+D]

(Rb,Ri,S) Mem[Reg[Rb]+S*Reg[Ri]]

 

一般形式:D(Rb,Ri,S)      Mem[Reg[Rb]+S*Reg[Ri]+ D]

§ D: Constant “displacement” 1, 2, or 4 bytes

§ Rb: Base register: Any of 8 integer registers

§ Ri: Index register: Any, except for %esp  缺省为0

§ S: Scale: 1, 2, 4, or 8 (why these numbers?)  缺省为1

 

举个例子:

 

 

解释body:

 

 

Intro to x86-64

64位寄存器,寄存器数量也更多,

 

 

x86-64 Integer Registers

 

 

Instructions

Long word l (4 Bytes) ↔ Quad word q (8 Bytes)

movl ➙ movq

addl ➙ addq

。。。

32-bit instructions that generate 32-bit results

Data held in registers %rax and %rdx;movq operation

 

----------------------

注:

IA32 : 32 bits Intel Architecture (32位带宽Intel构架)

IA64 : 64 bits Intel Architecture (64位带宽Intel构架)

 

i386 : Intel 386 ( 老的386机器,也泛指IA32体系的CPU)

i486 : Intel 486

i586 : Intel 586 ( Pentium ,K6 级别CPU )

i686 : Intel 686 ( Pentium II, Pentium III , Pentim 4, K7 级别CPU )

以上的86 也可以叫做 x86, 通称说 x86也是指 IA32构架CPU

 

x86是一个intel通用计算机系列的编号,也标识一套通用的计算机指令集合。

早期intel的CPU编号都是如8086,80286,由于这整个系列的CPU都是指令兼容的,所以都用X86来标识所使用的指令集合。

如今的奔腾,P2,P4,赛扬系列都是支持X86指令系统的,所以都属于X86家族。

x86 family 6 model 65意思是这个CPU属于x86家族的第6代产品,采用65ns的工艺制造。

---------------------------------

这节课主要讲了 处理器架构,汇编和机器码基础,介绍了x86-64指令集。

 

 

猜你喜欢

转载自blog.csdn.net/u014485485/article/details/82845803
今日推荐