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