这可能是非常愚蠢的事情,但我想问这个问题是为了澄清我的想法。
我正在做伟大的68k装配教程(link)。 Evrything顺利,但我不明白一件事。我来引用一下:
您可以使用一个数据寄存器作为移位大小进行移位,例如:
lsl.l d0,d1
现在在这个例子中,d1向左移动了d0中的数字。 我们假装d0包含0000010F。
对于源操作数,只读取一个字节作为移位计数。以来 d0包含0000010F,仅使用0F。所以,d1的长词是 向左移动0F位。
您可以移动的最大位数取决于您的大小 选择:
.b for byte gives a maximum shift of $08 bits. .w for word gives a maximum shift of $10 bits. .l for long-word gives a maximum shift of $1F bits.
这就是:为什么对于字节和16位字操作,您可以使用全长(字节为0x08,16位字为0x10)和32位长字仅为0x1F?那么32位长字不应该是0x20吗?
无论如何,我没有看到一个点8位字节,因为这将总是给出0x00作为结果。
在本教程中,我仍然不能理解这个例外。
任何有帮助的帮助。
答案 0 :(得分:0)
移位大小最多只能使用0x1F,因为长字中有32位,因此只有31位可以在完全耗尽位置之前将最低位移位
至于为什么处理器或至少汇编器不接受0x20作为要移位的位数,这是设计芯片或汇编器的设计决定。请记住,如果汇编程序是守门员,除非您手动编辑二进制文件。如果汇编程序不接受代码,除非您手动编辑二进制文件,否则芯片是否接受它并不重要。