簡體   English   中英

C怪異的函數變量賦值

[英]C weird function variable assignment

我在學習如何制作虛擬機時找到了這段代碼。 但是我不知道此函數的作用。 你們中任何人都知道此功能在做什么嗎?

void decode( int instr )
{
instrNum = (instr & 0xF000) >> 12;
reg1     = (instr & 0xF00 ) >>  8;
reg2     = (instr & 0xF0  ) >>  4;
reg3     = (instr & 0xF   );
imm      = (instr & 0xFF  );
}

變量instr = 1。

這些是位操作 ,通常用於將一些標志緊湊地存儲在單個整數中。 此函數從參數instr “讀取”位並將結果寫入其他字段。

該功能節省了4位(稱為特定集合從變量) instr到其他變量instrNumreg1等(這些其他變量必須有一個全球范圍內,因為他們不是在這里定義)。

考慮例如instr0x1234

instrNum = (0x1234 & 0xF000) >> 12; 
         = (0x1000) >> 12;
         = 1      
reg1 = (0x1234 & 0xF00) >> 8;
     = (0x0200) >> 8;
     = 2
reg2 = (0x1234 & 0xF0) >> 4;
     = (0x0030) >> 4;
     = 3
reg3 = (0x1234 & 0xF);
     = (0x0004);
     = 4
imm = (0x1234 & 0xFF);
     = (0x0034);
     = 52

因此,它將變量instr每個半字節都保存到一個單獨的變量中。 最后一個變量imm獲取最后一個字節。 &>>是位運算符,用於分隔位的AND運算符右移運算符
任何人都猜測為什么要保存這些變量,我們需要知道這些變量是什么類型以及它們的用途,但是無論如何就是正在發生的事情。

此功能似乎解碼的指令instr成一個4位的指令代碼( instNum ),和最多三個寄存器4位的代碼( reg1reg3 )。 在您的虛擬機中,似乎還存在用於立即8位操作數( imm )的編碼。 這是我對VM的16位指令集的猜測的說明:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM