1

我是使用 MIPS 的新手,我尝试计算汉明距离。然而,即使寄存器 $t3 具有正确的 XOR 结果,当我以十进制打印它时,我得到一个错误的数字。

word1:      .word 0xffeff0ff
word2:      .word 0x00000001

当我对这两个词进行异或运算时,结果是:

ffeff0fe

我的问题是如何以十进制计算?因为我试图在屏幕上打印它,我得到 -1052418 而不是正确的 26

这是我的完整代码

    .text       
        .globl __start 
__start:            
    la $a1,word1
    lw $t1,0($a1)       
    la $a1,word2
    lw $t2,0($a1)       
    xor $t3,$t1,$t2
    la $a0,answer       
    li $v0,4
    syscall         
    move $a0,$t3        
    li $v0,1
    syscall
    la $a0,endl     
    li $v0,4
    syscall         
EXIT:   li $v0,10
    syscall         

    .data
word1:      .word 0xffeff0ff
word2:      .word 0x00000001
answer:     .asciiz "Hamming distance is : "
endl:       .asciiz "\n"
4

2 回答 2

1

您正在打印两个值的异或,而不是具有不同值的位数。计算汉明距离所需要做的是计算该数字,例如使用以下代码:

    move $a0, $zero    # $a0 will hold the result
loop:
    bgez $t3, skip     # test the most significative bit of $t3
    sll $t3, $t3, 1    # (*) [NOTE below] shift left $t3 one bit
    addiu $a0, $a0, 1  # If bit was set, increment result
skip:    
    bnez $t3, loop     # loop while not done
    nop                # this nop is due to delayed branching

此代码段假定您的 MIPS 处理器已延迟分支。如果不是这种情况,您必须在标签跳过后移动标有(*)的指令。如果您没有延迟分支或下一条指令没有副作用,则可以删除 nop。

此代码应该代替您放置的行move $a0,$t3

于 2012-06-25T15:14:10.830 回答
-1

。文本

.globl __start

__开始:

lbu $t0 , B
lbu $t1 , B1

xor  $s0 , $t0 , $t1
addi $s1 , $s1 , 7      # pointer for swift
add $s2 , $zero , $zero # pointer for loop

环形:

srl $t7 , $s0 , $s1 # swift
sll $t7 ,  $t7 , 31   
slt $t7 , $t7 , -1 

la $a0 , 0($t7)
li $v0 , 1
syscall
la $a0 , str
li $v0 , 4
syscall 

addi $s2 , $s2 , 1    #loop
addi $s1 , $s1 , -1   #swift

beq $s2 , 8 , exit
j loop

退出:li $v0 , 10 系统调用

。数据

B:  .byte 3
B1: .byte 1
str: .asciiz "\n"
于 2019-04-21T12:34:41.687 回答