做电影网站心得,长春seo网络优化招聘网,wordpress正版主题,网站开发的著作权归谁GCC内敛汇编
基本格式
asm(汇编语句
:输出操作数(可选)
:输入操作数(可选)
:被破坏的寄存器(可选)
);示例
int a 10, b;
asm(movl %1, %%eax; movl %%eax, %0;:r(b) /*输出*/:r(a) /*输入*/:%eax /*破坏的寄存器*/)实现…GCC内敛汇编
基本格式
asm(汇编语句
:输出操作数(可选)
:输入操作数(可选)
:被破坏的寄存器(可选)
);示例
int a 10, b;
asm(movl %1, %%eax; movl %%eax, %0;:r(b) /*输出*/:r(a) /*输入*/:%eax /*破坏的寄存器*/)实现的是ba的功能 具体格式说明
只有一条汇编语句
asm(hlt) //CPU进行休眠多条汇编(需要分隔符)
asm(sti;hlt);
asm(sti\n\thlt);
asm(sti\n\thlt);多条语句的时候使用\n\t或者使用;进行分割 有输出操作数
有些时候有的数据需要将数据输出到C语言里面的某一些变量里面, 可以使用输出操作数
char c;
asm(mov $3, %[out]:[out]r(c));%[out]是定义的一个输出约束, 名称和后面的out相同, r©则指定了c变量映射到某一个寄存器 r: 任意寄存器a: %eax, %ax, %alb:c:d:S: %esi, %siD: %edi, %di 有输入操作数
当需要从C语言中读取变量的值到汇编语句中时则需要使用输入操作数。例如下面的代码中,mov %[ch], %%al用于将c变量中的字符写到al中。因此在输入操作数中使用了[ch]r©即c变量映射到某个寄存器上(见上文中输出操作数的类似设置)。最终的效果为: mov$0xe,%%ah、mov %[c] %%al
char c a;
asm(mov $0xe, %%ah\n\tmov %[ch], %%al\n\tint $0x10::[ch]r(c));在这个时候所有的寄存器前面使用的是%% 参数保存在内存里面
asm(sidt %0\n : :m(loc)
);这条语句将 IDTR 寄存器的值保存在内存位置 loc 处。 匹配约束符(数字)
一个变量既要当做输入操作数又要当做输出操作数。这种情况下在 asm 中使用匹配约束来指定。
asm (incl %0 :a(var):0(var)
);寄存器 %eax 既用来保存输入操作数也用来保存输出操作数。输入变量 var 被存进 %eax在 %eax 中完成自增。“0” 在这里表示与第 0 号输入操作数有相同的约束既 “a” 从一个变量读取输入修改后结果存进同一个变量的情况输入操作数和输出操作数没必要分开的情况。 避免优化
使用__asm__ __volatile__代替原来的asm