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 位长。
简单的写数字如dah
a7h
,e0h
等,必须写成0
.
在您看来,您应该自动删除多余的零。
要区分符号(即变量)和数字,您必须以十进制数字开头数字。
mov ecx 的数字参数始终存储为 32 位,无论您在代码中写入的数字是多少(只要最终值小于 2^32)。忽略前导零。
与 C/C++ 相比,以 0 开头的数字不会被解释为八进制数字(如果这是您的顾虑)。八进制数以0t开头。
我读了 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 位长。
简单的写数字如dah
a7h
,e0h
等,必须写成0
.
在您看来,您应该自动删除多余的零。
要区分符号(即变量)和数字,您必须以十进制数字开头数字。
mov ecx 的数字参数始终存储为 32 位,无论您在代码中写入的数字是多少(只要最终值小于 2^32)。忽略前导零。
与 C/C++ 相比,以 0 开头的数字不会被解释为八进制数字(如果这是您的顾虑)。八进制数以0t开头。