设计表示格式 1 的 Arm 模拟器功能的查询
inquiry in designing my Arm simulator function representing format 1
以下函数表示 ARM Thumb 中的格式 1。我不明白在格式字段的每个声明中移动后使用 AND(&) 的部分,为什么我们在 AND 之后使用这些数字?
format 1 representation in ARM architecture
int simulate(unsigned short instr)
{
unsigned char fmt, op, offset5, rd, rs, offset3, rn;
fmt = (instr) >> 13;
switch(fmt){
case 0: // format 1/2
op = (instr >> 11) & 3;
rd = instr & 7;
rs = (instr >> 3) & 7;
offset5 = (instr >> 6) & 0x1F;
if(op!=3) { // format 1
/*
switch(op){
case 0: printf("lsl\tr%d, r%d, #%d\n", rd, rs, offset5); break;
case 1: printf("lsr\tr%d, r%d, #%d\n", rd, rs, offset5); break;
case 2: printf("asr\tr%d, r%d, #%d\n", rd, rs, offset5); break;
}*/
对于像 op
这样的东西,它应该是 2 位长,但它在您的指令中有一些偏移量。因此,您需要将 op
位一直移动到最低有效位置,然后删除所有剩余位。
移位将位移动到您的 op
unsigned char
中的最低有效位位置,并将其与 3(二进制中的 11
,意味着只保留 2最低有效位)摆脱了高位位置的任何东西(对于 op
那些应该是所有 0
s,但对于像 offset5
这样的东西它不会)。
指令的其他部分都是一样的。 offset5
是5位长,所以我们需要用二进制表示11111
,也就是0x1F
,以此类推。
以下函数表示 ARM Thumb 中的格式 1。我不明白在格式字段的每个声明中移动后使用 AND(&) 的部分,为什么我们在 AND 之后使用这些数字? format 1 representation in ARM architecture
int simulate(unsigned short instr)
{
unsigned char fmt, op, offset5, rd, rs, offset3, rn;
fmt = (instr) >> 13;
switch(fmt){
case 0: // format 1/2
op = (instr >> 11) & 3;
rd = instr & 7;
rs = (instr >> 3) & 7;
offset5 = (instr >> 6) & 0x1F;
if(op!=3) { // format 1
/*
switch(op){
case 0: printf("lsl\tr%d, r%d, #%d\n", rd, rs, offset5); break;
case 1: printf("lsr\tr%d, r%d, #%d\n", rd, rs, offset5); break;
case 2: printf("asr\tr%d, r%d, #%d\n", rd, rs, offset5); break;
}*/
对于像 op
这样的东西,它应该是 2 位长,但它在您的指令中有一些偏移量。因此,您需要将 op
位一直移动到最低有效位置,然后删除所有剩余位。
移位将位移动到您的 op
unsigned char
中的最低有效位位置,并将其与 3(二进制中的 11
,意味着只保留 2最低有效位)摆脱了高位位置的任何东西(对于 op
那些应该是所有 0
s,但对于像 offset5
这样的东西它不会)。
指令的其他部分都是一样的。 offset5
是5位长,所以我们需要用二进制表示11111
,也就是0x1F
,以此类推。