【问题标题】:Little to big endian using multiplication and division - MIPS assembly使用乘法和除法的小端到大端 - MIPS 汇编
【发布时间】: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


【解决方案1】:

有点晚了,但我只使用乘法和除法而不是旋转和移位来制作这个程序。我希望它有所帮助。

  .data

测试:.space 4 。文本 .globl 主要 主要的: li $t0, 0x11223344

la $t1, test
sw $t0, ($t1)       

转换开始

mul $t1, $t0, 256
li $t2, 0x00FF0000 # $t2 contains mask 0x00FF0000
and $t3, $t1, $t2 # byte 2 valid
div $t1, $t0, 256
li $t2, 0x0000FF00 # $t2 contains mask 0x0000FF00
and $t1, $t1, $t2 # byte 1 valid
or $t3, $t3, $t1
mul $t1, $t0, 16777216
li $t2, 0xFF000000 # $t2 contains mask 0xFF000000
and $t1, $t1, $t2 # byte 3 valid
or $t3, $t3, $t1
div $t1, $t0, 16777216
li $t2, 0x000000FF # $t2 contains mask 0x000000FF
and $t1, $t1, $t2 # byte 0 valid
or $t3, $t3, $t1 # little endian-number in $t3
la $t1, test
sw $t3, ($t1) # store to address pointed by label test

jr $ra

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多