计算机系统基础 | HUST.CS

第三章

定点运算指令

以下是定点运算指令(ADD、SUB、INC、DEC、NEG、CMP、MUL、IMUL、DIV、IDIV)的汇总表格,包括每条指令的格式、操作描述及其对标志位的影响。

指令 格式 操作描述 OF(溢出标志) SF(符号标志) CF(进位标志) ZF(零标志)
ADD add src, dst dst = dst + src 结果溢出时置位 结果为负数时置位 结果进位时置位 结果为零时置位
SUB sub src, dst dst = dst - src 结果溢出时置位 结果为负数时置位 结果借位时置位 结果为零时置位
INC inc operand operand = operand + 1 结果溢出时置位 结果为负数时置位 不变 结果为零时置位
DEC dec operand operand = operand - 1 结果溢出时置位 结果为负数时置位 不变 结果为零时置位
NEG neg operand operand = -operand 操作数为最小负数时置位 结果为负数时置位 操作数非零时置位 结果为零时置位
CMP cmp src, dst dst - src(仅设置标志位,不存储结果) 结果溢出时置位 结果为负数时置位 结果借位时置位 结果为零时置位
MUL mul operand 无符号乘法:EAX = EAX * operand(结果在EDX:EAX) 结果超出目标寄存器时置位 不变 结果超出目标寄存器时置位 不变
IMUL imul operand
imul src, dst
imul imm, src, dst
有符号乘法:EAX = EAX * operand(结果在EDX:EAX)
dst = dst * src
dst = src * imm
结果超出目标寄存器时置位 不变 结果超出目标寄存器时置位 不变
DIV div operand 无符号除法:EAX = EDX:EAX / operand,余数在EDX 不变 不变 不变 不变
IDIV idiv operand 有符号除法:EAX = EDX:EAX / operand,余数在EDX 不变 不变 不变 不变

说明

  1. ADD 和 SUB:用于加法和减法操作。根据结果设置 OF, SF, CF, ZF 标志位。
  2. INC 和 DEC:用于自增和自减操作。CF 标志位保持不变。
  3. NEG:用于取负操作。如果操作数为最小负数(例如 0x80000000),则 OF 置位。
  4. CMP:用于比较操作。通过设置标志位反映比较结果。
  5. MUL 和 IMUL:用于无符号和有符号乘法。结果存储在 EDX:EAX 中(对于一操作数形式),如果结果超出目标寄存器容量,则 OF 和 CF 置位。
  6. DIV 和 IDIV:用于无符号和有符号除法。结果存储在 EAX 中,余数存储在 EDX 中。

这些指令在处理定点运算时具有不同的功能和用途,通过设置标志位来反映操作结果的特性。

逻辑运算指令

IA-32 位运算指令汇总

以下是位运算指令(NOT、AND、OR、XOR、TEST)的汇总表格,包括每条指令的格式、操作描述及其对标志位的影响。

指令 格式 操作描述 OF(溢出标志) SF(符号标志) CF(进位标志) ZF(零标志)
NOT not operand operand = ~operand 不变 不变 不变 不变
AND and src, dst dst = dst & src 清零 根据结果设置 清零 根据结果设置
OR or src, dst dst = dst | src 清零 根据结果设置 清零 根据结果设置
XOR xor src, dst dst = dst ^ src 清零 根据结果设置 清零 根据结果设置
TEST test src, dst dst & src(仅设置标志位,不存储结果) 清零 根据结果设置 清零 根据结果设置

说明

  1. NOT:用于按位取反操作。该指令不会影响任何标志位。
  2. AND:用于按位与操作。根据结果设置 SF 和 ZF 标志位,清零 OF 和 CF。
  3. OR:用于按位或操作。根据结果设置 SF 和 ZF 标志位,清零 OF 和 CF。
  4. XOR:用于按位异或操作。根据结果设置 SF 和 ZF 标志位,清零 OF 和 CF。
  5. TEST:用于按位与操作,但不保存结果,只设置标志位。根据结果设置 SF 和 ZF 标志位,清零 OF 和 CF。

