好,说完了限定符,下面来看看修改符。修改符是加在限定符之前的,并且是可选的,如果没有修改符的话,则表明这个操作数是只读的。这个对输入操作数没有问题,但是对输出操作数来说,肯定是需要被修改的,那怎么办呢?答案就是使用修改符,修改这个操作数的属性。目前,GCC中定义了三个修改符,分别是:
修改符含义= 只写操作数,通常用于输出操作数中
+ 可读且可写操作数,必须要列在输出操作数中
& 寄存器只能用于输出
所以,作为输出操作数,只需要在限定符前加上“=”就可以了。
在汇编代码中,请绝对不要修改输入操作数的值。
如果想让一个C变量既作为输入操作数,也作为输出操作数的话,可以使用“+”限定符,并且这个操作数只需要在输出操作数列表中列出就行了。例如:
__asm__("mov %0, %0, ror #1" : "+r" (y) );
上面的例子是将变量y中的值又移1位。因为输入和输出操作数是一个,所以该操作数要既可读也可写,因此添加了“+”修改符。
但是GCC的老版本不一定支持“+”修改符,如果也想达到前面的这种输入和输出操作数是一个的目的,可以用一种变通的做法,并且这种变通的做法GCC的新版本也是支持的。其实,在限定符中,也可以使用数字,其作用是指代前面定义的操作数,0代表第一个,1代表第二个,以此类推。例如:
__asm__("mov %0, %0, ror #1" : "=r" (y) : "0" (y) );
如果GCC编译器支持的话,这个例子的效果和前面的例子是相同的。本例不同的是,先定义了一个可写的输出变量,同时在输入变量列表中,明确用数字0指出了前面定义的第一个操作数同时也要用来作为输入操作数。
好了,已经介绍了两个修改符的用处了,还剩下最后一个“&”。前面的例子是明确要求输出操作数和输入操作数使用同一个寄存器,但有时候刚好相反,输出操作数使用的寄存器一定不能和输入操作数使用的寄存器一样。但是,由于编译器的优化,是完全有可能出现同一个寄存器既用作输入操作数也用作输出操作数的情况的。这时,可以在输出操作数中使用“&”修改符,明确告诉编译器,代表输出操作数的寄存器一定不能使用输入操作数已经使用过的寄存器。下面举个例子: