Нахождение факториала числа с помощью рекурсивного вызова в программировании MIPS - PullRequest
0 голосов
/ 09 ноября 2019

Это исходный код C

#include <stdio.h>

int main() {
	
	printf("The Factorial of 10 is %d\n", fact(10));
}

int fact(int n) {

	if (n < 1)
		return (1);
	else
		return (n * fact(n - 1));
}

Я преобразую функцию программирования на C в MIPS, но при запуске программы MIPS я получаю сообщение об ошибке для раздела .ascii.

	.text
	.globl main
main:
	subu 	$sp,$sp,32 	# Stack frame is 32 bytes long
	sw 	$ra,20($sp) 	# Save return address
	sw 	$fp,16($sp) 	# Save old frame pointer
	addiu 	$fp,$sp,28 	# Set up frame pointer

	li 	$a0,10 		# Put argument (10) in $a0
	jal 	fact 		# Call factorial function
	la 	$a0,$LC 	# Put format string in $a0
	move 	$a1,$v0 	# Move fact result to $a1
	jal 	printf 		# Call the print function

	lw 	$ra,20($sp) 	# Restore return address
	lw 	$fp,16($sp) 	# Restore frame pointer
	addiu 	$sp,$sp,32 	# Pop stack frame
	jr 	$ra 		# Return to caller
	
	.rdata
$LC:
	.ascii “The factorial of 10 is %d\n\000”

	.text
fact:
	subu 	$sp,$sp,32 	# Stack frame is 32 bytes long
	sw 	$ra,20($sp) 	# Save return address
	sw 	$fp,16($sp) 	# Save frame pointer
	addiu 	$fp,$sp,28 	# Set up frame pointer
	sw 	$a0,0($fp) 	# Save argument (n) to use for Recursive Call
	
	lw 	$v0,0($fp) 	# Load n
	bgtz 	$v0,$L2 	# Branch if n > 0
	li 	$v0,1 		# Return 1
	jr 	$L1 		# Jump to code to return
$L2:
	lw 	$v1,0($fp) 	# Load n
	subu 	$v0,$v1,1 	# Compute n - 1
	move 	$a0,$v0 	# Move value to $a0
	
	jal 	fact 		# Call factorial function
	lw 	$v1,0($fp) 	# Load n
	mul 	$v0,$v0,$v1 	# Compute fact(n-1) * n
	
$L1: 				# Result is in $v0
	lw 	$ra, 20($sp) 	# Restore $ra
	lw 	$fp, 16($sp) 	# Restore $fp
	addiu 	$sp, $sp, 32 	# Pop stack
	jr 	$ra 		# Return to caller

Ошибка в директиве ".ascii" не может появиться в текстовом сегменте "Это дает мне ошибку для раздела кода .ascii, говоря, что его не должно быть в .text. Может кто-нибудь, пожалуйста, помогите мне решить эту проблему, пожалуйста

Также говорится, что «$ L1»: операнд неверного типа

1 Ответ

0 голосов
/ 11 ноября 2019

Ошибка в директиве ".ascii" не может появиться в текстовом сегменте "Это дает мне ошибку для раздела кода .ascii, говоря, что его не должно быть в .text. Может кто-нибудь, пожалуйста, помогите мне решить эту проблему, пожалуйста

Я выхожу на конечность здесь, потому что я не уверен на 100%, на чем вы работаете, но некоторые симы, такие как MARS, не распознают сегмент rdata. Вы можете попробовать использовать просто .data.

Кроме того, если вы работаете с чем-то вроде WinMIPS64, вы можете попробовать поместить сегмент .data в верхнюю часть кода. Я понимаю, что вы делаете правильно в некоторых средах, но это не так. не работайте в других, так что крутите.

Могу ли я предложить вам попробовать эти вещи отдельно, на всякий случай.

...