jnm1997 Ответов: 1

Как переместить “спрайт” в ассемблерный код MIPS с помощью mars?


Мне нужна некоторая помощь в этом упражнении, я немного запутался в том, что все мы должны делать и как должен выглядеть результат. Я начал свой код, но застрял на этом этапе, потому что не совсем уверен, что все мы должны делать для этого задания, поэтому я не уверен, нахожусь ли я на правильном пути или мне нужно начать все сначала. Это не трудное задание, но подсказка просто какая-то расплывчатая и неясная.

вот подсказка:
Напишите программу сборки MIPS, которая при запуске в MARS со скоростью 25 инструкций в секунду будет
отображение в сегменте памяти 4-байтового “спрайта”, который перемещается слева направо по всему сегменту памяти.
верхняя часть дисплея памяти. Примечание: в верхнем ряду дисплея памяти есть восемь слов.
Важно: установите ползунок MARS так, чтобы он выполнялся с меньшей скоростью. Пропуск этого шага приведет к
бегите на полной скорости, и никакого выхода не будет видно.
Например, рассмотрим ту часть задания, где спрайт перемещается слева направо.
право. Предполагая, что вы выбрали “фон” шестнадцатеричное число " E " и “спрайт” из
шестнадцатеричная цифра 0, серия “промежутков времени” снимков отображения сегмента памяти будет выглядеть следующим образом
как и приведенные ниже данные:(0-это символ sprit)
Время 1: 0x0eeeeeee 0xeeeeeeee. . .
Время 2: 0xe0eeeeee 0xeeeeeeee ...
Время 3: 0xee0eeeee 0xeeeeeeee. . .
Время 4: 0xeee0eeee 0xeeeeeeee.. ..
Время 5: 0xeeee0eee 0xeeeeeeee.. ..
Время 6: 0xeeeee0ee 0xeeeeeeee.. ..
Время 7: 0xeeeeee0e 0xeeeeeeee.. ..
Время 8: 0xeeeeeee0 0xeeeeeeee.. ..
Время 9: 0x0eeeeeee 0xeeeeeeee. . .
Вы можете выбрать шестнадцатеричные цифры, используемые для “фона” и “спрайта” – выберите два
шестнадцатеричные цифры, которые имеют как можно больше контраста для лучшей видимости. Например,
цифры е и с-плохой выбор, потому что они очень похожи.
Ваша программа будет включать в себя ряд вложенных циклов.

Что я уже пробовал:

.data

InArr: .word 0x0eeeeeee

.text

.globl main

main:

#

li $s2,0x0eeeeeee

li $s3,0

#

loop:

ror $s2,$s2,4 # $s2 = $s2 >>4

sw $s2,InArr # InArr(0) = $s2

#addi $s2,$s2,4

bne $s2,$s3,loop # until i==0

#

li $v0,10 # System(exit)

syscall

Gerry Schmitz

Только ваш "учитель" знает истинное требование, если вы "смущены". Немного рискованно просить незнакомцев интерпретировать задание, когда вы не знаете, о чем вас спрашивают.

1 Ответов

Рейтинг:
2

CPallini

Как уже упоминалось в требованиях, вы должны использовать вложенные циклы.
Попробуйте, например

.data
InArr: .word 0x0eeeeeee 0xeeeeeeee 0xeeeeeeee 0xeeeeeeee 0xeeeeeeee 0xeeeeeeee 0xeeeeeeee 0xeeeeeeee 
	
.text
.globl main

main:

li $s4, 8 # outer loop index, say 'i'
li $s5, 0 # offset used to access memory

outer_loop:

	li $s3,7 # inner loop index, say 'j'

	li $s2,0x0eeeeeee
	sw $s2,InArr($s5) # InArr[i] = 0x0eeeeeee

	inner_loop:
		ror $s2,$s2,4 # $s2 = $s2 >> 4
		sw $s2,InArr($s5) # InArr[i] = $s2

		addi $s3,$s3,-1 # j = j -1
		bne $s3,$zero,inner_loop # until j==0

	li $s2, 0xeeeeeeee
	sw $s2,InArr($s5) # InArr[i] = 0xeeeeeeee
	addi $s5,$s5,4	# increment the offset in order to access next word in memory
	addi $s4,$s4,-1 # i = i - 1
	bne $s4,$zero, outer_loop

li $v0,10 # System(exit)

syscall


Richard MacCutchan

+5.Is нет конца твоим талантам? :)

CPallini

Большое тебе спасибо, Ричард. :-)