当前位置: 首页 > 面试题库 >

在GCC内联汇编中进行syscall

贺立果
2023-03-14
问题内容

是否可以从内联汇编块中使用syscall编写单个字符?如果是这样,怎么办?它应该看起来像“东西”:

__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"
                    );
}

注意:它之所以有效是因为Intel处理器的字节序!:D



 类似资料:
  • GCC扩展内联汇编 使用GCC扩展内联汇编的例子如下: #define read_cr0() ({ \ unsigned int __dummy; \ __asm__( \ "movl %%cr0,%0\n\t" \ :"=r" (__dummy)); \ __dummy; \ }) 它代表什么含义呢?这需要从其基本格式讲起。GCC扩展内联汇编的基本格式是: asm [volat

  • GCC基本内联汇编 GCC 提供了两内内联汇编语句(inline asm statements):基本内联汇编语句(basic inline asm statement)和扩展内联汇编语句(extended inline asm statement)。GCC基本内联汇编很简单,一般是按照下面的格式: asm("statements"); 例如: asm("nop"); asm("

  • 问题内容: 溢出, 如何仅使用内联汇编实现putchar(char)过程?我想在x86-64汇编中做到这一点。我这样做的原因是实现我自己的标准库(或至少一部分)。这是我到目前为止的内容: 我正在编译: 感谢您的帮助! 问题答案: 使用GNU C内联asm时,请 使用约束来告诉编译器您想要的东西 ,而不是使用asm模板中的指令“手动”进行。 对于和,我们只需要为模板,用约束来设置所有寄存器输入(与所

  • 问题内容: 说,我想在gcc的内联汇编中调用具有以下签名的函数。我怎样才能做到这一点? 问题答案: 通常,您会想要做类似的事情 也就是说,您根本不需要在嵌入式asm中进行函数调用。这样,您不必担心调用约定或堆栈框架管理的细节。

  • 问题内容: 如何编译为汇编而不是gcc可执行文件。我知道有一个 -S 标志,但是我在makefile中的哪里使用它。例如,如果我使用标志 -O3 -o exe_name ,则应将-S标志放在哪里? 问题答案: 我建议也使用它,因为生成的汇编器具有一些生成的注释,可以“解释”代码。例如: 将在(带有一些注释)中生成通过编译生成的汇编代码 要了解GCC优化正在做什么,甚至可以尝试(但这会产生 数百个

  • 在尝试让一些旧代码重新工作时(https://github.com/chaos4ever/chaos/blob/master/libraries/system/system_calls.h#l387,FWIW),我发现的一些语义似乎在最近的10-15年中发生了非常微妙但仍然危险的变化...:p 该代码在的旧版本(如2.95)中可以很好地工作。总之,这里是代码: 上面代码的问题是(在我的例子中为4.