32位RISC-V汇编读取RGB文件至缓冲区时缓冲区全为零的问题求助
32位RISC-V汇编读取RGB文件至缓冲区时缓冲区全为零的问题求助
各位大佬好,我最近碰到一个棘手的问题:我想把RGB格式图像文件里的像素值读取到内存数组中,但每次检查缓冲区时,里面全是零,完全读不到正确的RGB数值。最开始我用C写了一个实现版本,逻辑看起来是没问题的,之后我把它转成32位RISC-V汇编来实现,结果还是出现同样的问题,实在找不到问题根源,想请大家帮忙排查一下。
先贴出我的C实现代码,这个版本理论上应该能正常工作:
// reads a file with an image in RGB format into an array in memory void read_rgb_image(char fileName[], unsigned char *arr) { FILE *image; image = fopen(fileName, "rb"); if (!image) { printf("unable to open file\n"); exit(1); } fread(arr, 3, WIDTH * HEIGHT, image); fclose(image); }
下面是我写的RISC-V汇编实现:
read_rgb_image: addi sp, sp, -4 sw s0, 0(sp) la a0, filename li a1, 0 # read-only flag li a7, 1024 # open file ecall mv s0, a0 # 这里我之前漏写了a0,后来补上了,但还是没解决问题 la a1, buff # get array address li a2, 3 # 原本想对应C里的每个像素3字节,但不确定参数是否正确 li a7, 63 # read file into buffer ecall mv a0, s0 li a7, 57 # close file ecall lw s0, 0(sp) addi sp, sp, 4 ret
我自己怀疑是不是系统调用的参数传递出错了?比如read系统调用(a7=63)的第三个参数应该是要读取的总字节数,而我这里只传了3?另外打开文件后,是不是没正确保存返回的文件描述符?虽然后来补上了mv s0, a0,但问题依然存在。有没有大佬能帮我看看哪里出问题了?
备注:内容来源于stack exchange,提问作者BashMocha
相关产品推荐
相关产品推荐

