ZF未因汇编语言中的MUL指令而设置汇编语言、指令、ZF、MUL

由网友(仰望╮那颗星)分享简介:我使用masm615汇编程序和TextPad作为编辑器。我正在写32位汇编语言程序。在程序中,由于mul指令,我试图设置零标志,但它不起作用。谁能告诉我为什么eax寄存器中的结果是零,而零标志是清零的?include irvine32.inc.data.codemain procxor eax,eaxcall dum...

我使用masm615汇编程序和TextPad作为编辑器。我正在写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

推荐答案

C语言灵魂拷问 i为何比i 执行效率高 有何区别

在程序中,我尝试将MUL指令的结果设置为零标志

mul指令没有定义是否或何时设置、清除或不修改零标志。请参阅英特尔®64和IA-32架构 软件开发人员手册第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。

阅读全文

相关推荐

最新文章