跳转至

指令系统

指令系统

指令系统

指令的基本格式

image-20260630191120368

扩展操作码指令格式

image-20260630194004686

image-20260630193023250

指令的寻址方式

指令寻址

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

image-20260630194156951

数据寻址

  1. EA:effective address

image-20260630195241438

第一类寻址方式

image-20260630200007090

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

image-20260630202913819

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

image-20260630203458973

程序的机器级代码表示

高级语言与机器级代码之间的对应

  1. ptr没有明确意思,只是类型强制符,用来明确内存操作的数据位数。

image-20260630205331935

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

image-20260630205609240

image-20260630210139123

image-20260630204557162

常用的x86汇编指令

image-20260630211449181

image-20260630210935855

image-20260630212428337

AT&T格式和Intel格式

image-20260630212554357

选择语句的机器级表示

  1. 在x86处理器中,程序计数器PC常被称为IP(Instruction Pointer)

image-20260701205054071

image-20260701205112953

image-20260701205832950

循环语句的机器级表示

image-20260701210121006

image-20260701210435972

x86中loop指令默认使用ecx作为循环计数器

函数调用的机器级表示

Call和ret指令
  1. Call<函数名> 是函数调用指令。
  2. 将IP旧值压入栈顶。
  3. 设置IP新值,无条件转移到被调用函数的第一条指令。

  4. ret 是函数返回指令(return),从函数的栈帧顶部找到IP旧值,并将其出栈并恢复IP寄存器。

image-20260701210626217

image-20260701211005391

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

image-20260701211158548

image-20260701211850350

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

image-20260701212410981

image-20260701214725694

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

image-20260701220646008

image-20260701220705866

image-20260701220714505

CISC和RISC的基本概念

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

image-20260701221542039

习题笔记

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