Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly “计算汉明距离”使用MIPS打印错误的十进制,但正确的十六进制_Assembly_Mips - Fatal编程技术网

Assembly “计算汉明距离”使用MIPS打印错误的十进制,但正确的十六进制

Assembly “计算汉明距离”使用MIPS打印错误的十进制,但正确的十六进制,assembly,mips,Assembly,Mips,我在使用MIPS方面是新手,我尝试计算汉明距离。然而,即使是寄存器$t3也有正确的异或结果,当我以十进制打印它时,我得到了一个错误的数字 word1: .word 0xffeff0ff word2: .word 0x00000001 当我对这两个词进行异或运算时,结果是: ffeff0fe 我的问题是如何用十进制计算它? 因为我试着在屏幕上打印它,我得到了-1052418而不是正确的26 这是我的完整代码 .text .globl _

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

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"

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

    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

.text的行中,而不是该行

.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
循环:

出口: 李$v0,10 系统调用

.数据

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
B:  .byte 3
B1: .byte 1
str: .asciiz "\n"