【问题标题】:ZF not set as a result of MUL instruction in assembly language汇编语言中的 MUL 指令未设置 ZF
【发布时间】:2023-01-08 13:19:17
【问题描述】:

我使用 masm615 汇编器和文本板作为编辑器。我正在编写 32 位汇编程序。在程序中,由于 mul 指令,我试图设置零标志,但它不起作用。

谁能告诉我为什么在 eax 寄存器中的结果为零时零标志被清除?

    include irvine32.inc
    .data
    .code
    main proc
    xor eax,eax
    call dumpregs
    xor ebx,ebx
    call dumpregs
    mov eax,2
    call dumpregs
    mov ebx,3
    call dumpregs
    sub eax,2
    call dumpregs
    mul ebx
    call dumpregs
    exit
    main endp
    end main

【问题讨论】:

标签: assembly x86 masm irvine32 eflags


【解决方案1】:

在程序中,我试图将 mul 指令设置为零标志

mul 指令没有定义关于零标志是否或何时设置、清除或保持不变的任何信息。请参阅 Intel® 64 and IA-32 Architectures Software Developer’s Manual 第 2 卷第 3-594 页,或其中的 an HTML scrape

MUL——无符号乘法

...

受影响的标志

如果结果的上半部分为 0,则 OF 和 CF 标志设置为 0;否则,它们被设置为 1。SF、ZF、AF 和 PF 标志未定义。

如有疑问,请始终查看开发人员手册中的说明文档。并非所有指令都会影响人们可能期望的标志或人们期望的方式。

未定义意味着不同的 CPU 可能不同。例如,Skylake 在一些测试用例中设置 ZF=0 而不管输出或先前的值。在某些情况下 CPU 设置 ZF=1 是可能的,但不太可能。当然,来自其他供应商(或仿真器)的其他 CPU 可以做任何他们想做的事情。

但与 C 的“未定义行为”不同,这只是一个未定义的价值;它仍然是 0 或 1。

【讨论】:

  • 我很感激。我是汇编语言的新手,所以我总是遇到这样的问题。
  • 影响采埃孚。如果保证不修改它,它会这样说,比如带有 CF 的 inc/dec:felixcloutier.com/x86/inc#aflags-affected(英特尔 vol.2 手册的 HTML 片段)。在实践中,例如 Skylake 似乎总是在我测试的一些情况下设置 ZF=0,无论输出是否为零。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
相关资源
最近更新 更多