#include <stdio.h>
int main()
{
int result = 0;
int input = 1;
int a = 1;
int b = 2;
asm volatile (
"movl %1, %0\n" // 通过占位符指定交互的变量
: "=r"(result) // 输出变量,与汇编交互
: "r"(input) // 输出变量,与汇编交互
// 这里的r指示编译器自动将通用寄存器关联到变量
);
printf("result = %d\n", result);
printf("input = %d\n", input);
asm volatile (
"movl %%eax, %%ecx\n"
"movl %%ebx, %%eax\n"
"movl %%ecx, %%ebx\n"
: "=a"(a), "=b"(b) // 这里指明a变量使用a寄存器
: "a"(a), "b"(b)
);
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
对于上述示例,编译器做了如下工作:
1.将result关联到某个合适的寄存器
2.将input关联到某个合适的寄存器
3.通过通用寄存器间接操作变量
注意:
汇编语言不支持内存到内存的直接操作,要使用寄存器作为中间角色。
可以直接通过内嵌汇编使用系统服务。通过INT 80H使用内核服务
1.INT指令用于使用Linux内核服务(中断指令)
2.80H是一个中断向量号,用于执行系统调用
3.可以通过寄存器指定具体的系统调用及其参数(如sys_write服务)
char* s = "D.T.Software\n";
int l = 13;
asm volatile(
"movl $4, %%eax\n" //
"movl $1, %%ebx\n"
"movl %0, %%ecx\n"
"movl %1, %%edx\n"
"int $0x80 \n"
:
: "r"(s), "r"(l)
: "eax", "ebx", "ecx", "edx"
);
asm volatile(
"movl $1, %eax\n"
"movl $42, %ebx\n"
"int $0x80 \n"
);
注意:
1.内嵌汇编时,除汇编模板外,其余参数都可以省略
2.当省略的参数在中间时,对应分隔符":"不可省略
3.当省略保留列表时,对应得到分隔符":"可以省略
4.当省略可选参数时,寄存器前使用单个%作为前缀
当存在可选参数时,寄存器前使用两个%%作为前缀
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。