Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

C语言如何编译成RISC-V机器码并运行? #7

Open
zchliu opened this issue Mar 7, 2022 · 4 comments
Open

C语言如何编译成RISC-V机器码并运行? #7

zchliu opened this issue Mar 7, 2022 · 4 comments

Comments

@zchliu
Copy link

zchliu commented Mar 7, 2022

我用riscv64-unknown-linux-gnu-gcc -S qsort.c将.c文件转成汇编,然后导入到USTCRVSoC-tool进行转换,发现程序卡住不动了,是不是要对汇编的程序先做一些处理?

.c程序

#include <stdio.h>
#include <stdlib.h>

void QuickSort(int *lst, int start, int end);

int main()
{
    int array[20] = {3,56,56,20,1,5,3,514,6,7,48,6,89,4,7,0,3,1,65,8};
    QuickSort(array, 0, 19);
    for (int i=0;i<20;i++)
    {
        printf("%d ",array[i]);
    }
    while(1);
    return 0;
}

void QuickSort(int *lst, int start, int end)
{
    if(end>start)
    {
        int i = start,j = end,key = lst[start];
        while(i < j)
        {
            for (; i < j && key <= lst[j]; j--);
            lst[i] = lst[j];
            for (; i < j && key >= lst[i]; i++);
            lst[j] = lst[i];
        }
        lst[i] = key;
        QuickSort(lst, start, i - 1);
        QuickSort(lst, i + 1, end);
    }
}

.s程序

	.file	"qsort.c"
	.option nopic
	.text
	.section	.rodata
	.align	3
.LC1:
	.string	"%d "
	.align	3
.LC0:
	.word	3
	.word	56
	.word	56
	.word	20
	.word	1
	.word	5
	.word	3
	.word	514
	.word	6
	.word	7
	.word	48
	.word	6
	.word	89
	.word	4
	.word	7
	.word	0
	.word	3
	.word	1
	.word	65
	.word	8
	.text
	.align	1
	.globl	main
	.type	main, @function
main:
	addi	sp,sp,-112
	sd	ra,104(sp)
	sd	s0,96(sp)
	addi	s0,sp,112
	lui	a5,%hi(.LC0)
	addi	a5,a5,%lo(.LC0)
	ld	t3,0(a5)
	ld	t1,8(a5)
	ld	a7,16(a5)
	ld	a6,24(a5)
	ld	a0,32(a5)
	ld	a1,40(a5)
	ld	a2,48(a5)
	ld	a3,56(a5)
	ld	a4,64(a5)
	ld	a5,72(a5)
	sd	t3,-104(s0)
	sd	t1,-96(s0)
	sd	a7,-88(s0)
	sd	a6,-80(s0)
	sd	a0,-72(s0)
	sd	a1,-64(s0)
	sd	a2,-56(s0)
	sd	a3,-48(s0)
	sd	a4,-40(s0)
	sd	a5,-32(s0)
	addi	a5,s0,-104
	li	a2,19
	li	a1,0
	mv	a0,a5
	call	QuickSort
	sw	zero,-20(s0)
	j	.L2
.L3:
	lw	a5,-20(s0)
	slli	a5,a5,2
	addi	a4,s0,-16
	add	a5,a4,a5
	lw	a5,-88(a5)
	mv	a1,a5
	lui	a5,%hi(.LC1)
	addi	a0,a5,%lo(.LC1)
	call	printf
	lw	a5,-20(s0)
	addiw	a5,a5,1
	sw	a5,-20(s0)
.L2:
	lw	a5,-20(s0)
	sext.w	a4,a5
	li	a5,19
	ble	a4,a5,.L3
.L4:
	j	.L4
	.size	main, .-main
	.align	1
	.globl	QuickSort
	.type	QuickSort, @function
QuickSort:
	addi	sp,sp,-48
	sd	ra,40(sp)
	sd	s0,32(sp)
	addi	s0,sp,48
	sd	a0,-40(s0)
	mv	a5,a1
	mv	a4,a2
	sw	a5,-44(s0)
	mv	a5,a4
	sw	a5,-48(s0)
	lw	a4,-48(s0)
	lw	a5,-44(s0)
	sext.w	a4,a4
	sext.w	a5,a5
	ble	a4,a5,.L15
	lw	a5,-44(s0)
	sw	a5,-20(s0)
	lw	a5,-48(s0)
	sw	a5,-24(s0)
	lw	a5,-44(s0)
	slli	a5,a5,2
	ld	a4,-40(s0)
	add	a5,a4,a5
	lw	a5,0(a5)
	sw	a5,-28(s0)
	j	.L7
