1

私はMIPSの使用に不慣れで、ハミング距離を計算しようとしています。ただし、レジスタ$ t3でも正しいXOR結果が得られます。これを10進数で出力すると、間違った数値が得られます。

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

これらの2つの単語をXORすると、結果は次のようになります。

ffeff0fe

私の質問は、10進数で計算するにはどうすればよいですか?画面に印刷しようとしたところ、正しい26ではなく-1052418が表示されたため

これが私の完全なコードです

    .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

異なる値を持つビット数ではなく、2つの値のxorを出力しています。ハミング距離を計算するために必要なことは、たとえば次のコードを使用して、その数をカウントすることです。

    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 syscall

。データ

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