指令系统
指令系统¶
指令系统¶
指令的基本格式¶

扩展操作码指令格式¶


指令的寻址方式¶
指令寻址¶
- 对于变长指令字结构,CPU先读入一个字,然后根据操作码判断这条指令的总字节数,再接着去修改PC的值。

数据寻址¶
- EA:effective address

第一类寻址方式¶

偏移寻址¶
- 基址寄存器(BR, base address register),也就是操作系统中的重定位寄存器。可用通用寄存器实现。
- 基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但是其内容仍由操作系统确定。
- 变址寄存器(IX, index register),可用通用寄存器实现。常用于循环程序。
- 变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变。其中,IX作为偏移量,形式地址A不变,作为基地址。
- 相对寻址是相对于下一条指令偏移A的地址,因为PC每取出一个指令后都会+1。广泛应用于转移类指令。
- 基址寻址的浮动指的是整段程序在内存中的浮动,而相对寻址的浮动指的是一段代码在程序内部的浮动。

堆栈寻址¶
- SP: stack pointer
- 操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。
- 硬堆栈和软堆栈的区别就是存放的位置,前者是寄存器,后者是内存。实际生活中,大多数还是使用软堆栈实现的,因为便宜。

程序的机器级代码表示¶
高级语言与机器级代码之间的对应¶
- ptr没有明确意思,只是类型强制符,用来明确内存操作的数据位数。

- 此处的X意思就是放什么不确定,什么都有可能放,因此是通用的。
- 去掉E的话就意味着只使用低16位。
- 未指明长度默认32bit



常用的x86汇编指令¶



AT&T格式和Intel格式¶

选择语句的机器级表示¶
- 在x86处理器中,程序计数器PC常被称为IP(Instruction Pointer)



循环语句的机器级表示¶


x86中loop指令默认使用ecx作为循环计数器
函数调用的机器级表示¶
Call和ret指令¶
- Call<函数名> 是函数调用指令。
- 将IP旧值压入栈顶。
-
设置IP新值,无条件转移到被调用函数的第一条指令。
-
ret 是函数返回指令(return),从函数的栈帧顶部找到IP旧值,并将其出栈并恢复IP寄存器。


如何访问栈帧¶
- 在x86中push、pop指令都是以4字节为单位。
- pop eax意思是 弹出栈顶元素至eax中。


如何切换栈帧¶
- 为什么栈顶是IP旧值:当切换到新的栈帧后需要找到上次执行到哪条指令了,因此首先应该读到的就是上次该执行的指令的地址,并送到IP中;我调用了另一个函数,我要记住我现在干到哪了,所以离开前我要保存我回来的时候该干哪了,因此栈顶是IP旧值。
- 为什么栈底是上一层函数栈帧的基址,当栈中只剩栈底时就代表当前这个函数要执行完了,要返回上一层函数,因此要找到上一层函数栈帧的基地址。
- 执行一个函数的时候就是往栈里存东西,执行完后就是直接把指针移到底部就代表移出了。


如何传递参数和返回值¶
- 通常将局部变量集中存储在栈帧底部区域。
- C语言中越靠前定义的变量越靠近栈顶。
- 通常将调用参数集中存储在栈帧顶部的区域。
- 调用参数越靠前的参数越靠近栈顶。
- gcc编译器会数据对齐,将每个栈帧的大小设置为16B的整数倍(当前运行的函数的栈帧除外)
- mov指令不支持两个操作数都来自于主存



CISC和RISC的基本概念¶
- CISC:Complex Instruction Set Computer。多用于笔记本,电脑。
- RISC:Reduced Instruction Set Computer。多用于手机,平板。
- 对于目标代码这一项对比:CISC提供的库函数是不可修改的,RISC则可以自己进行优化。
- 因为RISC中只有load和store两条指令可以直接访问内存,因此需要更多的通用寄存器。

习题笔记¶
- 指令集体系结构处于软硬件的界面上。
- 指令字和指令格式、通用寄存器个数和位数都与机器指令有关,由ISA规定。
- 切记!!指令字长通常是 字节(8 位)的整数倍,因此算完指令位数后要检查!!
- LSB(Least Significant Bit / Byte, 最低有效位 / 字节)