gpt4 book ai didi

c - MIPS 程序集 - 数组?

转载 作者:行者123 更新时间:2023-12-01 12:38:38 26 4
gpt4 key购买 nike

我对汇编编程完全陌生,并且正在尝试在 MIPS 中实现以下功能(用 C 语言):

int main()
{
int A[5]; // Empty memory region for 5 elements
int B[5] = {1,2,4,8,16};
int i;

for(i=0; i<5; i++) {
A[i] = B[i] - 1;
}

i--;
while(i >= 0) {
A[i]=(A[i]+B[i]) * 2;
i--;
}
}

到目前为止,我所拥有的是:
main:
#Register Map
#i --> $s0
#A[0] --> $s1 address of start of A
#B[0] --> $s2 address of start of B
#A[i] --> $t0
#B[i] --> $t1
#(A[i] + B[i]) --> $t2
#((A[i] + B[i]) * 2) --> $t3

li $s0, 0 #Load immediate value 0 into i

#Begin for loop:
#for(i=0; i<5; i++){ A[i] = B[i] - 1; }

FOR_LOOP:
beq $s1, $t0, END_FOR #Branch if i == 5, go to END_FOR

addi $s0, $s0, 1 #Add immediate value 1 to i (i++)
j FOR_LOOP #Jump back to the top to loop again

END_FOR: #End for loop
addi $s0, $s0, -1 #Add immediate value -1 to i (i--)

#Begin while loop:
#while(i >= 0) { A[i] = (A[i] + B[i]) * 2; i--; }

WHILE_LOOP:
blt $s1, 0, END_WHILE #Branch END_WHILE when !(i > 0)

addi $s0, $s0, -1 #Add immediate value -1 to i (i--)
j WHILE_LOOP #Branch back to the while loop

END_WHILE:
sw $s0, i #Copy value in register to memory i
li $v0, 10 #Read integer from user, returned in $v0 (10=exit)

syscall #End program

#Store A, B in memory
.data

A: .word 0:5 #Allocate 20 consecutive bytes for 5-element integer word array A
B: .word 1, 2, 4, 8, 16 #Integer words stored in 5-element array B
i: .word 1 #Initial Value 1

我的主要问题是 :
  • 我将如何访问数组的元素,或者从哪里开始 la ?
  • 我是否正确声明了数组?
  • 我的注册 map 对试图完成的事情有意义吗?

  • 感谢您的任何帮助。

    最佳答案

    .text
    main:
    #Register Map
    #i --> $s0
    #A[0] --> $s1 address of start of A
    #B[0] --> $s2 address of start of B
    #A[i] --> $t0
    #B[i] --> $t1
    #(A[i] + B[i]) --> $t3
    #((A[i] + B[i]) * 2) --> $t3
    li $s0, 0 #Load immediate value 0 into i
    li $t4,5 #upper limit
    la $s1,A #address of start of A
    la $s2,B #address of start of B

    #Begin for loop:
    #for(i=0; i<5; i++){ A[i] = B[i] - 1; }
    FOR_LOOP:
    bge $s0, $t4, END_FOR #Branch if i >= 5, go to END_FOR
    lw $t1,($s2) #$t1=B[i]
    addi $t1, $t1, -1 #$t1=B[i]-1
    sw $t1,($s1) #A[i]=B[i]-1
    addi $s1, $s1,4 #next element A[i+1]
    addi $s2, $s2,4 #next element B[i+1]
    addi $s0, $s0, 1 #Add immediate value 1 to i (i++)
    j FOR_LOOP #Jump back to the top to loop again

    END_FOR: #End for loop
    addi $s0, $s0, -1 #Add immediate value -1 to i (i--)
    addi $s1, $s1,-4 #previous element A[i-1]
    addi $s2, $s2,-4 #previous element B[i-1]

    #Begin while loop:
    #while(i >= 0) { A[i] = (A[i] + B[i]) * 2; i--; }
    WHILE_LOOP:
    blt $s0, 0, END_WHILE #Branch END_WHILE when (i < 0)
    lw $t0,($s1) #$t0=A[i]
    lw $t1,($s2) #$t1=B[i]
    add $t3, $t0,$t1 #$t3=A[i] + B[i]
    mul $t3, $t3, 2 #$t3=(A[i] + B[i]) * 2
    sw $t3,($s1) #A[i] = (A[i] + B[i]) * 2
    addi $s1, $s1,-4 #previous element A[i-1]
    addi $s2, $s2,-4 #previous element B[i-1]
    addi $s0, $s0, -1 #Add immediate value -1 to i (i--)
    j WHILE_LOOP #Branch back to the while loop

    END_WHILE:

    PRINT: #print array A[i]
    li $s0, 0 #i=0
    la $s1, A #$s1=A[0]
    LOOP:
    bge $s0, $t4, END # if i >=5 goto END
    lw $a0, ($s1) # $a0 = A[i]
    li $v0, 1 #function print integers
    syscall
    la $a0, space #print separator (1 space)
    li $v0, 4 #function print strings
    syscall
    addi $s1, $s1, 4 #next element A[i+1]
    addi $s0, $s0, 1 #i++
    b LOOP

    END:
    li $v0, 10 # $v0 (10=exit)
    syscall #End program

    #Store A, B in memory
    .data
    A: .word 0:5 #Allocate 20 consecutive bytes for 5-element integer word array A
    B: .word 1, 2, 4, 8, 16 #Integer words stored in 5-element array B
    space: .asciiz " " #space as separator

    关于c - MIPS 程序集 - 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27074044/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com