理解c+有困难+;程序、班次和; 在我的机器语言类中,我们必须把C++翻译成MIPS,问题是我对C++的了解不多,只是基本的东西,所以我很难理解这个函数: void IPtoDD(int arg0, char *arg1) { int temp, numChar, shift = 24; for (int i=0; i<4; i++) { temp = arg0 >> shift; temp = temp & 0x000000ff; numChar = byteToDec(temp,arg1); arg1 += numChar; *arg1++ = '.'; shift -= 8; }

理解c+有困难+;程序、班次和; 在我的机器语言类中,我们必须把C++翻译成MIPS,问题是我对C++的了解不多,只是基本的东西,所以我很难理解这个函数: void IPtoDD(int arg0, char *arg1) { int temp, numChar, shift = 24; for (int i=0; i<4; i++) { temp = arg0 >> shift; temp = temp & 0x000000ff; numChar = byteToDec(temp,arg1); arg1 += numChar; *arg1++ = '.'; shift -= 8; },c++,shift,C++,Shift,这会将arg0的内容进行二进制右移。它执行此移位移位次数。因此,由于shift=24,它将arg0向右移动24次 temp = temp & 0x000000ff; 这会屏蔽temp中包含的最重要字节。最后一个字节仍然保留,因为任何带有f的&都只反映原始值。在这一行中 temp = arg0 >> shift; arg0的值在移位值中从最高有效位移位到最低有效位(注意可能是从左向右或从右向左,具体取决于CPU的端度)(第一次是24,然后是16,然后是8) 二进制和应用于临

这会将
arg0
的内容进行二进制右移。它执行此移位
移位
次数。因此,由于
shift=24
,它将
arg0
向右移动24次

temp = temp & 0x000000ff;
这会屏蔽
temp
中包含的最重要字节。最后一个字节仍然保留,因为任何带有
f
&
都只反映原始值。

在这一行中

temp = arg0 >> shift;
arg0的值在移位值中从最高有效位移位到最低有效位(注意可能是从左向右或从右向左,具体取决于CPU的端度)(第一次是24,然后是16,然后是8)


二进制和应用于临时ie,除低有效8位重置为0外,低有效8位不改变。如果您需要在汇编中实现该操作,您可能不需要执行二进制和,而需要获得正确的字节。

>
运算符是一个“向右移位运算符”。它将把左侧值的二进制表示形式向右移位x位,其中x是右侧的数字。这是什么样子的?以下是一些例子:

decimal: 128                   >> 1 == 64
binary:  0b0000 0000 1000 0000 >> 1 == 0b0000 0000 0100 0000

decimal: 64                    >> 1 == 32
binary:  0b0000 0000 0100 0000 >> 1 == 0b0000 0000 0010 0000
decimal: 7      & 15     == 7
binary:  0b0111 & 0b1111 == 0b0111

decimal: 5      & 12     == 4
binary:  0b0101 & 0b1100 == 0b0100
请注意大二进制数中的1是如何右移1的。在代码中,您通过
shift
移动
arg0
,其中
arg0
是一些输入,
shift
是24、16、8,然后是0,因为您正在循环。这意味着在第一个循环中,将arg0向下移位24位,然后将其存储到temp中

第二条语句是按位AND语句,它将左侧的每一位与右侧的每一位进行比较。如果两个位都为1,则相同位置的结果位为1,否则为0。以下是一些例子:

decimal: 128                   >> 1 == 64
binary:  0b0000 0000 1000 0000 >> 1 == 0b0000 0000 0100 0000

decimal: 64                    >> 1 == 32
binary:  0b0000 0000 0100 0000 >> 1 == 0b0000 0000 0010 0000
decimal: 7      & 15     == 7
binary:  0b0111 & 0b1111 == 0b0111

decimal: 5      & 12     == 4
binary:  0b0101 & 0b1100 == 0b0100
在表达式中,AND是用右侧值
0x000000FF
完成的,该值等于255的十六进制值,以十进制表示

您的两个感兴趣的语句所做的是从输入中提取每个“字节”或“8位块”:

temp = arg0 >> shift;
temp = temp & 0x000000ff;

Input:  arg0 = 0x12345678, shift = 24
Output: temp = 0x12

Input:  arg0 = 0x12345678, shift = 0
Output: temp = 0x78
关于右移的附录:

您正在将一个有符号整数向右移位,但幸运的是,您正在使用下面的和mask来屏蔽位。为了完整性起见,在有符号整数上右移可以做以下两件事之一(假设此处为16位数字,32位或64位数字的结果将不同):

算术右移:

decimal: -128                  >> 1 == -64
binary:  0b1111 1111 1000 0000 >> 1 == 0b1111 1111 1100 0000
decimal: -128                  >> 1 == 32704
binary:  0b1111 1111 1000 0000 >> 1 == 0b0111 1111 1100 0000
逻辑右移:

decimal: -128                  >> 1 == -64
binary:  0b1111 1111 1000 0000 >> 1 == 0b1111 1111 1100 0000
decimal: -128                  >> 1 == 32704
binary:  0b1111 1111 1000 0000 >> 1 == 0b0111 1111 1100 0000
请注意算术右移如何“复制”顶部位,其中“逻辑右移”带来了零。这是特定于平台的解释,所以如果可能的话,尽量远离它,并坚持无符号整数移位

temp = arg0 >> shift
这是一个小小的转变。整数值
arg0
将向右移位
shift
位数

例如,如果shift=8且arg0=0x1234,则将为temp分配0x12

在代码中,如果arg0=0x12345678且shift=24,则temp变为0x123456

temp = temp & 0x000000ff;
这是一个按位
操作。十六进制数0x0000000ff用于在将最低有效字节传递到byteToDec()之前屏蔽该字节

因此,在最后一个示例中,arg0=0x12345678,temp被移动24到=0x123456,然后被屏蔽为0x00000056

就MIPS而言,--Shift Right逻辑变量(SRLV)指令将用于移位

SRLV $d, $t, $s

其中,$d是目标寄存器,$t是源寄存器,$s是保存移位数值的寄存器。值得理解的是,这个移位从左边引入了零,并将更改负的有符号整数的值,但由于应用了一个掩码,将零应用于除最低有效字节以外的所有字节,因此它是可以的,并将为您节省一些指令

为什么不在调试器中一步一步地跟踪这段代码,看看发生了什么?你将学到更多的是自己计算,而不是别人为你描述。请看,作为一个提示:我想对于机器语言,应该有一个单独的指令可以精确地为每一个操作执行这些操作。