</pre><pre name="code" class="cpp">
/*************************************************************************
> File Name: inout.c
> Author: zshh0604
> Mail: zshh0604@163.com
> Created Time: Wed 10 Dec 2014 02:47:50 PM
************************************************************************/
#include<stdio.h>
// __asm__ __volatile__(
//
// );
int main(void)
{
/*************************************************/
//第一种访问寄存器的方式.
//强制将变量将寄存器绑定.
//立即数前面必须加#
register unsigned int a asm("r0");
asm volatile(
"mov r0,#30\n" //该r0赋值为30.
);
/************************************************/
//第一个冒号后面只能声明输出变量或者输入输出变量.
//第二个冒号后面只能声明输入变量.
//第三个冒号后面只能声明需要保护的寄存器.
//使用"=&r"声明一个输出变量.
//使用"r" 声明一个输入变量.
//使用"r+"声明一个输入输入变量.
//在汇编中使用%0, %1,这样变量,他会自动绑定没有使用的寄存器.
//%0和%1,会按照变量声明的顺序一次绑定.这里的%0会绑定到out, %1会自动绑定到out1.
int out; int in_out;
int in=10;
asm volatile(
"mov r0,#30\n" //该r0赋值为30.
"mov %0,r0\n"
"mov %1,r0\n"
"mov r0,%2\n"
:"=r"(out), "r+"(in_out) //声明一个输出,和输入输出变量.
:"r"(in) //声明输入变量.
:"r0" //保护寄存器.
);
/************************************************/
//[a] [b] [in] 给声明的变量分别加上标记.
//在汇编代码中可以使用这些标记.%0, %1,中的0,和1
asm volatile(
"mov r0,#30\n" //该r0赋值为30.
"mov %[a],r0\n"
"mov %[b],r0\n"
"mov r0,%[in]\n"
:[a]"=r"(out), [b]"r+"(in_out) //声明一个输出,和输入输出变量.
:[in]"r"(in) //声明输入变量.
:"r0" //保护寄存器.
);
/***************************************************/
//r 为使用寄存器操作变量声明.
//r 不加如何表示,表示的是输入变量,只能读,不能写.
//r+ 表示输入输出变量.
//=r 表示的是输出变量
//& 表示输出变量.不会和输入变量公用一个寄存器.
return 0 ;
}
作者:左少华
转载请注明出处: