4
        .global main            # makes label "main" globally known

        .text                   # Instructions follow
        .align  2               # Align instructions to 4-byte words

main:   movi    r16,0x47        # Load the hexadecimal value 41
                                # to register r16

loop:   mov     r4,r16          # Copy to r4 from r16

        nop                     # (later changed to call hexasc)
        nop                     # (later changed to mov r4,r2)

        movia   r8,putchar      # copy subroutine address to a register
        callr   r8              # call subroutine via register

        addi    r16, r16,1      # Add 1 to register r16
        andi    r16, r16, 0x7f  # mask with 7 bits
        ori     r16, r16, 0x20  # set a bit to avoid control chars

        br      loop            # Branch to loop

        .end                    # The assembler will stop reading here
        foo bar bletch          # comes after .end - ignored

我想我什么都能理解,除了这两个指令在这种情况下是如何工作的andioriori 似乎是为了打印 ASCII 20 个位置,但为什么以及如何打印?

4

3 回答 3

4

andiwith 0x7f 删除最高有效位,ASCII 不使用该位(仅使用 7 位,或 0-128 来映射字符)。0x7f 是二进制的 0111 1111。由于任何 AND 与 0(最高有效位为 0,如您所见)为 0,任何 AND 与 1 保持不变,该操作将删除最高有效位。

ori使用 0x20 只会设置第 6 位 (2 5 )。0x20 是二进制的 0010 0000。由于任何与 1 的 OR(如您所见,第 6 位)都是 1,而与 0 的任何 OR 都保持不变,因此会导致设置第 6 位。

正如评论所说,如果 r16 最初小于 32,或者如果 r16 >= 128 且 < 160,它将使数字 >= 0x20。但这并不意味着它总是会添加 0x20(例如 r16 最初是 32 --addi--> 33 --andi--> 33 --ori--> 33)。

作为旁注,与常数(也称为掩码)进行与运算通常用于从原始数据中提取某些位。它将提取掩码中对应位为 1 的任何位。

与常量进行或运算通常用于将某些位设置为 1。它将设置掩码中对应位为 1 的位。

顺便说一句,要将某个位设置为 0,您可以与除您要设置的位之外的所有 1 的常量进行与运算。要切换某些位,您可以将常数与相应的位 1 和其余位 0 进行异或。

于 2012-08-20T05:03:57.900 回答
3

在汇编中使用and是一种确保位关闭的方法。考虑:

1101 and
0111
---------
0101

只有在第二列和最后一列中,1 存在于顶部AND底部,有效地确保了第一位被关闭。

在汇编中使用“或”是一种确保位处于打开状态的方法。考虑:

1101 or
0111
----------
1111

底行的 1 确保无论第一个数字是什么,最后三位都将打开。

于 2012-08-20T10:55:34.707 回答
1

andi 和 ori 都是按位运算符:

要看到差异,请考虑“

and $rd, $rs, $rt
or  $rd, $rs, $rt 

相对

andi $rt, $rs, immed
ori  $rt, $rs, immed

http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/bitwise.html

于 2012-08-20T05:03:21.180 回答