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

问题描述:

对于此任务,我需要能够根据用户从0到50的输入值创建一个大小为n的数组。到目前为止,这是以下所做的。如果您对整体问题有任何建议,那也会非常有帮助。从用户输入n创建一个大小为n的数组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到N存储到大小为N的数组中。只需尝试N = 2:现在您的数组大小为2 {[..],[..]} ..现在尝试将值0,1,2置入(没有一些压缩方案)。无法完成。你需要N + 1大小的数组。 – Ped7g

汇编语言是机器码的符号语言,机器码就是你的CPU可以执行的东西。

运行汇编器编译源代码后,您将得到机器代码,这是最终的结果。然后你执行那个机器码。

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

在最后的机器代码没有“.word”,这不是CPU指令,会有只是那些4个字节与它们各自的值形成word值,在某个地址,这是众所周知的汇编为符号InputVal(这也不是机器代码的一部分,任何使用这个存储器地址的指令都只有以数值形式编码的适当地址,而且可执行二进制文件可能包含某种重定位表,以便操作系统在地址后正确地修补地址在执行之前将机器代码加载到目标内存)。

现在这听起来像是说明了明显的,但是了解它们之间的区别,CPU在执行机器代码时可用的内容以及汇编程序编译期间可用的内容(代码尚未运行) 。

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

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

所以,你可以简单地做避免所有的动态内存分配(在运行时):

 .align 4 # make sure the reserved space is word-aligned 
Array: .space (51*4) 

这将预留的内存204个字节(51个字)在数据区为您的机器代码,用符号Array指向它的第一个字节。

现在你有内存保留,你可以存储值,并使用它。如果您希望在运行时改变主意并使用52个字的内存,那么您使用这样的代码就会失败。然后,您需要编写动态分配代码,或者在编译期间增加硬大小的固定缓冲区。

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

因此,在你的代码每次循环会像for (i = 0; i <= N; ++i) Array[i] = i;,其中N是在运行时由用户输入的值(其存储到InputVal保留内存,所以当你需要它,你可以访问它),在编译期间不知道。