0

例如,如果我有以下代码:

L1:
        cmp WORD PTR[ebx],0
        jnz found
        add ebx,2
        loop L1
        jmp notFound

零标志的默认值是否未定义?

4

1 回答 1

3

没有“默认”,除非您的意思是在运行 BIOS 的第一条指令之前进行初始开机。任何其他时间,该值都是先前放置在那里的指令,就像其他寄存器一样。

如果您的意思是进程的第一条用户空间指令,那将取决于内核。在调试器中尝试一下,看看你的操作系统版本发生了什么。例如,Linux 在进入用户空间之前将整数/向量寄存器归零(以避免泄漏任何内核数据),并清除 EFLAGS 中的所有条件代码标志。


想想寄存器(包括条件标志),就像你在 C 中未初始化的局部变量一样。(除了 asm 没有未定义的行为;你可以读取寄存器中遗留的任何垃圾代码,只是不能保证值是什么。)

这就是为什么这段代码cmp在运行之前设置 FLAGS 包括 ZF的原因jnz,所以之前的内容并不重要。


像这样留下一些标志“未定义”的指令mul将根据任何给定 CPU 上的某些内部条件将其设置为某个值,手册只是不保证跨不同 CPU 的任何内容。例如,在某些 CPU 上,mul可能总是清除 ZF。在其他情况下,它可能会根据下半部分或上半部分或整个事物设置为零。(或者它通常会这样做,但有时不会,这取决于微架构条件。)缺乏文档化的保证意味着尝试查看实际发生的情况并不是编写可移植代码的安全方法。

但是无论发生什么, ZF 即使在类似 的指令之后也将是 0 或 1 mul,并且不会在 mul 完成后更改一些指令。

于 2021-05-13T20:08:57.590 回答