x86 程序集中符号扩展中的前导零?

use*_*613 2 binary x86 assembly hex unsigned

我阅读了 Kip IRVINE 的著作《x86 处理器汇编语言》,他写道:

将较小的值复制到较大的值

尽管 MOV 不能直接将数据从较小的操作数复制到较大的操作数,但程序员可以创建变通方法。假设计数(无符号,16 位)必须移动到 ECX(32 位)。我们可以将 ECX 设置为零并将计数移动到 CX:

.data
count WORD 1
.code
mov ecx,0
mov cx,count
Run Code Online (Sandbox Code Playgroud)

如果我们用一个等于 -16 的有符号整数尝试相同的方法会发生什么?

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

ECX 中的值 (+65,520) 与 -16 完全不同。另一方面,如果我们先用 FFFFFFFFh 填充 ECX,然后将 signedVal 复制到 CX,则最终值将是正确的:

mov ecx,0FFFFFFFFh
mov cx,signedVal ; ECX = FFFFFFF0h (-16)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*oom 5

为了区分标签数字文字,大多数汇编程序要求后者始终以数字开头,即使它只是一个非有效零。

如果您计算其中有效的 十六进制数字的数量,0ffffffffh您会发现它们确实是八位,每一位都携带四位信息。
8 乘以 4 是 32。
你的文字fffffffffh长度是 36 位。

简单地说,诸如dah a7he0h等等之类的数字必须以 开头0
在您看来,您应该自动摆脱多余的零。