编程语言
首页 > 编程语言> > GCC内联汇编中的系统调用

GCC内联汇编中的系统调用

作者:互联网

参见英文答案 > How to invoke a system call via sysenter in inline assembly?                                    2个
是否可以使用内联汇编块中的系统调用来编写单个字符?如果是这样,怎么样?它应该看起来像这样的“东西”:

__asm__ __volatile__
                    (
                     " movl $1,  %%edx \n\t"
                     " movl $80, %%ecx \n\t"
                     " movl $0,  %%ebx \n\t"
                     " movl $4,  %%eax \n\t"
                     " int $0x80       \n\t"
                     ::: "%eax", "%ebx", "%ecx", "%edx"
                    );

80美元是ascii中的’P’,但是没有返回任何内容.

任何建议非常感谢!

解决方法:

就像是


char p = 'P';

int main()
{
__asm__ __volatile__
                    (
                     " movl $1,  %%edx \n\t"
                     " leal p , %%ecx \n\t"
                     " movl $0,  %%ebx \n\t"
                     " movl $4,  %%eax \n\t"
                     " int $0x80       \n\t"
                     ::: "%eax", "%ebx", "%ecx", "%edx"
                    );
}

补充:请注意我已经使用lea将char的有效地址加载到ecx寄存器中;对于ebx的价值,我尝试了$0和$1,无论如何它似乎都有效…

避免使用外部焦炭

int main()
{
__asm__ __volatile__
                    (
                     " movl $1,  %%edx \n\t"
                     " subl $4, %%esp \n\t"
                     " movl $80, (%%esp)\n\t"
                     " movl %%esp, %%ecx \n\t"
                     " movl $1,  %%ebx \n\t"
                     " movl $4,  %%eax \n\t"
                     " int $0x80       \n\t"
                     " addl $4, %%esp\n\t"
                     ::: "%eax", "%ebx", "%ecx", "%edx"
                    );
}

N.B.:因为英特尔处理器的字节顺序而有效! :d

标签:c-3,linux,gcc,system-calls,inline-assembly
来源: https://codeday.me/bug/20190610/1213279.html