从用户输入n创建大小为n的数组

时间:2017-09-23 23:19:37

标签: arrays assembly mips

对于这个赋值,我需要能够根据用户输入的值从0到50创建一个大小为n的数组。到目前为止,这是我在下面所做的。如果您对整体问题有任何建议,那将非常有帮助。

a)提示用户输入0到50之间的整数。如果用户输入0,则程序停止。

b)否则,程序将从0到输入值的数字存储到存储器中的字数组中,即用0到N的值初始化数组,其中N是用户输入的值。

c)然后程序将数组中所有项目的值加到一起(最多为N),方法是将它们从主存储器中加载,然后将它们相加,然后用消息打印出总和"从0到N的整数是:"。例如,如果用户输入5作为输入,则程序打印出" 0到5之间的整数之和为15"。

在截止日期前将您的工作作为电子教学大纲中指定的zip文件提交。

.data 
userPrompt : .asciiz "enter in an integer from zero to fifty  "
zeroMessage : .asciiz " you have entered a zero , the program will close "
incorrectEntry : .asciiz " you have entered in a value greater than 50 , 
this is an incorrect value"

InputVal : .word

upperLim : .word 50

Array : .space InputVal



.text 

main: 
    addi $t7  , $zero , 50

    li $v0, 4 # load for printing of strings 
    la $a0, userPrompt
    syscall

# take in user input and move the read in number to a temp
    li $v0, 5 
    la $t0 , InputVal   
    syscall


   # Store int A into memory 
    move $t0 , $v0
    beq $t0 , $0 , numbersEqual


    la $t1 , upperLim

    li $v0 , 1
    move $a0 , $t1
    syscall


    slt $t3 ,$t0 , $t1
    sw $t0 , InputVal

    #beq $t3 , $0 , ELSE





ELSE :
    li $v0 , 4 
    la $a0 , incorrectEntry
    syscall
    li $v0 , 10
    syscall


numbersEqual: 

    li $v0 , 4 
    la $a0 , zeroMessage
    syscall
    li $v0 , 10
    syscall

1 个答案:

答案 0 :(得分:1)

汇编语言是机器代码的符号语言,机器代码是CPU可以执行的。

运行汇编程序编译源代码后,您将获得机器代码,这是最终的。然后执行该机器代码。

.word 0x12345678不是CPU的指令,而是汇编程序的指令,它告诉它在机器代码的那个地方保留整个word内存,并存储0x12345678的值那里。我不确定没有值的.word是什么,是否会保留至少一个字,你应该InputVal: .word 0来确定。

在最终的机器代码中没有" .word",这不是CPU指令,只有那4个字节及其各自的值形成{{1} }值,在某个地址,汇编程序已知为符号word(在此文本形式中,它也不再是机器代码的一部分,使用此存储器地址的任何指令只有正确的地址在其中编码为数字值,可执行二进制文件可能包含某种操作系统的重定位表,以便在执行之前将机器代码加载到目标内存后正确地修补地址。)

现在这可能听起来很明显,但是了解差异,CPU已经执行机器代码时可用的内容以及汇编程序编译时可用的内容非常重要(代码不是正在运行。)

InputVal无法正常工作,因为Array : .space InputVal是内存地址的符号。因此指令InputVal将保留bazillion字节(内存地址的值.space),或者更有可能编译失败。你想要的是InputVal的内存内容,但目前还不知道,因为代码没有运行,用户没有输入任何东西,它仍然只是装配步骤。所以价值不知道,你可以写InputVal。但这不会留下空间。

除非你想深入研究动态内存分配,否则有一个简单的方法可以解决这种情况,这种情况可以在你的特定情况下使用。如果您将读取任务,则只有当输入的值为0到50时,N才有效(其他任何内容都是用户错误,您可以退出)。因此,对于最大N = 50,您将需要51个值的数组,并且您将永远不需要更多。

因此,您只需执行以下操作即可避免所有动态内存分配(在运行时):

Array: .space 0

这将为您的机器代码保留数据区中的204字节(51个字)的内存,符号 .align 4 # make sure the reserved space is word-aligned Array: .space (51*4) 指向它的第一个字节。

现在您已预留了内存,您可以将值存储到其中并使用它。如果您希望在运行时改变主意,并使用52个字的内存,那么您对此类代码运气不佳。然后,您需要编写动态分配代码,或者在编译期间增加硬件大小的固定缓冲区。

此外,您的代码在Array中始终有51个字,因此您的代码只能使用输入的N + 1值。如果用户输入N = 5,那么你应该只工作超过6个字(24个字节),忽略剩余的保留字。)

因此代码中的每个循环都类似于Array,其中for (i = 0; i <= N; ++i) Array[i] = i;是用户在运行时输入的值(将其存储到N保留内存,因此您可以随时访问它你需要它,在编译时不知道。