使用“riscv32-unknown-elf-gcc”时如何以字节为单位存储或加载到内存中?
How do I store or load by byte unit into memory when using “riscv32-unknown-elf-gcc”?
我想以BYTE(8位)或HALF WORD(16位)为单位进行内存加载或存储操作。
所以我编写了如下 C 代码并使用“riscv32-unknown-elf-gcc”对其进行了编译。
void fun3 (void) {
char i,j;
i = (char)*(volatile unsigned int *) 0xf10007f8;
j = (char)*(volatile unsigned int *) 0xf10007f4;
*(volatile unsigned int *) 0xf10007f0 = (char) i+j;
*(volatile unsigned int *) 0xf10007fc = (int ) 0x4;
}
我编译如下,函数反汇编代码如下
riscv32-unknown-elf-gcc -march=rv32im -mabi=ilp32 -nostartfiles -nostdlib -Os -x c -Wl,-T,/work/test5.x -o test5.o test5.c
riscv32-unknown-elf-objdump -d -t test5.o > test5_Os.dump
f100006c <fun3>:
f100006c: f1000737 lui a4,0xf1000
f1000070: 7f872783 lw a5,2040(a4) # f10007f8 <__global_pointer$+0xffffeef0>
f1000074: 7f472683 lw a3,2036(a4)
f1000078: 0ff7f793 andi a5,a5,255
f100007c: 0ff6f693 andi a3,a3,255
f1000080: 00d787b3 add a5,a5,a3
f1000084: 7ef72823 sw a5,2032(a4)
f1000088: 00400793 li a5,4
f100008c: 7ef72e23 sw a5,2044(a4)
f1000090: 00008067 ret
我想在上面的汇编代码中将“lw”和“sw”转换为“lb”和“sb”。
知道的请回答。
如果您替换 :
i = (char)*(volatile unsigned int *) 0xf10007f8;
j = (char)*(volatile unsigned int *) 0xf10007f4;
*(volatile unsigned int *) 0xf10007f0 = (char) i+j;
与 :
i = *(char*) 0xf10007f8;
j = *(char*) 0xf10007f4;
*(char *) 0xf10007f0 = i+j;
编译器将生成加载和存储字节。
事实是你的代码告诉他加载一个单词,因为你正在使用一个无符号的 int 指针,并将结果转换为一个 char,所以他会使用 lw
是正常的。商店也一样,您使用的是无符号整型指针。
我想以BYTE(8位)或HALF WORD(16位)为单位进行内存加载或存储操作。
所以我编写了如下 C 代码并使用“riscv32-unknown-elf-gcc”对其进行了编译。
void fun3 (void) {
char i,j;
i = (char)*(volatile unsigned int *) 0xf10007f8;
j = (char)*(volatile unsigned int *) 0xf10007f4;
*(volatile unsigned int *) 0xf10007f0 = (char) i+j;
*(volatile unsigned int *) 0xf10007fc = (int ) 0x4;
}
我编译如下,函数反汇编代码如下
riscv32-unknown-elf-gcc -march=rv32im -mabi=ilp32 -nostartfiles -nostdlib -Os -x c -Wl,-T,/work/test5.x -o test5.o test5.c
riscv32-unknown-elf-objdump -d -t test5.o > test5_Os.dump
f100006c <fun3>:
f100006c: f1000737 lui a4,0xf1000
f1000070: 7f872783 lw a5,2040(a4) # f10007f8 <__global_pointer$+0xffffeef0>
f1000074: 7f472683 lw a3,2036(a4)
f1000078: 0ff7f793 andi a5,a5,255
f100007c: 0ff6f693 andi a3,a3,255
f1000080: 00d787b3 add a5,a5,a3
f1000084: 7ef72823 sw a5,2032(a4)
f1000088: 00400793 li a5,4
f100008c: 7ef72e23 sw a5,2044(a4)
f1000090: 00008067 ret
我想在上面的汇编代码中将“lw”和“sw”转换为“lb”和“sb”。
知道的请回答。
如果您替换 :
i = (char)*(volatile unsigned int *) 0xf10007f8;
j = (char)*(volatile unsigned int *) 0xf10007f4;
*(volatile unsigned int *) 0xf10007f0 = (char) i+j;
与 :
i = *(char*) 0xf10007f8;
j = *(char*) 0xf10007f4;
*(char *) 0xf10007f0 = i+j;
编译器将生成加载和存储字节。
事实是你的代码告诉他加载一个单词,因为你正在使用一个无符号的 int 指针,并将结果转换为一个 char,所以他会使用 lw
是正常的。商店也一样,您使用的是无符号整型指针。