用C语言构建编译器,汇编到十六进制

用C语言构建编译器,汇编到十六进制,c,assembly,hex,C,Assembly,Hex,从以下链接- 查看添加部分- 为什么他们要从op1[0]、op2[1]、op3[0]中减去48?我理解or(|)在左移后合并ops。 另外,为什么chch要用0x00ff按位AND(&) else if (strcmp(token,"add")==0) //----------------- ADD ------------------------------- { op1 = strtok

从以下链接-

查看添加部分- 为什么他们要从op1[0]、op2[1]、op3[0]中减去48?我理解or(|)在左移后合并ops。 另外,为什么chch要用0x00ff按位AND(&)

                else if (strcmp(token,"add")==0) //----------------- ADD -------------------------------
                {
                    op1 = strtok(NULL,"\n\t\r ");    
                    op2 = strtok(NULL,"\n\t\r ");
                    op3 = strtok(NULL,"\n\t\r ");
                    chch = (op1[0]-48)| ((op2[0]-48)<<3)|((op3[0]-48)<<6);  
                    program[counter]=0x7000+((chch)&0x00ff); 
                    counter++; 
                }
else if(strcmp(token,“add”)==0)/------------add-------------------------------
{
op1=strtok(空,“\n\t\r”);
op2=strtok(空,“\n\t\r”);
op3=strtok(空,“\n\t\r”);

chch=(op1[0]-48)|((op2[0]-48)这段代码虽然相当迟钝,但注释很好。当您习惯新代码时,从顶部开始,阅读所有注释以及代码

我就这么做了,发现了这条有用的评论:

48 is ASCII value of '0'
因此,从ASCII“0”-“9”中减去48将其转换为等效的数字


带常数的按位AND被称为“屏蔽关闭”位。屏蔽中的1位通过AND运算符,0位被剥离。

将转换为完整答案:


48
=
'0'
。这将ASCII数字转换为0-9的范围

移位的下一部分是做一个假设。0-9需要4位来完全编码,但他们只使用3位来编码。如果任何值大于7,这将导致混乱

“和屏蔽”部分正在清除多余的位,但是由于这个数学应该只保存写入的9位,这也可能是危险的,因为屏蔽只有8位的空间


总而言之,这段代码的思想看起来很可疑。

48
=
'0'
。这是将ASCII数转换为0-9的范围。48是用于“0”的ASCII码,与
0x00ff
一起获得变量的低字节。因此,假设op1[0]的值为1(寄存器1).你可以从1中减去48,也就是-47.那么&'d加上十六进制F会得到想要的结果吗?对不起,我对C和ASCII
op1[0]
不是一个数字,而是一个字符。因此,如果寄存器1中有“1”,那么它的数值将为49。使用3位字段是一个大线索,这是在解析八进制,而不是十进制。因此8或9将是非法输入(此片段不尝试检测;可能它们已经被排除)。或者,如果这是一个针对只有8个寄存器的机器的汇编程序,那么有效的asm将只使用从0到7的寄存器号。好的,很好,我现在明白了,并得到了我需要的工作。感谢帮助!