H mmm, không biết chuyện gì đã xảy ra, nó đã gửi câu trả lời của tôi trước khi tôi thực sự bắt đầu.
Lúc đầu, tôi không nghĩ rằng tôi có thể làm điều đó chỉ với hai thanh ghi nhưng sau đó tôi quyết định tôi có thể và đã làm. Các giải pháp này chỉ đăng ký, không có bộ nhớ (trừ ldr r0, = bạn có thể thay thế bằng bốn hướng dẫn). Nếu bạn sử dụng bộ nhớ và hmmm, hai thanh ghi bạn có thể cắt giảm số lượng các lệnh có thể, str, bic, bic, ldrb, lrr lr, ldrb, orr lsl. Được rồi tôi đã làm nó trong một hướng dẫn ít hơn nhưng sau đó bạn cần vị trí bộ nhớ và các cửa hàng và tải chu kỳ chi phí để cùng một số lượng bộ nhớ và chu kỳ hơn cho tôi để làm điều đó với bộ nhớ. Người khác có thể có một số thủ đoạn tốt. Tôi nghĩ rằng một số lõi mới hơn có một lệnh trao đổi cuối cùng mà sẽ làm cho nó dễ dàng hơn.
.globl midswap
midswap:
mov r2,r0,lsl #8 ;@ r2 = BBCCDDAA
mov r3,r0,lsr #8 ;@ r3 = DDAABBCC (this might drag a sign bit, dont care)
and r2,r2,#0x00FF0000 ;@ r2 = 00CC0000
and r3,r3,#0x0000FF00 ;@ r3 = 0000BB00
bic r0,r0,#0x00FF0000 ;@ r0 = AA00CCDD
bic r0,r0,#0x0000FF00 ;@ r0 = AA0000DD
orr r0,r0,r2 ;@ r0 = AACC00DD
orr r0,r0,r3 ;@ r0 = AACCBBDD
bx lr ;@ or mov pc,lr for older arm cores
.globl tworegs
tworegs:
mov r2,r0,ror #8 ;@ r2 = DDAABBCC
bic r2,r2,#0xFF000000 ;@ r2 = 00AABBCC
bic r2,r2,#0x00FF0000 ;@ r2 = 0000BBCC
orr r2,r2,ror #16 ;@ r2 = BBCCBBCC
bic r2,r2,#0xFF000000 ;@ r2 = 00CCBBCC
bic r2,r2,#0x000000FF ;@ r2 = 00CCBB00
bic r0,r0,#0x00FF0000 ;@ r0 = AA00CCDD
bic r0,r0,#0x0000FF00 ;@ r0 = AA0000DD
orr r0,r0,r2 ;@ r0 = AACCBBDD
bx lr
testfun:
ldr r0,=0xAABBCCDD
bl midswap
Uh, không phải là sử dụng hằng số 32 bit, trong ví dụ đầu tiên? Gây nhầm lẫn. – unwind
Có, đây là những hằng số 32 bit, nhưng nếu bạn nhìn kỹ hơn thì chúng chỉ có 8 bit liên tiếp được sử dụng trong các hằng số của chúng. ARM có thể làm 8 bit, nhưng vị trí của chúng có thể được tự do xoay vào vị trí bạn muốn. Bộ lắp ráp đủ thông minh để mã hóa các hằng số cho bạn. –
mọi vị trí * ngay cả * bạn muốn; Ví dụ: 0x1fe không phải là biểu tượng có thể hiển thị, nhưng 0x3fc là. –