我试图通过使用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
我刚刚注意到我的简单程序具有可执行的数据和堆栈段。我在/proc/[pid]/maps中看到了它,并且简单的代码证实了它。例如:;prog.asmsection.datacode:db0xCC;int3section.textglobal_start_start:jmpcodemovrax,60;sys_exitmovrdi,0syscall然后nasm-felf64prog.asmld-oprogprog.o./prog使prog执行int3指令。用C编写并使用gcc构建的程序的数据、堆栈和堆不可执行,那么为什么用汇编编写的程序的行为方式不同? 最佳答案
我刚刚注意到我的简单程序具有可执行的数据和堆栈段。我在/proc/[pid]/maps中看到了它,并且简单的代码证实了它。例如:;prog.asmsection.datacode:db0xCC;int3section.textglobal_start_start:jmpcodemovrax,60;sys_exitmovrdi,0syscall然后nasm-felf64prog.asmld-oprogprog.o./prog使prog执行int3指令。用C编写并使用gcc构建的程序的数据、堆栈和堆不可执行,那么为什么用汇编编写的程序的行为方式不同? 最佳答案
我正在gdb中调试一个二进制文件。它是由gcc在IntelIA-32上编译的C代码。我从objdump中检索了这个输出。我对这里的最后一行最感兴趣:08048d9e8048d9e:55push%ebp8048d9f:89e5mov%esp,%ebp8048da1:83ec18sub$0x18,%esp8048da4:c7442404889904movl$0x8049988,0x4(%esp)8048dab:088048dac:8b4508mov0x8(%ebp),%eax8048daf:890424mov%eax,(%esp)8048db2:e854010000call8048f0b我
我正在gdb中调试一个二进制文件。它是由gcc在IntelIA-32上编译的C代码。我从objdump中检索了这个输出。我对这里的最后一行最感兴趣:08048d9e8048d9e:55push%ebp8048d9f:89e5mov%esp,%ebp8048da1:83ec18sub$0x18,%esp8048da4:c7442404889904movl$0x8049988,0x4(%esp)8048dab:088048dac:8b4508mov0x8(%ebp),%eax8048daf:890424mov%eax,(%esp)8048db2:e854010000call8048f0b我
我写了一个小程序来添加两个整数并使用readelf-aexecutable_name它在elfheader中显示入口点地址为:Entrypointaddress:0x8048330我的可执行文件如何在加载程序将其加载到内存之前就预先知道该地址?elf_format.pdf表示该成员给出了系统首先将控制权转移到的虚拟地址,从而启动了该过程。谁能解释一下这个语句的含义以及这里虚拟地址的含义是什么?另外让我知道,可执行文件从哪里获取0x8048330的值作为入口点地址。只是为了交叉检查,我编译了另一个程序,为此,入口点地址保持相同的值0x8048330(.text部分的偏移量为0x330在这
我写了一个小程序来添加两个整数并使用readelf-aexecutable_name它在elfheader中显示入口点地址为:Entrypointaddress:0x8048330我的可执行文件如何在加载程序将其加载到内存之前就预先知道该地址?elf_format.pdf表示该成员给出了系统首先将控制权转移到的虚拟地址,从而启动了该过程。谁能解释一下这个语句的含义以及这里虚拟地址的含义是什么?另外让我知道,可执行文件从哪里获取0x8048330的值作为入口点地址。只是为了交叉检查,我编译了另一个程序,为此,入口点地址保持相同的值0x8048330(.text部分的偏移量为0x330在这
我是编写引导加载程序的新手。我用asm编写了一个helloworld引导加载程序,并且我现在正在尝试用C编写一个。我已经用C编写了一个helloworld引导加载程序,但我无法编译它。这是我的代码。我究竟做错了什么?为什么不能编译?voidprint_char();intmain(void){char*MSG="HelloWorld!";inti;__asm__("mov%0,%%SI;"::"g"(MSG));for(i=0;i 最佳答案 让我在这里假设很多事情:你想在x86系统上运行你的引导加载程序,你在*nix机器上设置了gc
我是编写引导加载程序的新手。我用asm编写了一个helloworld引导加载程序,并且我现在正在尝试用C编写一个。我已经用C编写了一个helloworld引导加载程序,但我无法编译它。这是我的代码。我究竟做错了什么?为什么不能编译?voidprint_char();intmain(void){char*MSG="HelloWorld!";inti;__asm__("mov%0,%%SI;"::"g"(MSG));for(i=0;i 最佳答案 让我在这里假设很多事情:你想在x86系统上运行你的引导加载程序,你在*nix机器上设置了gc
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭8年前。Improvethisquestion我之前没有汇编编程知识,想学习如何在Linux平台上编写x86汇编代码。但是,我很难找到一个好的资源来自学。TheArtofAssembly这本书看起来不错,但它教授的是HLA。我对必须以一种方式学习,然后再重新学习它不感兴趣。RISC架构似乎也有更好的汇编资源,但不幸的是我没有RISC处理器来学习。有人有什么建议吗?