gpt4 book ai didi

assembly - andi和ori在这个程序中做了什么?

转载 作者:行者123 更新时间:2023-12-02 19:10:18 25 4
gpt4 key购买 nike

        .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

我想,除了两条指令 andiori 在这种情况下如何工作之外,我可以理解一切。 ori 似乎可以打印 ASCII 20 位向前的位置,但为什么以及如何打印?

最佳答案

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

ori 与 0x20 只会设置第 6 位 (25)。 0x20 是二进制的 0010 0000。由于与 1(第 6 位,如您所见)的任何 OR 都是 1,并且与 0 的任何 OR 保持不变,因此会设置第 6 位。

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

作为旁注,与常量(也称为掩码)进行“与”通常是为了从原始数据中提取某些位。并提取掩码中对应位为1的任意一位。

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

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

关于assembly - andi和ori在这个程序中做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12032437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com