在用于格式4的arm模拟器中实现功能时的一个问题
a question in implementing a function in arm simulator for format 4
我的问题是关于在我的ARM拇指模拟函数中表示进位位和算术右移。如果操作码是ADC的二进制位值,那么我必须创建一个布尔变量吗?然后我将布尔变量加为1,如果不是,那么它是SBC?另外,如何在我的代码中表示ASR的逻辑?
格式4
操作码的格式4指令
case 2: // format 4
op = (instr >> 6) & 0xF;
rd = instr & 7;
rs = (instr >> 3) & 7;
if (op == 0)
{
cout << " AND " << rd << "," << rs << endl;
Regs[rd] = Regs[rd] & Regs[rs];
}
else if (op == 1)
{
cout << " EOR " << rd << "," << rs << endl;
Regs[rd] = Regs[rd] ^ Regs[rs];
}
else if (op == 2)
{
cout << " LSL " << rd << "," << rs << endl;
Regs[rd] = Regs[rd] << Regs[rs];
}
else if (op == 3)
{
cout << " LSR " << rd << "," << rs << endl;
Regs[rd] = Regs[rd] >> Regs[rs];
}
**else if (op == 4)
{
cout << " ASR " << rd << "," << rs << endl;
Regs[rd] = Regs[rd] >> Regs[rs];
}**
**else if (op == 5)
{
cout << " ADC " << rd << "," << rs << endl;
Regs[rd] = Regs[rd] & Regs[rs];
}
else if (op == 6)
{
cout << " SBC " << rd << "," << rs << endl;
Regs[rd] = Regs[rd] - Regs[rs];
}**
break;
我只给您一些工作代码供您思考。
void do_cflag ( unsigned int a, unsigned int b, unsigned int c )
{
unsigned int rc;
cpsr&=~CPSR_C;
rc=(a&0x7FFFFFFF)+(b&0x7FFFFFFF)+c; //carry in
rc = (rc>>31)+(a>>31)+(b>>31); //carry out
if(rc&2) cpsr|=CPSR_C;
}
void do_cflag_bit ( unsigned int x )
{
if(x) cpsr|=CPSR_C; else cpsr&=~CPSR_C;
}
//SUB(1)
if((inst&0xFE00)==0x1E00)
{
rd=(inst>>0)&7;
rn=(inst>>3)&7;
rb=(inst>>6)&7;
if(DISS) fprintf(stderr,"subs r%u,r%u,#0x%Xn",rd,rn,rb);
ra=read_register(rn);
rc=ra-rb;
write_register(rd,rc);
do_nflag(rc);
do_zflag(rc);
do_cflag(ra,~rb,1);
do_vflag(ra,~rb,1);
return(0);
}
//SBC
if((inst&0xFFC0)==0x4180)
{
rd=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"sbc r%u,r%un",rd,rm);
ra=read_register(rd);
rb=read_register(rm);
rc=ra-rb;
if(!(cpsr&CPSR_C)) rc--;
write_register(rd,rc);
do_nflag(rc);
do_zflag(rc);
if(cpsr&CPSR_C)
{
do_cflag(ra,~rb,1);
do_vflag(ra,~rb,1);
}
else
{
do_cflag(ra,~rb,0);
do_vflag(ra,~rb,0);
}
return(0);
}
//ADC
if((inst&0xFFC0)==0x4140)
{
rd=(inst>>0)&0x07;
rm=(inst>>3)&0x07;
if(DISS) fprintf(stderr,"adc r%u,r%un",rd,rm);
ra=read_register(rd);
rb=read_register(rm);
rc=ra+rb;
if(cpsr&CPSR_C) rc++;
write_register(rd,rc);
do_nflag(rc);
do_zflag(rc);
if(cpsr&CPSR_C) { do_cflag(ra,rb,1); do_vflag(ra,rb,1); }
else { do_cflag(ra,rb,0); do_vflag(ra,rb,0); }
return(0);
}
//ADD(3) three registers
if((inst&0xFE00)==0x1800)
{
rd=(inst>>0)&0x7;
rn=(inst>>3)&0x7;
rm=(inst>>6)&0x7;
if(DISS) fprintf(stderr,"adds r%u,r%u,r%un",rd,rn,rm);
ra=read_register(rn);
rb=read_register(rm);
rc=ra+rb;
write_register(rd,rc);
do_nflag(rc);
do_zflag(rc);
do_cflag(ra,rb,0);
do_vflag(ra,rb,0);
return(0);
}
//ASR(2) two register
if((inst&0xFFC0)==0x4100)
{
rd=(inst>>0)&0x07;
rs=(inst>>3)&0x07;
if(DISS) fprintf(stderr,"asrs r%u,r%un",rd,rs);
rc=read_register(rd);
rb=read_register(rs);
rb&=0xFF;
if(rb==0)
{
}
else if(rb<32)
{
do_cflag_bit(rc&(1<<(rb-1)));
ra=rc&0x80000000;
rc>>=rb;
if(ra) //asr, sign is shifted in
{
rc|=(~0)<<(32-rb);
}
}
else
{
if(rc&0x80000000)
{
do_cflag_bit(1);
rc=(~0);
}
else
{
do_cflag_bit(0);
rc=0;
}
}
write_register(rd,rc);
do_nflag(rc);
do_zflag(rc);
return(0);
}
相关文章:
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有可能有一个只有ADL才能找到的非好友功能
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 避免在条件更新时丢失唤醒是一个阻塞功能
- 我在 C++ 中创建了一个函数来递归反转字符串,但是之后如何使功能打印一个 endl?
- 通过将其中一个模板更改为 muliset 后,我可以在 PBDS 排序集上使用计数功能<int>less_equal<int>
- 有人可以展示一个使用多个功能的示例吗?
- 有没有办法C++将给定类的功能限制为仅另一个类(不使用继承,朋友)?
- 如何在一个功能中拥有所有选项?
- 使用一个功能打印最大值和平均值
- 如何简化代码并将开关组合成一个功能?
- 如何制作一个根据拉取请求关闭和打开功能的构建系统?
- 是否有一个Windows驱动程序函数可以执行Windows文件api SeFileAttributes的等效功能
- 如何使用 Turbo C++并行运行两个功能,一个用于键盘,一个用于鼠标?
- 维护/维持两个代码集的风险,一个用于 CPU,一个用于 GPU,需要执行非常相似的功能
- 当一个功能完成另一个功能打开时,我该怎么办?
- 别名一个模板函数,该功能没有参数可更简洁
- 编写一个递归功能,该功能采用数组并以相反顺序显示元素,而无需在末尾启动数组的索引
- 仅一个功能的链接错误.在同一类和CPP文件中具有相似签名的其他函数工作正常
- 调用两个功能(一个stdcall)的方法