2016-04-06 26 views
0

Aşağıdaki kısa örnekte, [x1] ve [x2] arasındaki kodda kullanılan yazmaç sayısını azaltmanın herhangi bir yolu var mıdır?Mikrodenetleyicide Bitsel Mantık

PINA'dan girdi okuyorum ve bazı mantıksal tablolara göre PORTB için çıktı üretiyorum. Bu, benim için bunu yapmanın en basit yoludur, ama bir tür kavşak gibi görünüyor. Farkında olmadığım daha zarif bir yol var mı? Maskenin miktarını azaltmada olduğu kadar ilgi perfomance (boşluk, hız) değilim ve daha büyük ölçekte kolayca (özensiz/pis) hataları tanıtmak işlemleri vardiya

loop: 
;Set Masks for Inputpins [x1] 
ldi r17, 0b00000010 
ldi r18, 0b00000100 
;Read Input from PINA 
in r16, PINA 
;Apply Masks and normalize 
and r17, r16 
lsl r17 
and r18, r16 
lsl r18 
lsl r18 
;Start with actual bitwise operations e.g [x2] 
mov r16, r17 
xor r16, r18 
and r16, r17 
... 
... 
out PORTB, r16 
rjmp loop 

Not.

Ayrıca, Codereview.Stackechange'un bu soru için daha uygun bir yer olup olmadığından emin olmadığımı unutmayın.

+0

Hata ile ilgileniyorsanız, neden bir derleyici kullanmıyorsunuz? – user3528438

+0

C Kodu yazmayı ve gcc -S kullanarak mı kastediyorsunuz? – Haini

+1

Belki bir şey özlüyorum, ama Maskleri uygula ve normalleştirdikten sonra 'r17' 0 veya 4'ü içerecek ve 'r18' 0 veya 16'yı içerecek gibi görünüyor. Yani 'xor r16, r18' sen ve 1'leri ortak olmayan 1'şer bit var, bu da 'xor'un bir' ya da 'gibi davranmasını sağlayacak ve bir sonraki satırdaki' ve 'anlamsız görünüyor. – Michael

cevap

0

Bu özel durumda kullanılan kayıtların sayısını azaltabileceğinizi sanmıyorum çünkü r16 içeriğini saklamak istediğiniz gibi görünüyor.

Bunu yapmak istemediyseniz, bit maskelerini anında veri olarak yüklemek için andi talimatını kullanabilirsiniz.

+0

Sbrs ve sbrc işlemleri, sadece daha basit maskeleme durumları için oldukça kullanışlıdır. Bunu gelecekteki ziyaretçiler için eklemek. – Haini