有人能解释一下汇编指令int$0x00和实际除以零之间的区别吗?我在与IDT中的第0个条目(除法错误)关联的内核中的divide_error()处理程序上设置了一个断点。当我在我的C程序中执行此操作时:inti=5/0;然后我到达了断点(如预期的那样)。然而,asmvolatile("int$0x00")不触发处理程序。为什么? 最佳答案 int0h与CPU由于除以零而生成陷阱0不同。这articleofPhrack很好地解释了IDT以及Linux如何设置它。关键部分是:DPL=DescriptorPrivilegeLevelThe
当程序启动时(LinuxELF可执行文件),eax、ebx等中是否有零,或者是否可以有任何内容?(我没有进行任何调用或使用外部库)。在我的机器上,寄存器被归零,但是我可以在编写asm程序时在新进程中依赖这种行为吗? 最佳答案 这完全取决于每个平台的ABI。既然你提到了eax和ebx让我们看看x86的情况(从Linuxv5.17.5开始)。在fs/binfmt_elf.c中,在load_elf_binary()中,内核检查ABI是否指定了任何requirements对于程序加载时的寄存器值:/**TheABImayspecifytha
当程序启动时(LinuxELF可执行文件),eax、ebx等中是否有零,或者是否可以有任何内容?(我没有进行任何调用或使用外部库)。在我的机器上,寄存器被归零,但是我可以在编写asm程序时在新进程中依赖这种行为吗? 最佳答案 这完全取决于每个平台的ABI。既然你提到了eax和ebx让我们看看x86的情况(从Linuxv5.17.5开始)。在fs/binfmt_elf.c中,在load_elf_binary()中,内核检查ABI是否指定了任何requirements对于程序加载时的寄存器值:/**TheABImayspecifytha
voidreturn_input(void){chararray[30];gets(array);printf("%s\n",array);}在gcc中编译后,该函数转换为如下汇编代码:push%ebpmov%esp,%ebpsub$0x28,%espmov%gs:0x14,%eaxmov%eax,-0x4(%ebp)xor%eax,%eaxlea-0x22(%ebp),%eaxmov%eax,(%esp)call0x8048374lea-0x22(%ebp),%eaxmov%eax,(%esp)call0x80483a4mov-0x4(%ebp),%eaxxor%gs:0x14,%e
voidreturn_input(void){chararray[30];gets(array);printf("%s\n",array);}在gcc中编译后,该函数转换为如下汇编代码:push%ebpmov%esp,%ebpsub$0x28,%espmov%gs:0x14,%eaxmov%eax,-0x4(%ebp)xor%eax,%eaxlea-0x22(%ebp),%eaxmov%eax,(%esp)call0x8048374lea-0x22(%ebp),%eaxmov%eax,(%esp)call0x80483a4mov-0x4(%ebp),%eaxxor%gs:0x14,%e
假设我在寄存器中有一个整数,我该如何打印它?你能展示一个简单的示例代码吗?我已经知道如何打印诸如“hello,world”之类的字符串。我在Linux上开发。 最佳答案 如果您已经在使用Linux,则无需自己进行转换。只需使用printf相反:;;assembleandlinkwith:;nasm-felfprintf-test.asm&&gcc-m32-oprintf-testprintf-test.o;section.textglobalmainexternprintfmain:moveax,0xDEADBEEFpusheaxp
假设我在寄存器中有一个整数,我该如何打印它?你能展示一个简单的示例代码吗?我已经知道如何打印诸如“hello,world”之类的字符串。我在Linux上开发。 最佳答案 如果您已经在使用Linux,则无需自己进行转换。只需使用printf相反:;;assembleandlinkwith:;nasm-felfprintf-test.asm&&gcc-m32-oprintf-testprintf-test.o;section.textglobalmainexternprintfmain:moveax,0xDEADBEEFpusheaxp
我想获取特定点的CPU周期。我当时使用这个功能:static__inline__unsignedlonglongrdtsc(void){unsignedlonglongintx;__asm__volatile(".byte0x0f,0x31":"=A"(x));//brokenfor64-bitbuilds;don'tcopythiscodereturnx;}(编者注:"=A"对于x86-64是错误的;它选择RDX或RAX。只有在32位模式下它才会选择EDX:EAX输出你想要的。见HowtogettheCPUcyclecountinx86_64fromC++?。)问题是它总是返回一个增
我想获取特定点的CPU周期。我当时使用这个功能:static__inline__unsignedlonglongrdtsc(void){unsignedlonglongintx;__asm__volatile(".byte0x0f,0x31":"=A"(x));//brokenfor64-bitbuilds;don'tcopythiscodereturnx;}(编者注:"=A"对于x86-64是错误的;它选择RDX或RAX。只有在32位模式下它才会选择EDX:EAX输出你想要的。见HowtogettheCPUcyclecountinx86_64fromC++?。)问题是它总是返回一个增
我试图通过使用gdb的反汇编器检查一个简单的C程序来理解它的汇编级代码。以下是C代码:#includevoidfunction(inta,intb,intc){charbuffer1[5];charbuffer2[10];}voidmain(){function(1,2,3);}以下是main的反汇编代码和functiongdb)disassmainDumpofassemblercodeforfunctionmain:0x08048428:push%ebp0x08048429:mov%esp,%ebp0x0804842b:and$0xfffffff0,%esp0x0804842e:su