1、1.代码如下:
#include
void main()
{
int number[3][3]={5,4,3,2,9,1,7,8,6}; //打乱的序列(大于0的任何int型数都可以)
int a[3][3]={5,4,3,2,9,1,7,8,6};
int p=0,q=0,temp=0,num1=0,num2=0,t=0,k=0,i,j,g=0;
//a=number;
temp=10;
for(int m=0;m<3;m++)
{
for(int n=0;n<3;n++)
{
for(i=num2;i<3
2、i++)
{
for(j=k;j<3;j++)
{
if(a[i][j]3、n];
number[m][n]=t;
t=a[p][q];
a[p][q]=a[m][n];
a[m][n]=t;
if(num1==3)
num1=0;
num1++;
k=num1;
temp=10;
//temp=number[num2][num1];
}
num2++;
temp=10;
k=0;
// temp=number[num2][num1];
}
for(int b=0;b<3;b++)
4、 //从数组中打印升序的数字
{
for(int c=0;c<3;c++)
{
printf("%d ",number[b][c]);
}
printf("\n");
}
}
结果抓图:
10.
局限性:
1.GNU ARM编译环境下内嵌汇编语言不能直接引用C语言中的变量。
2.不要直接向程序计数器PC赋值,程序的跳转只能通过B或BL指令实现。
一般将寄存器R0~R3、R12及R14用于子程序调用存放中间结果,因此在内嵌汇编指令中,一般不要将这些寄存器同时指定为指令中的物理寄存器。
在内
5、嵌的汇编指令中使用物理寄存器时,如果有C语言变量使用了该物理寄存器,则编译器将在合适的时候保存并恢复该变量的值。需要注意的是,当寄存器SP、SL、FP以及SB用作特定的用途时,编译器不能恢复这些寄存器的值
通常在内嵌汇编指令中不要指定物理寄存器,因为有可能会影响编译器分配寄存器,进而可能影响代码的效率
3.C语言程序中的标号可以被内嵌的汇编指令所使用。但是只有B指令可以使用C语言程序中的标号,BL指令不能使用C语言程序中的标号。
4.内嵌汇编器不支持汇编语言中用于内存分配的伪操作。所用的内存单元的分配都是通过C语言程序完成的,分配的内存单元通过变量以供内嵌的汇编器使用
5.SWI和BL
6、指令用于内嵌汇编时,除了正常的操作数域外,还必须增加如下3个可选的寄存器列表:
用于存放输入的参数的寄存器列表。
用于存放返回结果的寄存器列表。
用于保存被调用的子程序工作寄存器的寄存器列表。
代码:
#include
void Main()
{
char *a="Hello";
char *b="ab";
my_strcopy(a,b);
}
void my_strcopy(char *src,char *dst)
{
__asm
(
"
loop:
ldrb r4,[r0],#1;\
strb r4,[r1],#1;\
cmp r4,#0;\
bne loop;"
);
}
结果抓图: