我正在尝试为我自己的自定义指令运行汇编代码。
代码如下
#include <assert.h>
#include <stdio.h>
#include <stdint.h>
int main() {
uint64_t x = 123, y = 456, z = 0, a=22;
int i;
for(i=0;i<4;i++)
{
asm volatile ("custom0 x0, %0, %[i], 0" : : "r"(i),[i]"r"(i));
printf("The value of i is:- %d \n",i);
asm volatile ("custom0 %0, x0, %[i], 1" : "=r"(z) :[i]"r"(i));
printf("The value of z %d is:- %d \n",i,z);
}
}
所以基本上上面显示的 custom0 指令的工作方式如下所示。
// opcode
// | address
// | |
// | |
asm volatile ("custom0 x0, %0, 1, 0" : : "r"(i));//for moving i to address 1
asm volatile ("custom0 %0, x0, 1, 1" : "=r"(z));//for moving contents of address 1 to z.
该指令独立工作正常,但是当我尝试参数化地址字段并在 for 循环中运行时,数据不会移动到该地址。
上述程序的输出是
The value of i is:- 0
The value of z 0 is:- 0
The value of i is:- 1
The value of z 1 is:- 0
The value of i is:- 2
The value of z 2 is:- 0
The value of i is:- 3
The value of z 3 is:- 0
如您所见, i 的值是正确的,但 z 的值始终为零。
正在使用的指令集是 RISCV ISA:- http://riscv.org/download.html#tab_spec_user_isa