[英]What do andi and ori do in this program?
.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
我想,除了兩個指令andi
和ori
在這種情況下如何工作之外,我能理解一切。 ori似乎使得ASCII 20位置向前打印,但為什么以及如何?
帶有0x7f的andi
刪除最高有效位,ASCII不使用它(僅使用7位,或0-128來映射字符)。 0x7f是二進制的0111 1111。 由於任何AND與0(最高有效位為0,如您所見)為0,任何AND與1保持不變,操作將刪除最高有效位。
帶有0x20的ori
只會設置第6位(2 5 )。 0x20是二進制的0010 0000。 因為任何OR與1(第6位,如你所見)是1,任何OR與0保持相同,它導致設置第6位。
正如評論所說,只是在r16最初小於32的情況下,或者在r16> = 128且<160的情況下,它將使數字> = 0x20。 但這並不意味着它總是會添加0x20(例如r16最初是32 --addi - > 33 --andi - > 33 --ori - > 33)。
作為旁注,與常量(也稱為掩碼 )的AND'通常用於從原始數據中提取某些位。 並且它將提取掩碼中相應位為1的任何位。
與常數進行“或”運算通常是將某些位設置為1.它將設置掩碼中相應位為1的位。
順便說一下,要將某個位設置為0,除了要設置的位之外,您可以使用常量除1之外的常量。 要切換某些位,可以使用相應位1和其余0的常量進行異或。
使用and
組裝是一種確保關閉的方法。 考慮:
1101 and
0111
---------
0101
僅在第二列和最后一列中,1s存在於頂部AND
底部,有效地確保第一位被關閉。
在匯編中使用'或'是確保某個位開啟的一種方法。 考慮:
1101 or
0111
----------
1111
底行的1s確保無論第一個數字是什么,最后三位都將打開。
andi和ori都是按位運算符:
為了看到差異,concider“
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.