簡體   English   中英

如何在摩托羅拉68000組裝中將奇數變為偶數,反之亦然?

[英]How can I turn an odd number even, or vice versa, in Motorola 68000 Assembly?

基本上如果我在D1中有一個數字,並希望它始終是均勻的,我怎么能確保它永遠不會奇怪?

我知道它與AND指令有關。 但是當我嘗試它時,它總是會減去1.所以它會將奇數偶數和奇數偶數。

if n is odd, sub 1我怎么能基本做到

and您的電話號碼-2

在2的補碼表示中-2是一個數字,除了最低位(11111 ... 110)之外,所有位都設置為1,因此,用作掩碼時,它總是只會殺死數字的低位。 這迫使它變得均勻(即使對於負數也能正常工作)。


至於標題中的“反之”:相反(=強制每個偶數到下一個奇數),只是or 1 這將低位設置為1,從而獲得所需的效果。

奇數以二進制1結尾,偶數以二進制結尾為0 你真正想要的是使最后一個二進制數字為0 ,無論它是什么開始。 (這將從奇數中減去1,並保持偶數不變。)

這樣做的方法是AND與1111...1110 ,其中所有二進制數字都是1除了最后一個數字,即0 你可以通過對0000...0001進行逐位否定來構造它,當然這只是1

因此,如果您的數字是n ,則需要計算n & (~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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM