草庐IT

c - 为什么这个内联汇编不能为每条指令使用单独的 asm volatile 语句?

对于以下代码:longbuf[64];registerlongrraxasm("rax");registerlongrrbxasm("rbx");registerlongrrsiasm("rsi");rrax=0x34;rrbx=0x39;__asm____volatile__("movq$buf,%rsi");__asm____volatile__("movq%rax,0(%rsi);");__asm____volatile__("movq%rbx,8(%rsi);");printf("buf[0]=%lx,buf[1]=%lx!\n",buf[0],buf[1]);我得到以下输出:

c - 为什么这个内联汇编不能为每条指令使用单独的 asm volatile 语句?

对于以下代码:longbuf[64];registerlongrraxasm("rax");registerlongrrbxasm("rbx");registerlongrrsiasm("rsi");rrax=0x34;rrbx=0x39;__asm____volatile__("movq$buf,%rsi");__asm____volatile__("movq%rax,0(%rsi);");__asm____volatile__("movq%rbx,8(%rsi);");printf("buf[0]=%lx,buf[1]=%lx!\n",buf[0],buf[1]);我得到以下输出:

linux - x86 ASM Linux - 使用 .bss 部分

我希望这些问题相当简单:(NASM编译器、Linux、x86Intel语法)第1部分:我正在尝试弄清楚如何使用汇编程序的.bss部分找到一种方法来存储值,例如来自操作(+-*/)的值到已声明的变量。例如:section.bssvariable:resb50;Imaginarybuffersection.textadd10,1;Operation;movetheresultintovariable所以,我知道可以使用内核中断来读取用户输入(但这涉及字符串,但是有没有办法将这个值复制到variable变量中,以便它以后可以使用吗?这比必须将两个东西压入和压出堆栈要容易得多。第2部分:有没有

linux - x86 ASM Linux - 使用 .bss 部分

我希望这些问题相当简单:(NASM编译器、Linux、x86Intel语法)第1部分:我正在尝试弄清楚如何使用汇编程序的.bss部分找到一种方法来存储值,例如来自操作(+-*/)的值到已声明的变量。例如:section.bssvariable:resb50;Imaginarybuffersection.textadd10,1;Operation;movetheresultintovariable所以,我知道可以使用内核中断来读取用户输入(但这涉及字符串,但是有没有办法将这个值复制到variable变量中,以便它以后可以使用吗?这比必须将两个东西压入和压出堆栈要容易得多。第2部分:有没有

linux - 模块编译 : asm/linkage. h 文件未找到

我正在尝试编译“helloworld”内核模块的示例,在ubuntu11.04、内核3.2.6、gcc4.5.2和fedora16、内核3.2.7、gcc4.6.7上发现问题。代码:#include#includeMODULE_LICENSE("GPL");staticint__inithello_init(void){printk("Hellomoduleinit\n");return0;}staticvoid__exithello_exit(void){printk("Hellomoduleexit\n");}module_init(hello_init);module_exit(

linux - 模块编译 : asm/linkage. h 文件未找到

我正在尝试编译“helloworld”内核模块的示例,在ubuntu11.04、内核3.2.6、gcc4.5.2和fedora16、内核3.2.7、gcc4.6.7上发现问题。代码:#include#includeMODULE_LICENSE("GPL");staticint__inithello_init(void){printk("Hellomoduleinit\n");return0;}staticvoid__exithello_exit(void){printk("Hellomoduleexit\n");}module_init(hello_init);module_exit(

c - Linux asm ("int $0x0") 与除以零

有人能解释一下汇编指令int$0x00和实际除以零之间的区别吗?我在与IDT中的第0个条目(除法错误)关联的内核中的divide_error()处理程序上设置了一个断点。当我在我的C程序中执行此操作时:inti=5/0;然后我到达了断点(如预期的那样)。然而,asmvolatile("int$0x00")不触发处理程序。为什么? 最佳答案 int0h与CPU由于除以零而生成陷阱0不同。这articleofPhrack很好地解释了IDT以及Linux如何设置它。关键部分是:DPL=DescriptorPrivilegeLevelThe

c - Linux asm ("int $0x0") 与除以零

有人能解释一下汇编指令int$0x00和实际除以零之间的区别吗?我在与IDT中的第0个条目(除法错误)关联的内核中的divide_error()处理程序上设置了一个断点。当我在我的C程序中执行此操作时:inti=5/0;然后我到达了断点(如预期的那样)。然而,asmvolatile("int$0x00")不触发处理程序。为什么? 最佳答案 int0h与CPU由于除以零而生成陷阱0不同。这articleofPhrack很好地解释了IDT以及Linux如何设置它。关键部分是:DPL=DescriptorPrivilegeLevelThe

linux - 程序启动时的默认寄存器状态是什么(asm,linux)?

当程序启动时(LinuxELF可执行文件),eax、ebx等中是否有零,或者是否可以有任何内容?(我没有进行任何调用或使用外部库)。在我的机器上,寄存器被归零,但是我可以在编写asm程序时在新进程中依赖这种行为吗? 最佳答案 这完全取决于每个平台的ABI。既然你提到了eax和ebx让我们看看x86的情况(从Linuxv5.17.5开始)。在fs/binfmt_elf.c中,在load_elf_binary()中,内核检查ABI是否指定了任何requirements对于程序加载时的寄存器值:/**TheABImayspecifytha

linux - 程序启动时的默认寄存器状态是什么(asm,linux)?

当程序启动时(LinuxELF可执行文件),eax、ebx等中是否有零,或者是否可以有任何内容?(我没有进行任何调用或使用外部库)。在我的机器上,寄存器被归零,但是我可以在编写asm程序时在新进程中依赖这种行为吗? 最佳答案 这完全取决于每个平台的ABI。既然你提到了eax和ebx让我们看看x86的情况(从Linuxv5.17.5开始)。在fs/binfmt_elf.c中,在load_elf_binary()中,内核检查ABI是否指定了任何requirements对于程序加载时的寄存器值:/**TheABImayspecifytha