簡體   English   中英

將數組的內容復制到另一個數組並在 MIPS 程序集中打印

[英]Copying content of array to another array and printing in MIPS assembly

我是匯編語言的新手。 我在很多幫助下設法編寫了一段代碼,該代碼接受一個數組並打印它。 我現在只想簡單地將第一個數組的內容復制到第二個數組中,然后打印第二個數組。 (稍后我將操作它,以便第二個數組向后打印第一個數組)

我只想學習如何將一個數組復制到第二個數組中並打印它。 下面是我只打印第一個數組的代碼

# PrintList.asm
.data
Sz: .word 10
Array: .word 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
NL: .asciiz " "

.text

main:
lw $s7, Sz 
move $s1, $zero  
move $s2, $zero 

print_loop:
bge $s1, $s7, print_loop_end 

lw $a0, Array($s2) 
li $v0, 1
syscall
la $a0, NL 
li $v0, 4
syscall
addi $s1, $s1, 1 
addi $s2, $s2, 4 
j print_loop 

print_loop_end:

任何指導或提示都會有所幫助,謝謝

首先對您的程序進行一些評論:

move $2, $zero
.....
lw $a0, Array($s2) 

在實際環境中使用 MIPS 時(例如:許多 WLAN 路由器使用 MIPS 處理器),第二行將不起作用。 原因是“Array”的地址通常在 0x10000 以上的范圍內,並且代碼中的行將無法訪問 0x7FFF 以上的地址。

最好使用以下兩行:

la $2, Array
...
lw $a0, 0($s2) 

您還應該知道“系統調用”會調用操作系統。 這意味着“$v0”寄存器中數字的含義取決於所使用的操作系統(或模擬器)。 在 Unix 中,以下幾行:

li $v0, 1
syscall

將調用將立即停止程序的“exit()”系統調用。 在使用“syscall”指令時,您應該提到您使用例如 SPIM 模擬器(其中 $v0=1 表示:打印整數)。

現在關於實際問題:

要復制數組,您只需在“lw”指令后添加“sw”指令:

lw $a0, Array($s2)
sw $a0, SecondArray($s2)

一些真正的 MIPS 處理器不允許在以下指令中使用使用“lw”加載的寄存器。 因此,您應該以某種方式重新排列說明以避免這種情況:

lw $a0, Array($s2)
li $v0, 1
sw $a0, SecondArray($s2)

地址 > 0x10000 的問題仍然存在。 如果您的程序可以使用這樣的地址運行,您將需要第二個數組指針:

la $s2, Array
la $s3, SecondArray
  ...
lw $a0, 0($s2)
li $v0, 1
sw $a0, 0($s3)
  ...
addi $s2, $s2, 4
addi $s3, $s3, 4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM