x86 程序集 MASM 中零标志的默认值是多少?
What is the default value of the Zero Flag in x86 assembly MASM?
例如,如果我有以下代码:
L1:
cmp WORD PTR[ebx],0
jnz found
add ebx,2
loop L1
jmp notFound
零标志的默认值是否未定义?
没有“默认”,除非你指的是在 运行 BIOS 的第一条指令之前的初始开机。任何其他时候,该值是之前放置在那里的任何指令,就像其他寄存器一样。
如果您指的是进程的第一个 user-space 指令,那将取决于内核。在调试器中尝试一下,看看您的 OS 版本会发生什么。例如,Linux zeros integer/vector 在进入 user-space 之前注册(以避免泄漏任何内核数据),并清除 EFLAGS 中的所有条件代码标志。
将寄存器(包括条件标志)想象成在 C 中未初始化的局部变量。(除了 asm 没有未定义的行为;你可以读取之前代码留下的任何垃圾在寄存器中,只是不能保证值是多少。)
这就是为什么这段代码使用cmp
在运行jnz
之前设置包括ZF在内的FLAGS,所以之前有什么并不重要。
像 mul
这样留下一些标志“未定义”的指令将根据任何给定的某些内部条件将其设置为某个值 CPU,手册只是不保证不同 CPU秒。例如在某些 CPU 上,mul
可能总是清除 ZF。在其他人身上,它可能会根据低或高的一半或整个事物设置为零。 (或者它可能 通常 会这样做,但有时不会,这取决于微体系结构条件。)缺乏记录的保证意味着试验看看实际发生的事情是 而不是 一种编写可移植代码的安全方法。
但是无论发生什么,即使在像 mul
这样的指令之后,ZF 也将是 0 或 1,并且不会例如在 mul 完成后更改几条指令。
例如,如果我有以下代码:
L1:
cmp WORD PTR[ebx],0
jnz found
add ebx,2
loop L1
jmp notFound
零标志的默认值是否未定义?
没有“默认”,除非你指的是在 运行 BIOS 的第一条指令之前的初始开机。任何其他时候,该值是之前放置在那里的任何指令,就像其他寄存器一样。
如果您指的是进程的第一个 user-space 指令,那将取决于内核。在调试器中尝试一下,看看您的 OS 版本会发生什么。例如,Linux zeros integer/vector 在进入 user-space 之前注册(以避免泄漏任何内核数据),并清除 EFLAGS 中的所有条件代码标志。
将寄存器(包括条件标志)想象成在 C 中未初始化的局部变量。(除了 asm 没有未定义的行为;你可以读取之前代码留下的任何垃圾在寄存器中,只是不能保证值是多少。)
这就是为什么这段代码使用cmp
在运行jnz
之前设置包括ZF在内的FLAGS,所以之前有什么并不重要。
像 mul
这样留下一些标志“未定义”的指令将根据任何给定的某些内部条件将其设置为某个值 CPU,手册只是不保证不同 CPU秒。例如在某些 CPU 上,mul
可能总是清除 ZF。在其他人身上,它可能会根据低或高的一半或整个事物设置为零。 (或者它可能 通常 会这样做,但有时不会,这取决于微体系结构条件。)缺乏记录的保证意味着试验看看实际发生的事情是 而不是 一种编写可移植代码的安全方法。
但是无论发生什么,即使在像 mul
这样的指令之后,ZF 也将是 0 或 1,并且不会例如在 mul 完成后更改几条指令。