解决内联汇编64位Linux系统调用提示Bad Address
在参考《Linux 下系统调用的三种方法》这篇文章的时候,前面的syscall()和chmod()两种方法完成系统调用chmod都可以正常执行。
但当我使用内联汇编时,程序执行提示errno=14 Bad Address
asm ( 汇编程序模板
: 输出操作数 可选的
: 输入操作数 可选的
: 修饰寄存器列表 可选的
)
//关键代码asm("int $0x80" //immediate value start with $ in at&t syntax: "=a"(rc) //output operand,'=' means write only,'a' means use eax: "0"(SYS_chmod), "b"(file_name), "c"(mode) //'0' use the same register as output operand 1(eax here));
而这段代码,根据作者所述在32位Linux执行和前两种结果一致,那么应该就是64位系统调用的问题,经过一番搜索,找到了答案:在64位Linux上使用中断0x80
64位系统调用的指令是syscall,调用的寄存器也不同于32位的eax ebx ecx…而是rax rdi rsi…
相应的寄存器约束:
r:I/O,表示使用一个通用寄存器,由GCC在%rax/%eax/%ax/%al、%rbx/%ebx/%bx/%bl、%rcx/%ecx/%cx/%cl、%rdx/%edx/%dx/%dl中选取一个GCC认为是合适的;
q:I/O,表示使用一个通用寄存器,与r的意义相同;
g:I/O,表示使用寄存器或内存地址;
m:I/O,表示使用内存地址;
a:I/O,表示使用%rax/%eax/%ax/%al;
b:I/O,表示使用%rbx/%ebx/%bx/%bl;
c:I/O,表示使用%rcx/%ecx/%cx/%cl;
d:I/O,表示使用%rdx/%edx/%dx/%dl;
D:I/O,表示使用%rdi/%edi/%di;
S:I/O,表示使用%rsi/%esi/%si;
f:I/O,表示使用浮点寄存器;
t:I/O,表示使用第一个浮点寄存器;
u:I/O,表示使用第二个浮点寄存器;
A:I/O,表示把%eax与%edx组合成一个64位的整数值;
o:I/O,表示使用一个内存位置的偏移量;
V:I/O,表示仅仅使用一个直接内存位置;
i:I/O,表示使用一个整数类型的立即数;
n:I/O,表示使用一个带有已知整数值的立即数;
F:I/O,表示使用一个浮点类型的立即数;
修改后:
asm("syscall" //immediate value start with $ in at&t syntax: "=a"(rc) //output operand,'=' means write only,'a' means use eax: "0"(SYS_chmod), "D"(file_name), "S"(mode) //'0' use the same register as output operand 1(eax here));
正常提示Operation not permitted
参考:
Linux 下系统调用的三种方法
系统调用约定
在64位Linux上使用中断0x80
内联汇编
如果您在 64 位代码中使用 32 位国际0x80 Linux ABI,会发生什么情况?
解决内联汇编64位Linux系统调用提示Bad Address相关推荐
- 无法安装office此计算机安装了32位,在电脑上安装64位Office2013出错提示找到了32位程序如何解决...
目前微软主流的操作系统有32位和64位操作系统,而由用户反映自己在卸载了Office2007后,开始安装Office2013时提示安装出错,并且显示"无法安装64位版本的Office,因 ...
- linux 64位module内联汇编,@yuanbor: Linux内联汇编总结
1.基本格式 __asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modify); 注意:内联汇编 ...
- linux c内联汇编popl,ShiYanLou/汇编语言.md at master · Ewenwan/ShiYanLou · GitHub
汇编语言简述 内联汇编 G++中的内联汇编分为基本形式的内联汇编与扩展形式的内联汇编:毫无疑问,扩展形式的内联汇编更加复杂,也更加强大 __asm__与asm 两者是一样的,只不过ANSI C标准将a ...
- linux gcc 内联汇编入门
目录 2. 概览(Overview of the whole thing.) 3.GCC汇编语法(GCC Assembler Syntax.) 3.1. 源-目标顺序(Source-Destinati ...
- mupdf不支持x64_x86平台转x64平台关于内联汇编不再支持的解决
工具:VS2005 编译器:cl.exe(X86 C/C++) ml64.exe(X64 ASM64) 前提:X86下内联汇编是嵌在函数当中实现的 在X86平台下,可以轻松的在C/C++代码中嵌入 ...
- linux arm gcc 内联汇编参考手册
关于本文档 GNU C 编译器为 ARM 精简指令系统处理器提供了在 C 代码中内嵌汇编的功能.这种非常酷的特性提供了一些 C 代码没有的功能,比如手工优化软件关键代码.使用相关的处理器指令. 本文假 ...
- 32位汇编第七讲,混合编程,内联汇编
32位汇编第七讲,混合编程 博客园IBinary原创 QQ:2510908331 博客连接:http://www.cnblogs.com/iBinary/ 转载请注明出处,谢谢 混合编程的概念,有时 ...
- Linux C中内联汇编的语法格式及使用方法
在阅读Linux内核源码或对代码做性能优化时,经常会有在C语言中嵌入一段汇编代码的需求,这种嵌入汇编在CS术语上叫做inline assembly.本文的笔记试图说明Inline Assembly的基 ...
- x64内联汇编解决办法
之前一直在x32上内联汇编用着好好的,五一换了电脑,win10 x64,想在一个点停下,结果在用__asm{}的时候vs2015报错说在本结构上不支持该拓展--一路慢慢Google vs2015 co ...
最新文章
- 北京理工大学 python专题课程-Python语言程序设计
- comsol如何设置距离梯度_如何在 COMSOL 软件中设置“优质的”CFD 网格
- 计算机复试通知学校,提醒:部分学校复试通知已经出了!教育部关于21考研复试的规定!...
- .NET6之MiniAPI(十):基于策略的身份验证和授权
- 数万字的0基础React知识大纲一定要藏藏好
- 本地项目怎么推送到码云_如何将本地项目放到码云(gitee)上
- linux迭代同步文件,Linux Shell——迭代循环
- 充电速度公式_关于电池充电时间计算公式
- 玩转Safari:扩展插件说明
- H5播放HLS之videojs播放视频
- android虚拟手机云之二:应用多开
- python tkinter progressbar_Tkinter 之ProgressBar进度条标签
- 微信功能升级:低调开卖全球上网卡 得罪群主进不了群
- 喝酒娱乐小游戏助力神器微信小程序源码下载多种游戏选择玩法多种
- C语言 将整数n分解为若干质数(素数)之积
- java调第三方接口
- JAVA中webSockt一对一聊天
- QQ跳转浏览器php代码,网址在手机QQ内被点击时自动打开默认浏览器跳转php源码...
- 【简历上如何介绍自己的项目?】
- [codeforces 339]E. Three Swaps