常见寄存器

寄存器 16位 32位 64位
累加寄存器 AX EAX RAX
基址寄存器 BX EBX RBX
计数寄存器 CX ECX RCX
数据寄存器 DX EDX RDX
堆栈基指针 BP EBP RBP
变址寄存器 SI ESI RSI
堆栈顶指针 SP ESP RSP
指令寄存器 IP EIP RIP

汇编指令

1.asm_volatile.c

#include <stdio.h>
int main (void){    volatile int i = 10;int a = i; //未优化
}

# gcc -S -O2 asm_volatile.c -o asm_volatile.s

 .file   "asm_01.c".text.section   .text.startup,"ax",@progbits.p2align 4,,15.globl main.type   main, @function
main:
.LFB23:.cfi_startprocmovl   $10, -4(%rsp)movl   -4(%rsp), %eaxxorl  %eax, %eaxret.cfi_endproc
.LFE23:.size    main, .-main.ident  "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0".section    .note.GNU-stack,"",@progbits
movl    $10, -4(%rsp)
movl    -4(%rsp), %eax
xorl    %eax, %eax

<1>.解析:movl   $10, -4(%rsp) ----> (rsp:堆栈顶指针)

汇编指令movl $10, -4(%rbp)中,-4(%rbp)等价于Intel汇编中的[rbp - 4],表示rsp寄存器减去4之后的地址值。

整条汇编指令表示:将立即数10放到-4(%rsp)内存地址所在的存储空间。其中movl中l用于32位的长字值,与Intel汇编中的mov不同之处在于多了一个数据元素的长度。

<2>.解析:movl   -4(%rsp), %eax

将rsp指针指向eax寄存器,相当于将a=i,即i赋值给a;

<3>..解析:xorl   %eax, %eax

按位异或,相同的位置为0,不同的位置为1,eax和eax的每一位都相同,所以相当于清零。

这个指令可以将寄存器 %eax 设置为 0,运用了对任意x,x^x = 0 这一属性。

将寄存器 %eax 设置为 0, 每次都从内存里读取,而不是从寄存器里的缓存读取;

 更直接的方法是用指令 movl $0, %edx。

2.asm_optimize.c

#include <stdio.h>
int main (void){    int i = 10;int a = i; //优化
}

# gcc -S -O2 asm_optimize.c -o asm_optimize.s

 .file   "asm_02.c".text.section   .text.startup,"ax",@progbits.p2align 4,,15.globl main.type   main, @function
main:
.LFB23:.cfi_startprocxorl   %eax, %eaxret.cfi_endproc
.LFE23:.size    main, .-main.ident  "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0".section    .note.GNU-stack,"",@progbits

C语言x86汇编指令理解volatile(三十五)相关推荐

  1. 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...

  2. 视频教程-C语言-从汇编角度理解C语言的本质-C/C++

    C语言-从汇编角度理解C语言的本质 擅长JavaWeb开发,游戏逆向外挂与反外挂,游戏保护对抗 孙冉 ¥49.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅 ...

  3. C语言笔记 第三十五课 数组参数和指针参数分析

    第三十五课 数组参数和指针参数分析 思考:为什么C语言中的数组参数会退化为指针? 退化的意义 C语言中只会以值拷贝的方式传输参数 当向函数传递数组时:(错误的,设计当初的思路) 将整个数组拷贝一份传入 ...

  4. NeHe OpenGL第三十五课:播放AVI

    NeHe OpenGL第三十五课:播放AVI 在OpenGL中播放AVI: 在OpenGL中如何播放AVI呢?利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效果不错. ...

  5. [转]周易入门三十五问答

    周易入门三十五问答 http://mt.sohu.com/20150714/n416782382.shtml 1.问:何谓<周易>? 答:<周易>是我国古代哲学.自然科学与社会 ...

  6. 美学心得(第二百三十五集) 罗国正

    美学心得(第二百三十五集) 罗国正 (2022年3月) 3015.我比较喜欢"破茧化蝶"这个成语,它充满象征意义和美感.其实,人的成长过程,人类的发展就象不断的"破茧化蝶 ...

  7. Gradle 1.12用户指南翻译——第三十五章. Sonar 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  8. 程序员的三十五岁危机

    三十五岁以后的程序员路在何方,这已经是个老生常谈的话题了. 大家普遍认为程序员是吃青春饭,过了一定得年纪就不好找工作了.我不反对这个观点,一些公司确实是有要求的,尤其是一些大厂,况且现在生活节奏这么快 ...

  9. 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

最新文章

  1. 十年之后,数字孪生将这样改变我们的工作与生活
  2. 怎么复制黑苹果config配置_估计是最后一次折腾黑苹果,技嘉 Z490 Vision D 的 OC 配置分享...
  3. win10 如何打开telnet,ftp等服务
  4. Knock Knock,这里有一封全球技术精英聚会的邀请函
  5. 《Go语言实战》摘录:6.5 并发 - 通道
  6. 01.计算机体系结构概述.md
  7. 每日一题:leetcode989.数组形式的整数加法
  8. HTML5新增的video标签,HTML5中video标签的使用方法
  9. 磁盘Raid方案简单对比
  10. Anaconda安装tensorflow遇到的wrapt、load error、Twisted问题
  11. fetch请求报错:
  12. 三层调用关系_你真正的了解MVC三层架构开发模式吗
  13. mac下qt与mysql配置
  14. 56. Attribute value 属性
  15. 开源成语答题小程序红包设置教程
  16. 翻译: 中国北斗卫星导航系统 全球导航卫星系统 (GNSS)
  17. m4125idn如何扫描_京瓷ECOSYS M4125idn驱动
  18. 设置计算机不从update获取驱动,如何让“Windows更新”不更新驱动程序
  19. 贡献度分析--帕累托图
  20. Excel.Application手册

热门文章

  1. Agilent RF fundamentals (2)- fundamental units of RF
  2. 又发生了重新造轮子的行为
  3. 《Adobe After Effects CS5经典教程》——1.5 对合成图像作动画处理
  4. BarTender怎么打印公式化的三列标签
  5. php : 匿名函数(闭包) [一]
  6. C++ 类模板三(类模版中的static关键字)
  7. Maclean写的Oracle入门书
  8. RedHat Enterprise Linux 5下安装firefox
  9. Nmap 可能引起cisco路由器Crash
  10. Web 前端开发框架收集