混合使用C、C++和匯編語(yǔ)之:內聯(lián)匯編和嵌入型匯編的使用
7.內聯(lián)匯編指令中的操作數
內聯(lián)匯編指令中的操作數分為以下4種。
·虛擬寄存器
·表達式操作數
·寄存器列表
·中間操作數
(1)虛擬寄存器
在內聯(lián)匯編指令中指定的寄存器表示虛擬寄存器而不是實(shí)際的物理寄存器。由編譯器編譯的匯編代碼中使用的物理寄存器可能與在指令中指定的不同。每個(gè)虛擬寄存器的初值是不可預測的,必須在讀取之前將初值寫(xiě)入虛擬寄存器。如果在寫(xiě)入之前試圖讀虛擬寄存器,編譯程序會(huì )給予警告。
(2)表達式操作數
在內聯(lián)匯編指令中,可將函數自變量、C或C++變量和其他C或C++表達式指定為寄存器操作數。用作操作數的表達式必須為整數類(lèi)型,如char、short、int或long,(長(cháng)整型longlong除外)或指針類(lèi)型。當表達式作為內聯(lián)匯編指令的操作數時(shí),編譯器在編譯時(shí)自動(dòng)增加一段代碼計算表示式的值并將其加載到指定的寄存器中。
注意 | 數據類(lèi)型中除char和short(默認為無(wú)符號類(lèi)型)外,其他均為有符號類(lèi)型。 |
下面的例子顯示了編譯器如何處理內聯(lián)匯編中的表達式操作數。
程序源代碼如下所示。
/*ExampleOperands*/
voidmy_operand(void)
{
inti,j,total;
__asm
{
movi,#0
movj,#1
addtotal,j,i+j
}
}
intmain(void)
{
my_operand();
}
由編譯器編譯出的匯編代碼如下所示(其中只列出了內聯(lián)匯編的一段代碼)。
my_operand:
0000807CE3A01000MOVr1,#0
>>>OPERANDS#12movj,#1
00008080E3A00001MOVr0,#1
00008084E0812000ADDr2,r1,r0
>>>OPERANDS#13addtotal,j,i+j
00008088E0803002ADDr3,r0,r2
>>>OPERANDS#15}
0000808CE12FFF1EBXr14
>>>OPERANDS#19{
c語(yǔ)言相關(guān)文章:c語(yǔ)言教程
c++相關(guān)文章:c++教程
評論