X86&&X64 汇编学习——内联基础
2016-07-21 11:01
309 查看
前言 现在已经进入了64位时代,但是几乎所有的汇编教程道还停留在16位,32位上。总是让人用起来有种脱轨的感觉,诚如上面所言,我们很难很难找到讲授X64汇编的文档,手册,甚至教程。 但是我还是需要使用的,没办法需要自己慢慢查资料摸索。最近在回顾X86的内嵌汇编,所以想着在做32位内嵌汇编的同时学习64位汇编。 X64汇编的学习你至少要知道X86 32位汇编的基础知识。
在C语言中内嵌汇编访问全局变量
X86#include<stdio.h> int a = 10; int b = 20; int result; int main(){ __asm__ __volatile__ ("movl a, %eax\n\t" "movl b, %ebx\n\t" "imull %ebx,%eax\n\t" "movl %eax,result\n\t" ); printf("the answer is %d\n",result); return 0; }
这段程序的目的用result 来保存 a 与 b 的乘积,典型的X86用法。我们再来看看X64的用法:
#include<stdio.h> int a = 10; int b = 20; int result; int main(){ __asm__ __volatile__ ("movq a, %rax\n\t" "movq b, %rbx\n\t" "imulq %rbx,%rax\n\t" "movq %rax,result\n\t" ); printf("the answer is %d\n",result); return 0; }
首先指令上:movl ---> movq 转变成了64位指令
imull ---> imulq
其次看寄存器:
e*x ---> r*x 32位寄存器转换成空了64位寄存器
扩展ASM
__asm__ __volatile__("assembly code":output locations : input locations : changed registers);汇编代码,输出代码,输入代码,修改寄存器/破坏性描述
使用寄存器
在使用寄存器的时候,我们需要注意的是:内存和寄存器交互使用,需要用“%”转义寄存器。64位下随机选择寄存器使用“g"参数。例如我们将变量b的值赋值给变量a.
#include<stdio.h> int main(){ int a = 10; int b = 20; __asm__ __volatile__("movq %1,%%rbx\n\t" "movq %%rbx,%0":"=m"(a):"g"(b)); printf("a = %d\n",a); }
替换占位符
简单来说就是做了标记,使用[] 给变量起一个别名#include<stdio.h> int main(){ int a = 10; int b = 20; __asm__ __volatile__("movq %[name_a],%%rbx\n\t" "movq %%rbx,%[name_b]":[name_b]"=m"(a):[name_a]"g"(b)); printf("a = %d\n",a); }
效果和之前时一样的。
寄存器破坏
如果使用再输入输出中没有声明但是已经使用的寄存器,需要在破坏描述符部分说明:#include<stdio.h> int main(){ int data1 = 10; int result = 20; __asm__ __volatile__("movq %1,%%rax\n\t" "movq %%rax,%0":"=m"(result):"g"(data1):"%rax"); printf("result = %d\n",result); }
内联跳转,宏一样处理。
查看原文:http://zmrlinux.com/2016/07/21/x86x64-%e6%b1%87%e7%bc%96%e5%ad%a6%e4%b9%a0-%e5%86%85%e8%81%94%e5%9f%ba%e7%a1%80/
相关文章推荐
- iOS开发--NSDate与NSDateFormatter的相关用法【转】
- 磁盘df看还有剩余空间,但是创建文件时报错,提示磁盘已经满问题解决
- ctags及taglist的安装和使用方法
- 大型网站技术架构
- Error:Execution failed for task ':app:processDebugManifest'.
- awakeFromNib方法中的注意
- 最新 Android屏幕适配全攻略(官方权威适配方案)
- Linux基础(19)软件磁盘阵列RAID
- PropertyPlaceholderConfigurer在spring获取属性文件
- 0.8.2kafka集群配置
- 设计模式——备忘录模式
- 水印
- 第三方资源篇
- maven跳过单元测试
- mac 下 使用 iterm2 配置及快键键使用
- python魔法方法-自定义序列详解
- Objective-C语法之KVC使用
- intellj idea 如何设置类头注释和方法注释
- iOS 7.0 使用定位requestAlwaysAuthorization导致crash的问题
- Python数据预处理—归一化,标准化,正则化