持续创作,加速成长!这是我参与「掘金日新计划 · 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 )是一种采用“先进后出”方式进行访问的一块存储区,用于嵌套过程调用。从高地址向低地址增长
- "栈"不等于"堆栈"
R[sp]<一R[sp]-2意思是将栈顶向下移动2位
M[R[spll<一R[ax]意思是将ax中的值填入新栈顶中
"出栈"(popw %ax)
下面贴出一段程序的执行过程
第六周第一讲.2十分重要
IA-31常用指令类型
整数乘除指令
定点算数运算指令汇总
加法运算的底层实现举例
ALU中有些啥呢
-
补码加减器(可以干什么)
- 带符号整数加,减
- 无符号整数加,减
-
没有乘法器(为啥)
- 可用加/减+移位实现,也可有独立乘法器
- 带符号乘和无符号乘是独立的部件
-
没有除法器的理由是相同的
-
各种逻辑运算部件(可以干什么? )
- 非、与、或、非、前置0个数、前置1个数.....
A和B为输入的结果,R为输出的结果,Flag为输出的标志信息,ALUctr为控制部件,负责控制ALU应该选择哪个门,补码加减器上还有个sub,sub=0,做加法,sub=1,做减法
例子:A=2,B=0x7fffffff
定点加法指令举例
假设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
结果正确,无溢出