2017-09-23 109 views
0

對於此任務,我需要能夠根據用戶從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

回答

1

彙編語言是機器碼的符號語言,機器碼就是你的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保留內存,所以當你需要它,你可以訪問它),在編譯期間不知道。

相關問題