C3-指令系统

指令

指令包含信息: 1)操作码(操作性质), 2)源操作数1 and/or 源操作数2(立即数或存储器编号或存储地址), 3)目的操作数地址(寄存器编号或存储地址)

指令执行过程中, 指令和数据取出存放至CPU, 指令存放至IR, 数据存放至GPR

指令类别

微指令: 微程序级命令, 属于硬件范畴

机器指令: 处于硬件软件的交界面

汇编指令: 机器指令的汇编表示形式, 为机器指令的符号表示(可以有不同格式)(机器指令和汇编指令一一对应, 都是机器级指令, 由若干字段表示) e.g. Intel格式: mov [bx+di-6], cl. AT&T格式: movb %cl, -6(%bx,%di) 'b'为长度后缀

寄存器传送语言GTL(Register Transfer Language)

e.g. M[R[bx]+R[di]-6]←R[cl]
R: 寄存器内容. M:存储单元内容. [address]: 地址

汇编与反汇编

汇编与反汇编结果: 汇编得到的汇编指令: 带有长度后缀, 数字为十进制.
反汇编得到的汇编指令: 不带长度后缀, 数字为十六进制

AT&T格式汇编语言长度后缀

b = byte(8 bit) w = word(16bit) s = single(32-bit floating point) l = long(32-bit integer OR 64-bit floating point) q = quad(64 bit) t = ten bytes(80-bit floating point)

两种目标文件 test.o: 可重定位目标文件, 地址从0开始, 不是确切地址.
test: 可执行目标文件, 带有链接后的确切地址, 地址为虚拟地址

指令集体系结构ISA

ISA(Instruction Set Architecture)规定了如何使用硬件:

  • 指令格式, 操作种类, 每种操作对应的操作数
  • 可接受的操作数类型
  • 寄存器结构. 包括寄存器名称, 编号, 长度, 用途
  • 存储数存放的存储空间大小和编址方式
  • 大端还是小端存放
  • 寻址方式
  • 执行过程的控制方式, 包括程序计数器, 条件码定义...

IA-32/x64体系结构

IA-32机器指令格式

img

指令段: 操作码, 寻址方式, SIB, 位移量, 直接数据(立即数)

  • SIB: 0或1个字节, S给出比例因子, B和I可以是8个GRS中任意一个.
  • 操作码: 1或2个字节, 内含三个字段(opcode, W, D). opcode:操作码, W: 与机器模式(16/32位)仪器确定寄存器位数, D: 操作方向(确定源和目标).
  • 寻址方式(ModeRM字节): 0或1个字节. 内含三个字段(mod, Reg/OP, RM). 与操作码W字段和机器模式仪器确定操作数所在寄存器编号或有效地址计算方式
  • 位移量立即数长度可以是1B, 2B, 4B

寄存器结构

8个GPR(0-7), 一个EFLAGs(标志寄存器), 一个EIP(即PC)

可寻址空间4GB(0-0xFFFFFFFF), 指令格式长度可变, 操作码长度可变.

寄存器组织

img

寻址空间计算

处理器按照字节编址
比特:b 字节:B
处理器单位N位 = 地址总线N位 = N根数据总线. 寻址空间为2^N (B)
1kB = 2^10 B. 1MB = 2^10 kB. 1GB = 2^10 MB.
故: N位处理器寻址空间为: 2^N (B) = 2^(N-30) (GB)

标志计算器

img

6个条件标志: OF-11, SF-7, ZF-6, CF-0, 辅助进位标志(BCD码运算时有意义)AF-4, 奇偶标志PF-2

3个控制标志:DF(Direction Flag): 方向标志(自动变址方向是增还是减), IF(Interrupt Flag): 中断允许标志(仅对外部可屏蔽中断有用), TF(Trap Flag): 陷阱标志(是否是单步跟踪状态)

IA-32支持的数据类型及格式

img

IA-32寻址方式

定义: 如何根据指令信息得到操作数或者操作数地址

操作数位置

  • 立即寻址: 指令中
  • 寄存器寻址: 寄存器中
  • 其他寻址方式: 存储单元中, (属于存储器操作数, 按照字节编码)

寻址工作模式(与微处理器工作模式有关)

  • 实地址模式: 寻址空间1MB, 20位地址. 基本用不到
  • 保护模式: 加电后进入, 采用虚拟存储管理. 多任务情况下隔离并保护软件使用的存储区域. 寻址空间2^32 B = 4GB, 32位线性地址分段(段基址+段内偏移量)

现在的处理器在加电启动过程中仍然采用实地址模式, 在启动结束后马上转入保护模式工作

保护模式下的寻址方式

img

段基址: (SR). 有效地址: (SR)之后加上的内容. LA为存储器空间的地址