.L10:
	lw	a5,-24(s0)
	addiw	a5,a5,-1
	sw	a5,-24(s0)
.L8:
	lw	a4,-20(s0)
	lw	a5,-24(s0)
	sext.w	a4,a4
	sext.w	a5,a5
	bge	a4,a5,.L9
	lw	a5,-24(s0)
	slli	a5,a5,2
	ld	a4,-40(s0)
	add	a5,a4,a5
	lw	a4,0(a5)
	lw	a5,-28(s0)
	sext.w	a5,a5
	ble	a5,a4,.L10
.L9:
	lw	a5,-24(s0)
	slli	a5,a5,2
	ld	a4,-40(s0)
	add	a4,a4,a5
	lw	a5,-20(s0)
	slli	a5,a5,2
	ld	a3,-40(s0)
	add	a5,a3,a5
	lw	a4,0(a4)
	sw	a4,0(a5)
	j	.L11
.L13:
	lw	a5,-20(s0)
	addiw	a5,a5,1
	sw	a5,-20(s0)
.L11:
	lw	a4,-20(s0)
	lw	a5,-24(s0)
	sext.w	a4,a4
	sext.w	a5,a5
	bge	a4,a5,.L12
	lw	a5,-20(s0)
	slli	a5,a5,2
	ld	a4,-40(s0)
	add	a5,a4,a5
	lw	a4,0(a5)
	lw	a5,-28(s0)
	sext.w	a5,a5
	bge	a5,a4,.L13
.L12:
	lw	a5,-20(s0)
	slli	a5,a5,2
	ld	a4,-40(s0)
	add	a4,a4,a5
	lw	a5,-24(s0)
	slli	a5,a5,2
	ld	a3,-40(s0)
	add	a5,a3,a5
	lw	a4,0(a4)
	sw	a4,0(a5)
.L7:
	lw	a4,-20(s0)
	lw	a5,-24(s0)
	sext.w	a4,a4
	sext.w	a5,a5
	blt	a4,a5,.L8
	lw	a5,-20(s0)
	slli	a5,a5,2
	ld	a4,-40(s0)
	add	a5,a4,a5
	lw	a4,-28(s0)
	sw	a4,0(a5)
	lw	a5,-20(s0)
	addiw	a5,a5,-1
	sext.w	a4,a5
	lw	a5,-44(s0)
	mv	a2,a4
	mv	a1,a5
	ld	a0,-40(s0)
	call	QuickSort
	lw	a5,-20(s0)
	addiw	a5,a5,1
	sext.w	a5,a5
	lw	a4,-48(s0)
	mv	a2,a4
	mv	a1,a5
	ld	a0,-40(s0)
	call	QuickSort
.L15:
	nop
	ld	ra,40(sp)
	ld	s0,32(sp)
	addi	sp,sp,48
	jr	ra
	.size	QuickSort, .-QuickSort
	.ident	"GCC: (gca312387ab1) 10.2.0"
	.section	.note.GNU-stack,"",@progbits
@WangXuan95
Copy link
Owner

你好,我没用 C 语言搞过,应该是的,手写汇编和gcc生成的汇编应该是有些区别,具体要靠你自己研究了。另外注意是不是要用 riscv32 工具链而不是 riscv64 工具链。

@zchliu
Copy link
Author

zchliu commented Mar 7, 2022

噢噢,那我要自己再看看,谢谢!

@zchliu
Copy link
Author

zchliu commented Mar 8, 2022

初步研究了一下,gcc编译出来的汇编文件比较复杂,一些汇编的命令工具不能直接转换,比如.word表示在当前位置存放一个字,.align表示指定地址的对齐方式。我在第一次运行riscv编译的时候命令确实用错了,我configure时指定了-multilib,可以编译出来各种版本的riscv指令集,但是要在汇编的时候人为指定rv32i的指令集riscv64-unknown-linux-gnu-gcc -march=rv32i -mabi=ilp32 -S qsort.c

@WangXuan95
Copy link
Owner

咱们加 QQ 聊吧,我 Q号 629708558 。我是纯搞硬件的,编译不太懂。但是这个项目我确实想改造成方便大家直接 C 语言的,或许咱们可以合作一下,到时候你提交 Pull request

@WangXuan95 WangXuan95 changed the title 将汇编语言转换成riscv机器码的时候卡住了 C语言如何编译成RISC-V机器码并运行? Mar 13, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants