汇编语言 - 标志设置让我头疼

标签 assembly x86 flags cpu-registers

我试图确定在执行以下操作后应将各种标志设置为(进位、符号、零、溢出):

mov ax, 7ff0h;       ax register is now 7ff0h

add al, 10h;         

我对程序集如何处理这个问题感到困惑。因为我们只添加到寄存器中包含 f0h 的 al 部分,所以 f0h + 10h 给出 100h。这会设置溢出标志吗?携带旗帜?两者都不?我认为会设置溢出标志,但是,我脑海中浮现的另一种可能性是程序检测到这一点并自动将 ah 寄存器从 7fh 更改为 80h,从而使完整的ax寄存器8000h。理论上,这不会设置进位标志,而是设置符号标志和溢出标志,因为我们的总数 8000h 现在为负数。谁能解释一下这是如何处理的?

谢谢。

最佳答案

我玩了一下 debug 命令(随 x86 Windows 一起提供):

-a 100
1A2F:0100 mov ax, 7ff0
1A2F:0103 add al, 10
1A2F:0105
-t =100 2

AX=7FF0  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1A2F  ES=1A2F  SS=1A2F  CS=1A2F  IP=0103   NV UP EI PL NZ NA PO NC
1A2F:0103 0410          ADD     AL,10

AX=7F00  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1A2F  ES=1A2F  SS=1A2F  CS=1A2F  IP=0105   NV UP EI PL ZR NA PE CY
1A2F:0105 0000          ADD     [BX+SI],AL                         DS:0000=CD
-

NV [无溢出] PL(正) CY [进位]

关于汇编语言 - 标志设置让我头疼,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15002143/

相关文章:

c++ - 复合日期类型的调用约定

c++ - 尝试在 SSE 编程中使用和掩码添加 __m128

assembly - x86 eflags 位 18(对齐检查)如何工作? (与检查 386 与 486 及更高版本相关。)

ios - Xcode - 如何添加可以在头文件中检查的标志?

android - : notification. 标志和 notification.defaults 之间有什么区别?

assembly - MAC-1 汇编递归

assembly - ARM 并行指令 ASX 和 SAX 的用途?

arrays - 从 gdb 中的 .bss 打印 "array"

assembly - 理解用于函数调用的auipc+jalr序列

c - 是否可以将内存位置与缓存 Hook