x86 汇编中符号扩展的前导零?

Leading Zero in Sign Extension in x86 Assembly?

我读了 Kip IRVINE 的书 Assembly Language for x86 Processors 他写道:

Copying Smaller Values to Larger Ones

Although MOV cannot directly copy data from a smaller operand to a larger one, programmers can create workarounds. Suppose count (unsigned, 16 bits) must be moved to ECX (32 bits). We can set ECX to zero and move count to CX:

.data
count WORD 1
.code
mov ecx,0
mov cx,count

What happens if we try the same approach with a signed integer equal to -16?

.data
signedVal SWORD -16 ; FFF0h (-16)
.code
mov ecx,0
mov cx,signedVal ; ECX = 0000FFF0h (+65,520)

The value in ECX (+65,520) is completely different from -16. On the other hand, if we had filled ECX first with FFFFFFFFh and then copied signedVal to CX, the final value would have been correct:

mov ecx,0FFFFFFFFh
mov cx,signedVal ; ECX = FFFFFFF0h (-16)

我的问题是最后一部分。我认为上面代码的第一行我们应该写成 mov ecx,FFFFFFFFFh,而不是 0FFFFFFFFh。换句话说,什么是前导零?

为了区分标签数字文字,大多数汇编程序要求后者总是 以数字开头,即使它只是一个不重要的零。

如果您计算 0ffffffffh 重要 十六进制数字的数量,您会发现它们确实是八个,每个携带四位信息。
而 8 乘以 4 是 32.
你的文字 fffffffffh 是 36 位长。

简单的写数字如daha7h,e0h等,必须写成0.
在您看来,您应该自动删除多余的零。

要区分符号(即变量)和数字,您必须以十进制数字开头数字。

mov ecx 的数字参数始终存储为 32 位,无论您在代码中写入的数字是多少(只要最终值小于 2^32)。忽略前导零。

与 C/C++ 相比,以 0 开头的数字不会被解释为八进制数字(如果这是您的顾虑)。八进制数以0t开头。