这些指令在处理位运算时具有不同的功能和用途,通过设置标志位来反映操作结果的特性。

移位指令

以下是位移和旋转指令(SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR)的汇总表格,包括每条指令的格式、操作描述及其对标志位的影响。

指令 一操作数格式 二操作数格式 操作描述 OF(溢出标志) SF(符号标志) CF(进位标志) ZF(零标志)
SHL shl operand shl $count, operand
shl %cl, operand
operand << count 根据最高两位变化设置 根据结果设置 根据最后移出的位设置 根据结果设置
SAL sal operand sal $count, operand
sal %cl, operand
operand << count 根据最高两位变化设置 根据结果设置 根据最后移出的位设置 根据结果设置
SHR shr operand shr $count, operand
shr %cl, operand
operand >> count 根据最高位变化设置 根据结果设置 根据最后移出的位设置 根据结果设置
SAR sar operand sar $count, operand
sar %cl, operand
operand >>> count 根据最高位变化设置 根据结果设置 根据最后移出的位设置 根据结果设置
ROL rol operand rol $count, operand
rol %cl, operand
循环左移 如果 count 为 1,根据最高两位变化设置 不变 根据最后移出的位设置 不变
ROR ror operand ror $count, operand
ror %cl, operand
循环右移 如果 count 为 1,根据最高两位变化设置 不变 根据最后移出的位设置 不变
RCL rcl operand rcl $count, operand
rcl %cl, operand
带进位循环左移 如果 count 为 1,根据最高两位变化设置 不变 根据最后移出的位设置 不变
RCR rcr operand rcr $count, operand
rcr %cl, operand
带进位循环右移 如果 count 为 1,根据最高两位变化设置 不变 根据最后移出的位设置 不变

说明

  1. SHL 和 SAL:用于逻辑和算术左移操作。这两条指令在 IA-32 中是同义的。根据结果设置 OF、SF 和 ZF 标志位,CF 根据最后移出的位设置。
  2. SHR:用于逻辑右移操作。根据结果设置 OF、SF 和 ZF 标志位,CF 根据最后移出的位设置。
  3. SAR:用于算术右移操作。根据结果设置 OF、SF 和 ZF 标志位,CF 根据最后移出的位设置。
  4. ROL 和 ROR:用于循环左移和右移操作。如果 count 为 1,OF 根据最高两位的变化设置,CF 根据最后移出的位设置。
  5. RCL 和 RCR:用于带进位的循环左移和右移操作。如果 count 为 1,OF 根据最高两位的变化设置,CF 根据最后移出的位设置。

无条件转移指令汇总

以下是无条件转移指令的汇总表格,包括每条指令的格式和操作描述。

指令 格式 操作描述
JMP jmp target 跳转到指定的目标地址
jmp *%register 跳转到寄存器中存储的地址
jmp *memory_address 跳转到内存地址
CALL call target 调用子程序,将返回地址压入堆栈
call *%register 调用寄存器中存储的子程序地址
call *memory_address 调用内存地址中的子程序
RET ret 从子程序返回
ret $imm16 从子程序返回,并调整堆栈指针
JMP Short jmp short target 短跳转到指定的目标地址(前/后128字节)

说明

  1. JMP:用于无条件跳转到目标地址,有多种形式(立即数、寄存器、内存)。
  2. CALL:用于调用子程序,将返回地址压入堆栈,然后跳转到目标地址执行子程序。
  3. RET:用于从子程序返回,从堆栈中弹出返回地址,并跳转到该地址继续执行。
  4. JMP Short:用于短距离跳转,跳转范围是当前指令的前或后 128 字节以内。
posted @ 2024-05-20 16:45  览遍千秋  阅读(35)  评论(0编辑  收藏  举报