测试在32位x86Linux上进行。所以基本上我试图通过在汇编代码中插入检测指令来记录已执行的基本block的信息。我的策略是这样的:将一个已执行的基本block的索引写在一个globl数组中,当数组满(16M)时,将数组从内存刷新到磁盘。这是我的问题。当检测二进制文件的执行结束时,我需要将阵列刷新到磁盘,即使它没有达到16M边界。但是,我只是不知道在哪里可以找到assembly程序的导出。我试过这个:grepexit从目标汇编程序中,并在callexit指令之前刷新内存。但根据一些调试经验,objective-c程序,例如md5sum二进制文件,在执行完成时不会调用exit。在mai
有人可以指出一些书籍或在线资源来详细解释x86的任务管理功能吗?当发生中断或上下文切换时,我特别感兴趣的是了解x86硬件与操作系统(POSIX风格)之间的关系。英特尔手册非常困惑,我似乎无法从中得到太多信息。谢谢,-Dhruv 最佳答案 编辑以添加您的实际答案:保护模式软件架构汤姆·香利Addison-WesleyProfessional(1996年3月16日)ISBN-10:020155447XISBN-13:978-0201554472googlebook,amazon我的回答您看过“了解Linux内核”第3版吗?它可以通过Sa
有人可以指出一些书籍或在线资源来详细解释x86的任务管理功能吗?当发生中断或上下文切换时,我特别感兴趣的是了解x86硬件与操作系统(POSIX风格)之间的关系。英特尔手册非常困惑,我似乎无法从中得到太多信息。谢谢,-Dhruv 最佳答案 编辑以添加您的实际答案:保护模式软件架构汤姆·香利Addison-WesleyProfessional(1996年3月16日)ISBN-10:020155447XISBN-13:978-0201554472googlebook,amazon我的回答您看过“了解Linux内核”第3版吗?它可以通过Sa
我试图将我的堆栈指针移动到一个mmap-ed区域以模拟上下文切换,但不知何故下面的代码总是给出一个段错误:C:structsavectx{void*regs[JB_SIZE];};structsavectx*initctx=(structsavectx*)malloc(sizeof(savectx));void*newsp;if((newsp=mmap(0,STACK_SIZE,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,0,0))==MAP_FAILED){perror("mmapfailed");}initctx->regs[4]=
我试图将我的堆栈指针移动到一个mmap-ed区域以模拟上下文切换,但不知何故下面的代码总是给出一个段错误:C:structsavectx{void*regs[JB_SIZE];};structsavectx*initctx=(structsavectx*)malloc(sizeof(savectx));void*newsp;if((newsp=mmap(0,STACK_SIZE,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,0,0))==MAP_FAILED){perror("mmapfailed");}initctx->regs[4]=
我有一个Linuxx86-32GAS汇编程序这样终止:movl$1,%eaxmovl$0,%ebx#argumentfor_exitint$0x80当我这样退出时,程序正常运行,但如果我尝试读取标准输出输出,我什么也得不到(使用less或wc)。我尝试编译一个最小的C程序并比较strace输出。我发现的唯一区别是,GCC使C程序(intmain(){printf("donkey\n");})隐式退出exit_group(0)在strace输出中。我尝试修改我的ASM程序以使用callexit而不是原始系统调用退出。标准输出现在可以正常读取了。测试用例.datadouout:.strin
我有一个Linuxx86-32GAS汇编程序这样终止:movl$1,%eaxmovl$0,%ebx#argumentfor_exitint$0x80当我这样退出时,程序正常运行,但如果我尝试读取标准输出输出,我什么也得不到(使用less或wc)。我尝试编译一个最小的C程序并比较strace输出。我发现的唯一区别是,GCC使C程序(intmain(){printf("donkey\n");})隐式退出exit_group(0)在strace输出中。我尝试修改我的ASM程序以使用callexit而不是原始系统调用退出。标准输出现在可以正常读取了。测试用例.datadouout:.strin
前几天我决定试一试汇编,我一直在玩弄非常基本的东西,比如从argv打印东西到stdout。我找到了thisgreatlistoflinuxsyscallnumbers带有参数和所有内容,我很好奇为什么r10用于r8和r9之前的参数。我发现了关于什么可以用于什么以及何时使用的各种奇怪约定,例如循环计数器如何进入rcx。r10上移是否有特殊原因?是不是更方便?我可能还应该提到我对此感兴趣是出于好奇,而不是因为它给我带来了问题。编辑:我找到了thisquestion接近,引用thex64ABIdocumentation在第124页上,它指出用户级应用程序使用rdi、rsi、rdx、rcx、r
前几天我决定试一试汇编,我一直在玩弄非常基本的东西,比如从argv打印东西到stdout。我找到了thisgreatlistoflinuxsyscallnumbers带有参数和所有内容,我很好奇为什么r10用于r8和r9之前的参数。我发现了关于什么可以用于什么以及何时使用的各种奇怪约定,例如循环计数器如何进入rcx。r10上移是否有特殊原因?是不是更方便?我可能还应该提到我对此感兴趣是出于好奇,而不是因为它给我带来了问题。编辑:我找到了thisquestion接近,引用thex64ABIdocumentation在第124页上,它指出用户级应用程序使用rdi、rsi、rdx、rcx、r
我有一个用于NASM(ArchLinuxi686)的以下程序SECTION.dataLC1:db"librarycall",0SECTION.textexternexitexternprintf;globalmain;main:global_start_start:pushLC1callprintfpush0callexit用命令组装:nasm-felflibcall.asm如果用_start注释两行,用main取消注释两行,然后用命令进行汇编和链接:gcclibcall.o-olibcall然后程序运行OK。但是,如果使用_start入口点组装代码并使用命令链接:ldlibcall.