混合使用C、C++和汇编语之:内联汇编和嵌入型汇编的使用
7.内联汇编指令中的操作数
内联汇编指令中的操作数分为以下4种。
·虚拟寄存器
·表达式操作数
·寄存器列表
·中间操作数
(1)虚拟寄存器
在内联汇编指令中指定的寄存器表示虚拟寄存器而不是实际的物理寄存器。由编译器编译的汇编代码中使用的物理寄存器可能与在指令中指定的不同。每个虚拟寄存器的初值是不可预测的,必须在读取之前将初值写入虚拟寄存器。如果在写入之前试图读虚拟寄存器,编译程序会给予警告。
(2)表达式操作数
在内联汇编指令中,可将函数自变量、C或C++变量和其他C或C++表达式指定为寄存器操作数。用作操作数的表达式必须为整数类型,如char、short、int或long,(长整型longlong除外)或指针类型。当表达式作为内联汇编指令的操作数时,编译器在编译时自动增加一段代码计算表示式的值并将其加载到指定的寄存器中。
注意 | 数据类型中除char和short(默认为无符号类型)外,其他均为有符号类型。 |
下面的例子显示了编译器如何处理内联汇编中的表达式操作数。
程序源代码如下所示。
/*ExampleOperands*/
voidmy_operand(void)
{
inti,j,total;
__asm
{
movi,#0
movj,#1
addtotal,j,i+j
}
}
intmain(void)
{
my_operand();
}
由编译器编译出的汇编代码如下所示(其中只列出了内联汇编的一段代码)。
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语言相关文章:c语言教程
c++相关文章:c++教程
评论