MIPS - 在汇编代码中调用 C 函数
MIPS - Call C function in Assembly code
我试图从汇编文件调用在 C 文件中声明的函数,但出现 "Illegal Instruction" 错误。
我的C代码:
#include <stdio.h>
int BubbleSort(int *v){
return 13;
}
int Run(int *, int *);
int main(){
int vetor[] = {1, 3, 5, 4, 10}, numTrocas = 0, res = 0;
numTrocas = Run(vetor, &res);
printf("numTrocas= %d\nf= %d\n", numTrocas, res);
return 0;
}
我的汇编代码:
.data
.text
.globl Run
Run:
addi $sp,$sp,-8
sw $ra,0($sp)
sw $a0,4($sp)
move $t4, $a1 #$t4 = $a1; address of variable res in C file
move $t6, $a0 #$t6 = address of the first vector element
lw $a0, ($t6)
add $t6, $t6, 4
lw $a1, ($t6)
add $t6, $t6, 4
lw $a2, ($t6)
add $t6, $t6, 4
lw $a3, ($t6)
add $t6, $t6, 4
lw $t3, ($t6)
jal PolyCalc
lw $a0,4($sp)
jal BubbleSort #-> Illegal Instruction
lw $ra, 0($sp)
addi $sp, $sp, 8
jr $ra
PolyCalc: #This function calculates the result of the expression 5(V[0] + V[1])(V[2] − 3xV[3]xV[4])
li $s0,5 #$s0 = 5
li $s1,3 #$s1 = 3
add $t1,$a0,$a1 #t1=(x1+x2)
mul $t1,$t1,$s0 #t1=5*(x1+x2)
mul $t2,$a3,$t3 #$t2 = x4*x5
mul $t2,$t2,$s1 #$t2 = 3*x4*x5
sub $t2,$a2,$t2 #$t2 = (x3-3x4*x5)
mul $t1,$t1,$t2
sw $t1, ($t4) #Save the result on the address of $t4
jr $ra
当我注释行 jal BubbleSort 并将随机值添加到 $v0 作为 BubbleSort 函数的 return 时,我不再收到该错误并且程序运行正常。
有人能找出我的代码中的错误吗?
谢谢
您遇到的错误是因为汇编代码无法找到名为 BubbleSort 的标签进行跳转。我认为你应该使用不同的方法。您可以使用 asm 函数在 C 中嵌入汇编代码。
类似于:
#include <stdio.h>
int BubbleSort(int *v){
asm("lw $a0, ($t6)"
"lw $a1, ($t6)");
}
int Run(int *, int *);
int main(){
int vetor[] = {1, 3, 5, 4, 10}, numTrocas = 0, res = 0;
numTrocas = Run(vetor, &res);
printf("numTrocas= %d\nf= %d\n", numTrocas, res);
return 0;
}
您可以在 GCC 文档中找到有关此函数的更多信息:https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
为了更好的衡量,在您的 asm 文件中,您应该添加:
.extern BubbleSort
然后,jal BubbleSort
应该正确地重新定位。
但是,对于 jal
的 [有限] 范围,链接器可能会将其放置得太远,因此您可能必须将其替换为:
la $t0,BubbleSort
jalr $t0
我试图从汇编文件调用在 C 文件中声明的函数,但出现 "Illegal Instruction" 错误。
我的C代码:
#include <stdio.h>
int BubbleSort(int *v){
return 13;
}
int Run(int *, int *);
int main(){
int vetor[] = {1, 3, 5, 4, 10}, numTrocas = 0, res = 0;
numTrocas = Run(vetor, &res);
printf("numTrocas= %d\nf= %d\n", numTrocas, res);
return 0;
}
我的汇编代码:
.data
.text
.globl Run
Run:
addi $sp,$sp,-8
sw $ra,0($sp)
sw $a0,4($sp)
move $t4, $a1 #$t4 = $a1; address of variable res in C file
move $t6, $a0 #$t6 = address of the first vector element
lw $a0, ($t6)
add $t6, $t6, 4
lw $a1, ($t6)
add $t6, $t6, 4
lw $a2, ($t6)
add $t6, $t6, 4
lw $a3, ($t6)
add $t6, $t6, 4
lw $t3, ($t6)
jal PolyCalc
lw $a0,4($sp)
jal BubbleSort #-> Illegal Instruction
lw $ra, 0($sp)
addi $sp, $sp, 8
jr $ra
PolyCalc: #This function calculates the result of the expression 5(V[0] + V[1])(V[2] − 3xV[3]xV[4])
li $s0,5 #$s0 = 5
li $s1,3 #$s1 = 3
add $t1,$a0,$a1 #t1=(x1+x2)
mul $t1,$t1,$s0 #t1=5*(x1+x2)
mul $t2,$a3,$t3 #$t2 = x4*x5
mul $t2,$t2,$s1 #$t2 = 3*x4*x5
sub $t2,$a2,$t2 #$t2 = (x3-3x4*x5)
mul $t1,$t1,$t2
sw $t1, ($t4) #Save the result on the address of $t4
jr $ra
当我注释行 jal BubbleSort 并将随机值添加到 $v0 作为 BubbleSort 函数的 return 时,我不再收到该错误并且程序运行正常。
有人能找出我的代码中的错误吗? 谢谢
您遇到的错误是因为汇编代码无法找到名为 BubbleSort 的标签进行跳转。我认为你应该使用不同的方法。您可以使用 asm 函数在 C 中嵌入汇编代码。
类似于:
#include <stdio.h>
int BubbleSort(int *v){
asm("lw $a0, ($t6)"
"lw $a1, ($t6)");
}
int Run(int *, int *);
int main(){
int vetor[] = {1, 3, 5, 4, 10}, numTrocas = 0, res = 0;
numTrocas = Run(vetor, &res);
printf("numTrocas= %d\nf= %d\n", numTrocas, res);
return 0;
}
您可以在 GCC 文档中找到有关此函数的更多信息:https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
为了更好的衡量,在您的 asm 文件中,您应该添加:
.extern BubbleSort
然后,jal BubbleSort
应该正确地重新定位。
但是,对于 jal
的 [有限] 范围,链接器可能会将其放置得太远,因此您可能必须将其替换为:
la $t0,BubbleSort
jalr $t0