C语言x86汇编指令理解volatile(三十五)
常见寄存器
寄存器 | 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(三十五)相关推荐
- 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)
学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...
- 视频教程-C语言-从汇编角度理解C语言的本质-C/C++
C语言-从汇编角度理解C语言的本质 擅长JavaWeb开发,游戏逆向外挂与反外挂,游戏保护对抗 孙冉 ¥49.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅 ...
- C语言笔记 第三十五课 数组参数和指针参数分析
第三十五课 数组参数和指针参数分析 思考:为什么C语言中的数组参数会退化为指针? 退化的意义 C语言中只会以值拷贝的方式传输参数 当向函数传递数组时:(错误的,设计当初的思路) 将整个数组拷贝一份传入 ...
- NeHe OpenGL第三十五课:播放AVI
NeHe OpenGL第三十五课:播放AVI 在OpenGL中播放AVI: 在OpenGL中如何播放AVI呢?利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效果不错. ...
- [转]周易入门三十五问答
周易入门三十五问答 http://mt.sohu.com/20150714/n416782382.shtml 1.问:何谓<周易>? 答:<周易>是我国古代哲学.自然科学与社会 ...
- 美学心得(第二百三十五集) 罗国正
美学心得(第二百三十五集) 罗国正 (2022年3月) 3015.我比较喜欢"破茧化蝶"这个成语,它充满象征意义和美感.其实,人的成长过程,人类的发展就象不断的"破茧化蝶 ...
- Gradle 1.12用户指南翻译——第三十五章. Sonar 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- 程序员的三十五岁危机
三十五岁以后的程序员路在何方,这已经是个老生常谈的话题了. 大家普遍认为程序员是吃青春饭,过了一定得年纪就不好找工作了.我不反对这个观点,一些公司确实是有要求的,尤其是一些大厂,况且现在生活节奏这么快 ...
- 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
最新文章
- 十年之后,数字孪生将这样改变我们的工作与生活
- 怎么复制黑苹果config配置_估计是最后一次折腾黑苹果,技嘉 Z490 Vision D 的 OC 配置分享...
- win10 如何打开telnet,ftp等服务
- Knock Knock,这里有一封全球技术精英聚会的邀请函
- 《Go语言实战》摘录:6.5 并发 - 通道
- 01.计算机体系结构概述.md
- 每日一题:leetcode989.数组形式的整数加法
- HTML5新增的video标签,HTML5中video标签的使用方法
- 磁盘Raid方案简单对比
- Anaconda安装tensorflow遇到的wrapt、load error、Twisted问题
- fetch请求报错:
- 三层调用关系_你真正的了解MVC三层架构开发模式吗
- mac下qt与mysql配置
- 56. Attribute value 属性
- 开源成语答题小程序红包设置教程
- 翻译: 中国北斗卫星导航系统 全球导航卫星系统 (GNSS)
- m4125idn如何扫描_京瓷ECOSYS M4125idn驱动
- 设置计算机不从update获取驱动,如何让“Windows更新”不更新驱动程序
- 贡献度分析--帕累托图
- Excel.Application手册
热门文章
- Agilent RF fundamentals (2)- fundamental units of RF
- 又发生了重新造轮子的行为
- 《Adobe After Effects CS5经典教程》——1.5 对合成图像作动画处理
- BarTender怎么打印公式化的三列标签
- php : 匿名函数(闭包) [一]
- C++ 类模板三(类模版中的static关键字)
- Maclean写的Oracle入门书
- RedHat Enterprise Linux 5下安装firefox
- Nmap 可能引起cisco路由器Crash
- Web 前端开发框架收集