这个问题在这里已经有了答案:Whathappensifyouusethe32-bitint0x80LinuxABIin64-bitcode?(1个回答)关闭4年前。我在从Linux64位汇编程序访问进程命令行时遇到问题。为了用最少的代码重现这一点,我制作了这个打印程序名称前5个字符的32位程序:.section.text.globl_start_start:movl%esp,%ebpmovl$4,%eax#writemovl$1,%ebx#stdoutmovl4(%ebp),%ecx#programnameaddress(argv[0])movl$5,%edx#hard-codedle
再次打扰一下。我正在尝试理解学习汇编语言。但是我有很多问题。我正在尝试使用NASM中的字符串。我已将字符串常量复制到字符串变量。最大大小为50。所以我想验证这个界限。但是这个程序抛出一个段错误。我在MASM中使用了一个示例,因此可能存在NASM语法的使用错误。我的程序如下:section.dataMAXTEXTSIZEequ50_cte_holadb"Hola",0_cte_mundodb"Mundo",0section.bssMAIN_dresbMAXTEXTSIZE+1section.textglobal_startstrlen:movbx,0strl01:cmpWORD[SI+B
再次打扰一下。我正在尝试理解学习汇编语言。但是我有很多问题。我正在尝试使用NASM中的字符串。我已将字符串常量复制到字符串变量。最大大小为50。所以我想验证这个界限。但是这个程序抛出一个段错误。我在MASM中使用了一个示例,因此可能存在NASM语法的使用错误。我的程序如下:section.dataMAXTEXTSIZEequ50_cte_holadb"Hola",0_cte_mundodb"Mundo",0section.bssMAIN_dresbMAXTEXTSIZE+1section.textglobal_startstrlen:movbx,0strl01:cmpWORD[SI+B
我试图在用户模式下执行特权指令rdmsr,我希望得到某种特权错误,但我得到了一个段错误。我检查了asm并将0x186加载到ecx中,它应该是PERFEVTSEL0,基于manual,第1171页。段错误的原因是什么,我该如何修改下面的代码来修复它?我想在破解内核模块之前解决这个问题,因为我不希望这个段错误破坏我的内核。更新:我在Intel(R)Xeon(R)CPUX3470上运行。#define_GNU_SOURCE#include#include#include#include#includeuint64_tread_msr(intecx){unsignedinta,d;__asm_
我试图在用户模式下执行特权指令rdmsr,我希望得到某种特权错误,但我得到了一个段错误。我检查了asm并将0x186加载到ecx中,它应该是PERFEVTSEL0,基于manual,第1171页。段错误的原因是什么,我该如何修改下面的代码来修复它?我想在破解内核模块之前解决这个问题,因为我不希望这个段错误破坏我的内核。更新:我在Intel(R)Xeon(R)CPUX3470上运行。#define_GNU_SOURCE#include#include#include#include#includeuint64_tread_msr(intecx){unsignedinta,d;__asm_
在尝试测试时Isitallowedtoaccessmemorythatspansthezeroboundaryinx86?在Linux的用户空间中,我编写了一个32位测试程序,试图映射32位虚拟地址空间的低页和高页。在echo0|之后sudotee/proc/sys/vm/mmap_min_addr,我可以映射零页,但是我不知道为什么我不能映射-4096,即(void*)0xfffff000,最高页。为什么mmap2((void*)-4096)返回-ENOMEM?strace./a.outexecve("./a.out",["./a.out"],0x7ffe08827c10/*65va
在尝试测试时Isitallowedtoaccessmemorythatspansthezeroboundaryinx86?在Linux的用户空间中,我编写了一个32位测试程序,试图映射32位虚拟地址空间的低页和高页。在echo0|之后sudotee/proc/sys/vm/mmap_min_addr,我可以映射零页,但是我不知道为什么我不能映射-4096,即(void*)0xfffff000,最高页。为什么mmap2((void*)-4096)返回-ENOMEM?strace./a.outexecve("./a.out",["./a.out"],0x7ffe08827c10/*65va
我想使用链接程序集方法而不是C中的内联程序集方法将值从C程序传递到程序集。下面是正在开发的汇编程序(GCD)。;gcdasm.nasmbits64section.textglobalgcdasmgcdasm:pushrbpmovrbp,rspmovrax,[rbp+4];loadraxwithxmovrbx,[rbp+8];loadrbxwithytop:cmprax,rbx;x(rax)hastobelargerthany(rbx)jeexit;ifx=ythenexitandreturnvalueyjbxchange;ifx这是我尝试将值传递给汇编程序的C程序//gcd.c#inc
我想使用链接程序集方法而不是C中的内联程序集方法将值从C程序传递到程序集。下面是正在开发的汇编程序(GCD)。;gcdasm.nasmbits64section.textglobalgcdasmgcdasm:pushrbpmovrbp,rspmovrax,[rbp+4];loadraxwithxmovrbx,[rbp+8];loadrbxwithytop:cmprax,rbx;x(rax)hastobelargerthany(rbx)jeexit;ifx=ythenexitandreturnvalueyjbxchange;ifx这是我尝试将值传递给汇编程序的C程序//gcd.c#inc
测试在32位x86Linux上进行。所以基本上我试图通过在汇编代码中插入检测指令来记录已执行的基本block的信息。我的策略是这样的:将一个已执行的基本block的索引写在一个globl数组中,当数组满(16M)时,将数组从内存刷新到磁盘。这是我的问题。当检测二进制文件的执行结束时,我需要将阵列刷新到磁盘,即使它没有达到16M边界。但是,我只是不知道在哪里可以找到assembly程序的导出。我试过这个:grepexit从目标汇编程序中,并在callexit指令之前刷新内存。但根据一些调试经验,objective-c程序,例如md5sum二进制文件,在执行完成时不会调用exit。在mai