Выполнение сложения по модулю 2 в MIPS, 32-битные целые числа - PullRequest
1 голос
/ 27 мая 2020

Продолжение до this

Я выяснил, что пошло не так в связанном сообщении. Блоки Sigma0 и Sigma1 не делали того, что должны: сложение по модулю 2 повернутых версий A или E. В основном, это должно работать следующим образом: enter image description here

Notice что если количество бит в позиции четное, результат будет 0, если нечетный - 1. Для этого я сделал таблицу истинности и карты Карно:

LINK

Я упростил получившееся выражение до

!A!BC + A(B XNOR C)

И попытался применить его к Sigma0 и Sigma1. Но это не работает.

Для Sigma1 повернутые значения и их сумма по модулю 2 должны быть следующими:

01010011011101100111101111111101
11101010100110111011001111011111
11001111011111111010101001101110
--------------------------------
01110110100100100110001001001100

Но результат

01010110000100100110001001001100

Сравнение значение, которое я получил на бумаге с этим:

01110110100100100110001001001100
01010110000100100110001001001100

Close ... Может ли кто-нибудь помочь мне выяснить, что пошло не так?

Мой код

.data

    A:      .word   0x87564C0C
    B:      .word   0xF1369725
    C:      .word   0x82E6D493
    D:      .word   0x63A6B509
    E:      .word   0xDD9EFF54
    F:      .word   0xE07C2655
    G:      .word   0xA41F32E7
    H:      .word   0xC7D25631
    W:      .word   0x6534EA14
    K:      .word   0xC67178F2



.text
.globl  main

main:

    li  $s0,0   #loop counter
    li  $s1,64  #loop limit

    main_loop:
        bge $s0,$s1,end_main_loop

            jal box_0
            move    $a0,$v0 #save return value in $a0 to be used as argument by box_1

            jal box_1
            move    $a0,$v0 #

            jal box_2
            move    $a0,$v0 #
            move    $s2,$a0 #will be necessary for the input of box_4 later

            jal box_3
            move    $s3,$v0 #Will be assigned to E later

            jal box_4
            move    $a0,$v0 #

            jal box_5
            move    $s4,$v0 #Will be assigned to A later


            ###Assignments

            lw  $a0,G
            la  $a1,H
            sw  $a0,($a1) #Old G goes into new H

            lw  $a0,F
            la  $a1,G
            sw  $a0,($a1)   #Old F goes into new G

            lw  $a0,E
            la  $a1,F
            sw  $a0,($a1)   #Old E goes into new F

            #

            la  $a1,E
            sw  $s3,($a1)   #Output of box_3 goes into new E

            #

            lw  $a0,C
            la  $a1,D
            sw  $a0,($a1)   #Old C goes into new D

            lw  $a0,B
            la  $a1,C

            sw  $a0,($a1)   #Old B goes into new C

            lw  $a0,A
            la  $a1,B

            sw  $a0,($a1)   #Old A goes into new B

            #

            la  $a0,A
            sw  $s4,($a0)   #Output of box_5 goes into new A


            addi    $s0,$s0,1   #increment loop counter

            #j  main_loop



    end_main_loop:

        li  $v0, 10          # terminate program
        syscall


.text
.globl red_boxes

red_boxes:

box_0:

    lw  $t0,W
    lw  $t1,K

    addu    $t0,$t0,$t1 #Wt + Kt

    move    $v0,$t0

    jr  $ra


box_1:  




    addi $sp, $sp, -4
    sw $ra, ($sp)
    jal Ch  
    move    $t1,$v0


    move    $t0,$a0     #output of box_0

    lw  $t3,H

    addu    $t0,$t0,$t1
    addu    $t3,$t0,$t3

    move    $v0,$t3

    lw $ra, ($sp)
    addi $sp, $sp, 4

    jr  $ra

box_2:


    addi $sp, $sp, -4
    sw $ra, ($sp)
    jal Sigma1
    move    $t1,$v0

    move    $t0,$a0     #output of box_1

    addu    $t0,$t0,$t1

    move    $v0,$t0

    lw $ra, ($sp)
    addi $sp, $sp, 4

    jr  $ra

