【发布时间】:2018-12-09 18:27:03
【问题描述】:
我有一个学校作业,要求我以三种不同的方式将单词从小端转换为大端。其中之一是使用乘法和除法。我知道向左移动会使数字乘以 2,但我仍然不知道如何利用它。
这是我使用旋转做的。有人可以帮我踩一下,用除法和乘法来做吗?
.data
.text
.globl main
main: li $t0,0x11223344 #number to be converted in t0
rol $t1,$t0,8
li $t2,0xFF00FF00 #mask in $t2
and $t3,$t1,$t2
ror $t1,$t0,8
li $t2,0x00FF00FF #mask in $t2
and $t1,$t1,$t2
or $t3,$t3,$t1
ror $t3,$t3,16
li $v0,10
syscall
我似乎无法正确地将旋转转换为移位。我正在为 rol $t1,$t0,8 做:
#rol $t1,$t0,8
loop: beq $t1,8,exit #branch to exit if t5=8
addi $t5,$t5,1 #t5++
srl $t1, $t0, 1 #shift original word 1 bit to the right
sll $t2, $t0, 31 #shift original word 31 bits to the left
or $t1, $t1, $t2
但它不正确。
感谢您的帮助,谢谢。
【问题讨论】:
-
首先将您的代码转换为移位而不是旋转。然后将您的班次转换为乘法/除法。
-
@Jester 我无法正确地将其转换为班次。我上传了我的尝试。
-
从头开始使用旋转确实没有意义,因此您可以从头开始编写带有移位的代码。
out=(in << 24) | ((in & 0xff00) << 8) | ((in & 0xff0000) >> 8) | (in >> 24).
标签: assembly endianness bit-shift multiplication