X86 endian ness与寄存器位比较的相互作用

X86 endian ness与寄存器位比较的相互作用,x86,X86,我相信这段代码是有效的,但它似乎真的不应该,除非将ax与0000 1010而不是1010 0000进行比较。数据是以小端还是大端的格式存储不是很重要吗 以下是相关的代码: mov al, es:100h mov ah, 0 and ax, 0A0h cmp ax, 20h ... ax的值不是这样的吗: mov al, es:100h ; ax = ???? ???? mov ah, 0 ; ax = 0000 ???? and ax,

我相信这段代码是有效的,但它似乎真的不应该,除非将ax与0000 1010而不是1010 0000进行比较。数据是以小端还是大端的格式存储不是很重要吗

以下是相关的代码:

mov    al, es:100h
mov    ah, 0
and    ax, 0A0h
cmp    ax, 20h
...
ax的值不是这样的吗:

mov    al, es:100h  ; ax = ???? ????
mov    ah, 0        ; ax = 0000 ????
and    ax, 0A0h     ; ax = 0000 0000 or ax = 0000 ?0?0
cmp    ax, 20h      ; only useful if ax = 0000 ?0?0
...
显然这里有一条规则我不知道。一个解释会非常有用


编辑:我应该提到,我一直在寻找答案,但没有找到答案。例如,这个线程只会使代码看起来更像是错误的。但我很有信心它是有效的:

只有当从内存中获取多字节值时,Endian属性才起作用。在您的示例中,第一行从内存中获取一个字节,因此endian的长度不是问题

在汇编中硬编码常量时,它们从左到右读取,就像普通数字一样。因此,常数
0A0h
00000000
作为高字节(对应于
ah
),将
10100000
作为低字节(对应于
al

您似乎对寄存器中的位数感到困惑
AX
是一个16位寄存器。因此,使用二进制注释代码时,注释应该是

mov    al, es:100h  ; ax = ???? ???? ???? ????
mov    ah, 0        ; ax = 0000 0000 ???? ????
and    ax, 0A0h     ; ax = 0000 0000 ?0?0 0000
cmp    ax, 20h      ; compare with 0000 0000 0010 0000

我认为这里没有问题。你的第一个指示是:

mov    al, es:100h
这将在最低有效字节中存储任意值。接下来你要做:

mov    ah, 0
这会将最高有效字节归零。因此,
ax
介于
0
0xff
之间

现在,您可以使用值
0xA0
对其执行
操作:

and    ax, 0A0h
最后比较
ax
寄存器与
0x20
值:

cmp    ax, 20h
在这一系列操作中,endianness因子在任何时候都没有发挥作用。考虑:

mov    al, es:100h ;         ax = ???? ???? ???? ????
mov    ah, 0       ;         ax = 0000 0000 ???? ????
and    ax, 0A0h    ;         ax = 0000 0000 ?0?0 0000
cmp    ax, 20h     ; compare with 0000 0000 0010 0000
或者,我们可以使用反转的字节写入,以便最高有效字节位于右侧:

mov    al, es:100h ;         ax = ???? ???? ???? ????
mov    ah, 0       ;         ax = ???? ???? 0000 0000
and    ax, 0A0h    ;         ax = ?0?0 0000 0000 0000
cmp    ax, 20h     ; compare with 0010 0000 0000 0000

正如您所看到的,无论端点如何,您都应该得到完全相同的结果。

AFAICT,
mov-ah,0
cmp
后的标志没有影响。
ax
的上半部分已经被
和ax,0A0h
归零


根据您希望分支的条件,
设置的标志可能就足够了。您遗漏了下一条指令,因此我们无法告诉您代码实际在测试什么,以及是否可以仅使用
测试而不是
和/cmp

来完成。实际上,根据
cmp
之后测试的标志,它可以执行多个操作。e、 g.
jg
将在
al
0x80
0xA0
时分支<如果设置了任何一位,code>jge
将进行分支(在这种情况下,
cmp
是冗余的,并且
jnz
之后,或者在
测试al之后,0A0h
将进行分支。)@PeterCordes很好的一点,我将最后的注释更改为更通用的:)