对齐: 按NB边界对齐, 即变量首地址编号能够整除N

  • 栈(Stack)是一种采用“先进后出”方式进行访问的一块存储区,用于嵌套过程调用.
  • 从高地址向低地址增长.
  • “栈”不等于“堆栈”(由“堆”和“栈”组成).

入栈

img

出栈

img

IA-32 常用指令

传送指令

通用数据传送指令

  • MOV: 一般传送, 等长传送(传入传出的位数相同), movb/movw/movl...
  • MOVS: 符号拓展传送, movsbw/movswl...(movs+传出类型+传入类型). movsbw: 8bit扩展为16bit, 符号位拓展
  • MOVZ: 零扩展传送(无符号数拓展传送): 高位补0, movzwl/movzbl...
  • XCHG: 数据交换
  • PUSH/POP: 入栈/出栈. pushl/pushw/popl/popw...

地址传送指令

  • LEA: 加载有效地址. (l:load, EA:effective address有效地址). 如leal(%edx,%eax), %eax表示: R[eax]←R[edx]+R[eax],执行前,若R[edx]=i, R[eax]=j,则指令执行后,R[eax]=i+j

输入输出指令

  • IN/OUT: I/O端口与寄存器之间交换数据

标志传送指令:

  • PUSHF: 将EFLAG压栈
  • POPF: 将栈顶内容送EFLAG

定点算术运算指令

加/减(影响标志, 不区分带符号数/无符号数)

  • ADD: 加. addb/addw/addl...
  • SUB: 减. subb/subw/subl...

增1/减1(影响除CF以外的标志, 不区分带符号/无符号)

  • INC:加,包括incb、incw、incl等
  • DEC:减,包括decb、decw、decl等

取负运算(影响标志、若对0取负,则结果为0且CF清0,否则CF置1)

  • NEG:取负,包括negb、negw、negl等

比较运算(做减法得到标志、不区分无/带符号)

  • CMP:比较,包括cmpb、cmpw、cmpl等

乘 / 除运算(不影响标志、区分无/带符号)

  • MUL / IMUL:无符号乘 / 带符号乘
  • DIV/ IDIV:带无符号除 / 带符号除

乘法指令:可给出一个、两个或三个操作数

  • 若给出一个操作数SRC,则另一个源操作数隐含在AL/AX/EAX中,将SRC和累加器内容相乘,结果存放在AX(16位)或DX-AX(32位)或EDX-EAX(64位)中。DX-AX表示32位乘积的高、低16位分别在DX和AX中。 n位 × n位=2n位
  • 若指令中给出两个操作数DST和SRC,则将DST和SRC相乘,结果在DST中。n位 × n位=n位
  • 若指令中给出三个操作数REG、SRC和IMM,则将SRC和立即数IMM相乘,结果在REG中。n位 × n位=n位

除法指令:只明显指出除数,用EDX-EAX中内容除以指定的除数(被除数存放在默认寄存器中)

  • 若为8位,则16位被除数在AX寄存器中,商送回AL,余数在AH
  • 若为16位,则32位被除数在DX-AX寄存器中,商送回AX,余数在DX
  • 若为32位,则被除数在EDX-EAX寄存器中,商送EAX,余数在EDX

定点算术运算指令汇总

img

按位运算指令

逻辑运算

  • AND:与,包括 andb、andw、andl等
  • OR:或,包括 orb、orw、orl等
  • XOR:异或,包括 xorb、xorw、xorl等
  • TEST:做“与”操作测试,仅影响标志信息, 不改变寄存器和存储单元的内容

注:仅NOT不影响标志,其他指令的OF=CF=0,而ZF和SF则根据结果设置:若全0,则ZF=1;若最高位为1,则SF=1

移位运算, 左移/右移时, 最高/最低位送CF

  • SHL/SHR: 逻辑左/右移,包括 shlb、shrw、shrl等
  • SAL/SAR: 算术左/右移,左移判溢出,右移高位补符. (移位前、后符号位发生变化,则OF=1) 包括 salb、sarw、sarl等
  • ROL/ROR: 循环左/右移,包括 rolb、rorw、roll等
  • RCL/RCR: 带进位循环左/右移,即:将CF作为操作数一部分循环移位,包括 rclb、rcrw、rcll等

控制转移指令

指令执行可按顺序跳转到转移目标指令处执行

  • 无条件转移指令: JMP DST:无条件转移到目标指令DST处执行
  • 条件转移: Jcc DST:cc为条件码,根据标志(条件码)判断是否满足条件,若满足,则转移到目标指令DST处执行,否则按顺序执行
  • 条件设置: SETcc DST:按条件码cc判断的结果保存到DST(是一个8位寄存器 )
  • 调用和返回指令 (用于过程调用): CALL DST:返回地址RA入栈,转DST处执行; RET:从栈中取出返回地址RA,转到RA处执行
  • 中断指令

浮点处理

IA-32关于浮点数的分别

处理架构

  • x87FPU指令集(gcc默认)
  • SSE指令集(x86-64架构使用)

