计算机基础7

169 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情

第六周 IA-32指令类型

第一讲 传送指令

  • 通用数据传送指令

    • MOV:一般传送,包括movb、movw和movl等
    • MoVS:符号扩展传送,如movsbw、movswl等
    • MOVz:零扩展传送,如movzwl、movzbl等
    • XCHG:数据交换
    • PUSH/POP∶入栈/出栈,如pushl.pushw,popl,popw等
  • 地址传送指令

    • LEA:加载有效地址,如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、POPF:将EFLAG压栈,或将栈顶内容送EFLAG
"入栈"(pushw %ax)
  • 栈(Stack )是一种采用“先进后出”方式进行访问的一块存储区,用于嵌套过程调用。从高地址向低地址增长
  • "栈"不等于"堆栈"

image.png R[sp]<一R[sp]-2意思是将栈顶向下移动2位

M[R[spll<一R[ax]意思是将ax中的值填入新栈顶中

"出栈"(popw %ax)

image.png 下面贴出一段程序的执行过程

image.png 第六周第一讲.2十分重要

IA-31常用指令类型

image.png

整数乘除指令

image.png

定点算数运算指令汇总

image.png

image.png

加法运算的底层实现举例

ALU中有些啥呢

  • 补码加减器(可以干什么)

    • 带符号整数加,减
    • 无符号整数加,减
  • 没有乘法器(为啥)

    • 可用加/减+移位实现,也可有独立乘法器
    • 带符号乘和无符号乘是独立的部件
  • 没有除法器的理由是相同的

  • 各种逻辑运算部件(可以干什么? )

    • 非、与、或、非、前置0个数、前置1个数.....

image.png A和B为输入的结果,R为输出的结果,Flag为输出的标志信息,ALUctr为控制部件,负责控制ALU应该选择哪个门,补码加减器上还有个sub,sub=0,做加法,sub=1,做减法

例子:A=2,B=0x7fffffff

image.png

定点加法指令举例

假设R[ax]=FFFAH,R[bx]=FFF0H,则执行以下指令后"addw %bx,%ax AX、BX中的内容各是什么?标志CF、OF、ZF、SF各是什么?要求分别 将操作数作为无符号数和带符号整数解释并验证指令执行结果。

分析一把:

R[ax]<--R[ax]+R[bx]

FFFAH=1111 1111 1111 1010 FFF0H=1111 1111 1111 0000

R[ax]=FFFAH + FFF0H= 1 1111 1111 1110 1010 ,且bx中内容不变

由于高位=1移除,所以R[ax]=1111 1111 1110 1010。

CF=高位进位=1。由于负数+负数结果还是负数,因此OF=0。因为最终结果不等于0,所以ZF=0。因为R[ax]最高位为1,所以SF=1。

若是无符号整数:因为CF=1,所以溢出

验证:FFFA的真值为65535-5=65530,FFF0的真值为65515 FFEA的真值为65535-21=65514≠65530+65515,即溢出

若是带符号整数:因为OF=0,所以没有溢出

验证:

FFFAH=1111 1111 1111 1010的反码为1000 0000 0000 0101

补码为1000 0000 0000 0111=-6

FFFAH=1111 1111 1111 0000的反码为1000 0000 0000 1111

补码为1000 0000 0001 0000=-16

同理FFEA=-22=FFFA+FFF0

结果正确,无溢出