assembly 在RISCV(32位)汇编中将RGB格式的文件读入缓冲区

iqih9akk  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(99)

我试图将文件中的RGB值读取到数组中,但当我检查缓冲区时,它充满了零而不是值。首先,我在C中尝试了它,然后在riscv汇编中实现了它。我不知道是什么引起的。
以下是两种实现方式,

// 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);
}
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, 
    
    la a1, buff # get array add.
    li a2, 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
lqfhib0f

lqfhib0f1#

经过一些研究,我修复了代码,以下是我修复的错误:

  • 我想把所有的值都读入缓冲区。该文件包含172800个值,因为图片的分辨率为320x180。每个像素有三个值(RGB分量)。我认为最大的。阅读系统调用的长度标志应为3,因为RGB值。将其更改为172800后,它将整个文件读入缓冲区。li a2, 172800
  • 我尝试用lw指令而不是lbu来加载字节。每个值的大小为一个字节,应存储为无符号。
  • 最后,我通过检查文件描述符是否等于零来检查文件是否被正确打开。

相关问题