浮点数类型

  • float: 32位 IEEE 754 单精度格式
  • double: 64 位 IEEE 754 双精度格式
  • long double: 80位双精度扩展格式

About long double: 1位符号位s, 15位阶码e(偏置参数16383), 1位显式首位有效位j和63位尾数f.

x87 FPU

特指与x86处理器配套的浮点协处理器架构

采用栈结构.

  • 深度为8,宽度为80位,即8个80位寄存器
  • 名称为ST(0) ~ ST(7),栈顶为ST(0),编号分别为0~7

所有浮点运算都按80位扩展精度进行

浮点数在浮点寄存器和内存之间传送

  • float、double、long double型变量在内存分别用IEEE 754单精度、双精度和扩展精度表示,分别占32位(4B)、64位(8B)和96位(12B,其中高16位无意义, 为了对齐申请12B内存)
  • float、double、long double类型变量在浮点寄存器中都用80位扩展精度表示
  • 从浮点寄存器到内存:80位扩展精度格式转换为32位或64位
  • 从内存到浮点寄存器: 32位或64位格式转换为80位扩展精度格式

数据传送

装入 (转换为80位扩展精度)
  • FLD:将数据从存储单元装入浮点寄存器栈顶 ST(0)
  • FILD:将数据从int型转换为浮点格式后,装入浮点寄存器栈顶
存储(转换为IEEE 754单精度或双精度)
  • FSTx:x为s/l时,将栈顶ST(0)转换为单/双精度格式,然后存入存储单元
  • FSTPx:弹出栈顶元素,并完成与FSTx相同的功能
  • FISTx:将栈顶数据从int型转换为浮点格式后,存入存储单元
  • FISTP:弹出栈顶元素,并完成与FISTx相同的功能

带P结尾指令表示操作数会出栈,也即ST(1)将变成ST(0)

交换
  • FXCH:交换栈顶和次栈顶两元素
常数装载到栈顶
  • FLD1 :装入常数1.0
  • FLDZ :装入常数0.0
  • FLDPI :装入常数pi(=3.1415926...)
  • FLDL2E :装入常数log(2)e
  • FLDL2T :装入常数log(2)10
  • FLDLG2 :装入常数log(10)2
  • FLDLN2 :装入常数Log(e)2

算术运算

加法
  • FADD/FADDP: 相加/相加后弹出栈
  • FIADD:按int型转换后相加
减法
  • FSUB/FSUBP : 相减/相减后弹出栈
  • FSUBR/FSUBRP:调换次序相减/相减后弹出栈
  • FISUB:按int型转换后相减
  • FISUBR:按int型转换并调换次序相减
  • 若指令未带操作数,则默认操作数为ST(0)、ST(1)
  • 带R后缀指令是指操作数顺序变反,例如:fsub执行的是x-y,fsubr执行的就是y-x
乘法
  • FMUL/FMULP: 相乘/相乘后弹出栈
  • FIMUL:按int型转换后相乘
除法
  • FDIV/FDIVP : 相除/相除后弹出栈
  • FIDIV:按int型转换后相除
  • FDIVR/FDIVRP:调换次序相除/相减后弹出栈
  • FIDIVR:按int型转换并调换次序相除

SSE指令集

由MMX(多媒体扩展)发展而来.

由MMX发展而来的SSE架构

  • MMX指令使用8个64位寄存器**MM0MM7**,借用8个80位寄存器ST(0)ST(7)中64位尾数所占的位,可同时处理8个字节,或4个字,或2个双字,或一个64位的数据. 为SIMD技术(单指令多数据).

  • MMX指令并没带来3D游戏性能的显著提升,故推出SSE指令,并陆续推出SSE2、SSE3、SSSE3和SSE4等采用SIMD技术的指令集,这些统称为SSE指令集

  • SSE指令集将80位浮点寄存器扩充到128位多媒体扩展通用寄存器XMM0~XMM7,可同时处理16个字节,或8个字,或4个双字(32位整数或单精度浮点数),或两个四字的数据

  • 从SSE2开始,还支持128位整数运算,或同时并行处理两个64位双精度浮点数

img

paddb指令(操作数在两个xmm寄存器中)

  • 一条指令同时完成16个单字节数据相加
  • 类似指令paddw同时完成8个单字数据相加
  • 类似指令psubl同时完成4个双字数据相减

movdqa指令

  • 将双四字(128位)从源操作数处移到目标操作数处
  • 用于在 XMM 寄存器与 128 位存储单元之间移入/移出双四字,或在两个 XMM 寄存器之间移动
  • 源操作数或目标操作数是存储器操作数时,操作数必须是16 字节边界对齐,否则将发生一般保护性异常 (#GP)

movdqu指令

  • 在未对齐的存储单元中移入/移出双四字
posted @ 2023-05-23 16:01  CINKUK  阅读(263)  评论(0)    收藏  举报