Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在摩托罗拉68000组件中,如何将奇数变为偶数,或将奇数变为偶数?_Assembly_Bit Manipulation_68000_Easy68k - Fatal编程技术网

Assembly 在摩托罗拉68000组件中,如何将奇数变为偶数,或将奇数变为偶数?

Assembly 在摩托罗拉68000组件中,如何将奇数变为偶数,或将奇数变为偶数?,assembly,bit-manipulation,68000,easy68k,Assembly,Bit Manipulation,68000,Easy68k,基本上,如果我在D1中有一个数字,并且希望它总是偶数,我如何确保它从不奇数 我知道这和学习和指导有关。但当我试着这样做时,它总是减去1。所以它会把奇数变成偶数,把偶数变成奇数 如果n是奇数,sub 1以二进制形式以1结尾,而偶数以二进制形式以0结尾,我该怎么做呢。您真正想要的是将最后一个二进制数字设置为0,而不管它的开头是什么。(这将从奇数中减去1,并保持偶数不变。) 执行此操作的方法是使用1111…1110,其中除最后一个数字0外,所有二进制数字都是1。您可以通过对0000…0001执行位求反

基本上,如果我在D1中有一个数字,并且希望它总是偶数,我如何确保它从不奇数

我知道这和学习和指导有关。但当我试着这样做时,它总是减去1。所以它会把奇数变成偶数,把偶数变成奇数


如果n是奇数,sub 1以二进制形式以
1
结尾,而偶数以二进制形式以
0
结尾,我该怎么做呢。您真正想要的是将最后一个二进制数字设置为
0
,而不管它的开头是什么。(这将从奇数中减去1,并保持偶数不变。)

执行此操作的方法是使用
1111…1110
,其中除最后一个数字
0
外,所有二进制数字都是
1
。您可以通过对
0000…0001
执行位求反来构造此函数,当然这只是
1


因此,如果您的号码是
n
,您需要计算
n&(~1)
,并使用
-2
计算您的号码

在2的补码表示法中-2是一个数字,除最低的一位(11111…110)外,所有位都设置为1,因此,用作掩码时,它总是只杀死数字的低位。这将强制它为偶数(即使对于负数,它也能正常工作)



至于标题中的“viceversa”:要做相反的事(=将每个偶数强制到下一个奇数),只需
使用
1
。这将低位设置为1,从而获得所需的效果

对于16位数字,请执行以下操作:

EvenNumber = (D1 & 0xFFFE);

68000 CPU实际上有单独的位设置和位清除命令。在类似您的情况下,显式清除操作数的第0位而不恢复为布尔逻辑可能更简单、更清晰:

bclr.l #0,d0
而不是

and.l $fffffffe,d0

您只需要清除底部的位,因此尽管其他人使用了长单词指令,但使用AND的字节形式并没有什么错

AND.B #0xFE, D1   ; make even
OR.B  #0x01, D1   ; make odd
XOR.B #0x01, D1   ; toggle even/odd
无论D1中的值大小(字节、字或长字),您仍然清除了底部位,并保持寄存器中所有其他位不变

或者

BCLR #0,D1  ; make even
BSET #0,D1  ; make odd
BCHG #0,D1  ; toggle even/odd 
所以它会将奇数变为偶数,偶数变为奇数:不能设置位,只能清除位或保持位不变,所以它不能使偶数变为奇数。因此,您的尝试和一定有一个错误,使它做了其他事情。(带1的异或将翻转低位,在奇数和偶数之间翻转。因此将加1,但这将进入高位。)无论如何,希望通过这些答案+easy68k内置的调试器,您可以整理出您实际执行的操作。“…和指令。但当我尝试时,它总是减去1。”-这简直是不可能的。如果你真的相信这一点,你应该试着产生一个,但是你应该弄清楚,
并不总是减去1(例如
(12和254)=12
…只有像
(13和254)=12这样的情况可能看起来像是1的减法)。