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