แอสเซมบลี MMIX (28 ไบต์)
หมายเลข 64 บิต
rbit:
SETH $1,#0102 # load matrix in 16-byte steps
ORMH $1,#0408
ORML $1,#1020
ORL $1,#4080
MOR $0,$1,$0 # multiplication 1
MOR $0,$0,$1 # multiplication 2
POP 1,0 # return
แอสเซมบลีนี้เพื่อ:
rbit:
E0010102 # SETH $1,#0102
E9010408 # ORMH $1,#0408
EA011020 # ORML $1,#1020
EB014080 # ORL $1,#4080
DC000100 # MOR $0,$1,$0
DC000001 # MOR $0,$0,$1
F8010000 # POP 1,0
มันทำงานยังไง?
MOR
คำแนะนำและดำเนินการคูณเมทริกซ์สองจำนวน 64 บิตใช้เป็นสอง 8x8 เมทริกซ์บูลี หมายเลขบูลีนที่มีดิจิต abcdefghklmnopqr 2ถูกใช้เป็นเมทริกซ์ดังนี้:
/ abcd \
| efgh |
| klmn |
\ opqr /
MOR
คำแนะนำคูณเมทริกซ์ที่แสดงโดยขัดแย้งของพวกเขาที่คูณและนอกจากเป็นand
or
มันคือ:
/ 0001 \ / abcd \ / opqr \
| 0010 | \/ | efgh | -- | klmn |
| 0100 | /\ | klmn | -- | efgh |
\ 1000 / \ opqr / \ abcd /
และนอกจากนี้:
/ opqr \ / 0001 \ / rqpo \
| klmn | \/ | 0010 | -- | nmlk |
| efgh | /\ | 0100 | -- | hgfe |
\ abcd / \ 1000 / \ dcba /
ซึ่งเป็นลำดับย้อนกลับของบิตของหมายเลขเดิม
ตัวเลข 32 บิต
หากคุณต้องการย้อนกลับของตัวเลข 32 บิตแทนหมายเลข 64 บิตคุณสามารถใช้วิธีการแก้ไขนี้:
rbit:
SETL $1,#0408 # load first matrix in two steps
ORML $1,#0102
MOR $1,$1,$0 # apply first matrix
SLU $2,$1,32 # compile second matrix
16ADDU $1,$2,$1
MOR $1,$0,$1 # apply second matrix
POP 1,0 # return
ประกอบ:
rbit:
E3010408 # SETL $1,#0408
EA010102 # ORML $1,#0102
DC010001 # MOR $1,$1,$0
3B020120 # SLU $2,$1,32
2E010201 # 16ADDU $1,$2,$1
DC010001 # MOR $1,$0,$1
F8010000 # POP 1,0
การคูณเมทริกซ์แรกนั้นใช้งานได้ดังนี้:
/ 0000 \ / 0000 \ / 0000 \
| 0000 | \/ | 0000 | -- | 0000 |
| 0001 | /\ | abcd | -- | efgh |
\ 0010 / \ efgh / \ abcd /
octabyte ที่สอดคล้องกันคือ#0000000001020408
สิ่งที่เราโหลดในสองคำสั่งแรก การคูณครั้งที่สองมีลักษณะดังนี้:
/ 0000 \ / 0001 \ / 0000 \
| 0000 | \/ | 0010 | -- | 0000 |
| efgh | /\ | 0100 | -- | hgfe |
\ abcd / \ 1000 / \ dcba /
octabyte ที่เกี่ยวข้องคือ#0102040810204080
สิ่งที่เราสร้างจากเมทริกซ์แรกเช่นนี้
SLU $2,$1,#32 # $2 = #0102040800000000
16ADDU $1,$2,$1 # $2 = $2 + $1 << 4
= $2 + #0000000010204080
# = #0102040810204080
การคูณที่สองคือธุรกิจตามปกติรหัสผลลัพธ์มีความยาวเท่ากัน (28 ไบต์)