【问题标题】:Assembly language - Flag setting giving me headaches汇编语言 - 标志设置让我头疼
【发布时间】:2013-02-21 12:20:37
【问题描述】:

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

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

add al, 10h;         

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

谢谢。

【问题讨论】:

    标签: assembly x86 flags cpu-registers


    【解决方案1】:

    我已经使用了调试命令(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 [携带]

    【讨论】:

      【解决方案2】:

      来自英特尔指令手册中的ADD 指令:

      ADD 指令执行整数加法。它评估两个签名的结果 和无符号整数操作数,并设置 OF 和 CF 标志以指示进位(溢出) 分别在有符号或无符号结果中。 SF 标志表示 签名结果。

      在调试器中运行一个简单的测试,我们可以看到设置了 CF 标志,并且只更改了形成 AL 的位:

      .386
      .MODEL FLAT
      
      .STACK 1024
      
      ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
      
      .CODE
      _start:
          XOR EAX,EAX
          MOV AX,7ff0h
          ADD AL,10h
          PUSH 0  ;EAX is now 0x00007F00
          CALL ExitProcess
      
      PUBLIC _start
      END
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-29
        • 2011-10-28
        相关资源
        最近更新 更多