计算机系统基础 | 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 |
不变 | 不变 | 不变 | 不变 |
说明
- ADD 和 SUB:用于加法和减法操作。根据结果设置 OF, SF, CF, ZF 标志位。
- INC 和 DEC:用于自增和自减操作。CF 标志位保持不变。
- NEG:用于取负操作。如果操作数为最小负数(例如 0x80000000),则 OF 置位。
- CMP:用于比较操作。通过设置标志位反映比较结果。
- MUL 和 IMUL:用于无符号和有符号乘法。结果存储在 EDX:EAX 中(对于一操作数形式),如果结果超出目标寄存器容量,则 OF 和 CF 置位。
- 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 (仅设置标志位,不存储结果) |
清零 | 根据结果设置 | 清零 | 根据结果设置 |
说明
- NOT:用于按位取反操作。该指令不会影响任何标志位。
- AND:用于按位与操作。根据结果设置 SF 和 ZF 标志位,清零 OF 和 CF。
- OR:用于按位或操作。根据结果设置 SF 和 ZF 标志位,清零 OF 和 CF。
- XOR:用于按位异或操作。根据结果设置 SF 和 ZF 标志位,清零 OF 和 CF。
- 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,根据最高两位变化设置 | 不变 | 根据最后移出的位设置 | 不变 |
说明
- SHL 和 SAL:用于逻辑和算术左移操作。这两条指令在 IA-32 中是同义的。根据结果设置 OF、SF 和 ZF 标志位,CF 根据最后移出的位设置。
- SHR:用于逻辑右移操作。根据结果设置 OF、SF 和 ZF 标志位,CF 根据最后移出的位设置。
- SAR:用于算术右移操作。根据结果设置 OF、SF 和 ZF 标志位,CF 根据最后移出的位设置。
- ROL 和 ROR:用于循环左移和右移操作。如果 count 为 1,OF 根据最高两位的变化设置,CF 根据最后移出的位设置。
- 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字节) |
说明
- JMP:用于无条件跳转到目标地址,有多种形式(立即数、寄存器、内存)。
- CALL:用于调用子程序,将返回地址压入堆栈,然后跳转到目标地址执行子程序。
- RET:用于从子程序返回,从堆栈中弹出返回地址,并跳转到该地址继续执行。
- JMP Short:用于短距离跳转,跳转范围是当前指令的前或后 128 字节以内。