box_3:

    move    $t0,$a0     #output of box_2

    lw  $t1,D

    addu    $t0,$t0,$t1

    move    $v0,$t0

    jr  $ra

box_4:

    addi $sp, $sp, -4
    sw $ra, ($sp)

    jal Ma
    move    $t1,$v0

    move    $t0,$a0     #output of box_2 

    addu    $t0,$t0,$t1 

    move    $v0,$t0

    lw $ra, ($sp)
    addi $sp, $sp, 4

    jr  $ra

box_5:

    addi $sp, $sp, -4
    sw $ra, ($sp)

    jal Sigma0  
    move    $t1,$v0

    move    $t0,$a0     #output of box_4

    addu    $t0,$t0,$t1

    move    $v0,$t0

    lw $ra, ($sp)
    addi $sp, $sp, 4

    jr  $ra

.text
.globl op_boxes

op_boxes:

Ch:
#           (G&!E) || (F&E)

            lw  $t0,E
            lw  $t1,F
            lw  $t2,G


            and $t1,$t1,$t0 #(F&E)
            not $t0,$t0     #!E
            and $t2,$t2,$t0 #(G&!E)

            or  $t0,$t1,$t2 #(G&!E) || (F&E)

            move    $v0,$t0 

            jr  $ra

Sigma1:

            lw  $t0,E       #Sigma1

            ror $t1,$t0,6   #rotates E to the right by 6 bits   X
            ror $t2,$t0,11  # '''           by 11 bits  Y
            ror $t3,$t0,25  # '''           by 25 bitsZ

            #!X!YZ + X( Y XNOR Z)

            not $t4,$t1 #!X
            not $t5,$t2 #!Y

            and $t5,$t5,$t4 #!X!Y
            and $t6,$t5,$t3 #(!X!Y)Z

            subu    $sp,$sp,4      # push !X!YZ onto stack
                sw      $t6,($sp)

            xor $t4,$t2,$t3 #Y XOR Z
            not $t4,$t4     #Y XNOR Z

            and $t4,$t4,$t1 #X( Y XNOR Z)

            lw      $t3,($sp)      # pop !X!YZ
                addu    $sp,$sp,4

                or  $t3,$t3,$t4 #!X!YZ + X(Y XNOR Z)

            move    $v0,$t3

            jr  $ra

Ma:

#           majority = (A&B) | (B&C)    

            lw  $t0,A                       
            lw  $t1,B
            lw  $t2,C

            or $t3, $t0, $t2
            and $t1, $t1, $t3
            and $v0, $t0, $t2

            or $v0, $t1, $v0

            jr  $ra

Sigma0:

#Same as Sigma1 but shifted by different values
            lw  $t0,A       #Sigma0

            ror $t1,$t0,2   #X
            ror $t2,$t0,13  #Y
            ror $t3,$t0,22  #Z

            #!X!YZ + X( Y XNOR Z)

            not $t4,$t1 #!X
            not $t5,$t2 #!Y

            and $t5,$t5,$t4 #!X!Y
            and $t6,$t5,$t3 #(!X!Y)Z

            subu    $sp,$sp,4      # push !X!YZ onto stack
                sw      $t6,($sp)

            xor $t4,$t2,$t3 #Y XOR Z
            not $t4,$t4     #Y XNOR Z

            and $t4,$t4,$t1 #X( Y XNOR Z)

            lw      $t3,($sp)      # pop !X!YZ
                addu    $sp,$sp,4

                or  $t3,$t3,$t4 #!X!YZ + X(Y XNOR Z)


            move    $v0,$t3

            jr  $ra

РЕДАКТИРОВАТЬ: Я думаю, что нашел это .... в таблице истинности была небольшая ошибка. Мне нужно сделать это снова. Если кто-то хочет сэкономить мне много времени и хлопот и опередить меня, будь моим гостем.

РЕДАКТИРОВАТЬ: Боже, я сделал это !! Подумать только, я целый день возился с этим, когда мне требовались только инструкции. Я чувствую себя таким идиотом.

В основном это делается с помощью X xor Y xor Z.

...