汇编指令

c语言编译执行过程

天大地大妈咪最大 提交于 2020-01-29 15:58:11
<h4>认识C编译执行过程</h4> 认识C编译执行过程,是C学习的开端。 简单说C语言从编码编译到执行要经历一下过程: C源代码 编译---->形成目标代码,目标代码是在目标机器上运行的代码。 连接---->将目标代码与C函数库相连接,并将源程序所用的库代码与目标代码合并,并形成最终可执行的二进制机器代码(程序)。 执行----->在特定的机器环境下运行C程序。 如果用一个图 来表示: <a href="http://www.emacsvi.com/wp-content/uploads/2015/10/c_compiler_execute.jpg"><img class="alignnone size-medium wp-image-202" src="http://www.emacsvi.com/wp-content/uploads/2015/10/c_compiler_execute-300x233.jpg" alt="c_compiler_execute" width="300" height="233" /></a>   编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。 C源程序头文件-->预编译处理(cpp)-->编译程序本身--

计算机操作系统学习(一)

杀马特。学长 韩版系。学妹 提交于 2020-01-29 12:24:08
1.系统中所有的信息,包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网络上传输的数据,都是由一串位表示的,区分不同对象的唯一方法就是我们都到这些数据对象时的上下文。 2.程序的生命周期都是从高级语言(如C语言)开始的,因为这种形式能够被人读懂,但是为了在系统中运行程序,每条高级语言源程序都必须被其他程序转化为一系列的低级机器语言指令,然后这写指令按照一种称为可执行目标程序的格式打包好,并且以二进制磁盘文件的形式存放起来,目标程序也称为可执行目标文件。 3.将一个源程序翻译成可执行目标文件,翻译过程可以分为4个阶段:预处理、编译、汇编、链接。 1)预处理,预处理器根据以字符#开头的指令,修改原始的程序,比如:#include<stdio.h>。 2)编译,编译器将预处理得到的文本文件翻译成汇编语言的文本文件。 3)汇编,汇编器汇编语言的文本文件翻译成机器语言指令,并且把这些指令打包成可重定位目标程序的格式,并且将结果以二进制的形式保存在.o文件中,它的字节编码是机器指令不是字符,所以文本编辑器打开是乱码。 4)链接,源程序需要用到一些库函数,则在链接阶段,连接器把需要用到的函数以.o文件的形式链接到可执行目标文件中。目标文件可以被加载到内存中执行。 4.计算机系统的硬件组成:总线、I/O设备、主存、处理器。 1)总线,一组电子管道,它携带字节信息在各个部件之间传递

第二~五章小结 (2017-08-28 00:48:04)

微笑、不失礼 提交于 2020-01-29 02:53:21
第二章 x86处理器架构 中央处理单元(CPU)处理算术和逻辑运算。它包含了有限数量的存储位置,即寄存器,一个高频时钟用于同步其操作,一个控制单元和一个算术逻辑单元。内存存储单元在计算机程序运行时,保存指令和数据。总线是一组并行线路,在计算机不同部件之间传输数据。 一条机器指令的执行可以分为一系列独立的操作,称为指令执行周期。3个主要操作分别为取值、译码和执行。指令周期中的每一步都至少要花费一个系统时钟单位,即时钟周期。加载和执行过程描述了程序如何被操作系统定位,加载入内存,再由操作系统执行。 x86处理器系列有三种基本操作模式:保护模式、实地址模式和系统管理模式。此外,还有一个虚拟8086模式是保护模式的一个特例。Intel 64处理器系列有两种基本操作模式: 兼容模式和64位模式。在兼容模式下处理器可以运行16位和32位应用程序。 寄存器位CPU内的存储位置进行命名,其访问速度比常规内存要快很多。以下是对寄存器的简要说明: l 通用寄存器主要用于算术运算、数据传输和逻辑操作。 l 段寄存器存放预先分配的内存区域的基址,这些内存区域就是段。 l 指令指针寄存器存放的是下一条要执行指令的地址。 l 标志寄存器包含的独立二进制位于控制CPU的操作,并反映ALU操作的结果。 x86有一个浮点单元(FPU)专门用于高速浮点指令的执行。 微型计算机的心脏是它的主板,主板上有CPU

volatile关键字

吃可爱长大的小学妹 提交于 2020-01-28 20:42:38
一、简介 volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。 二、并发编程的3个基本概念 (1)原子性 ​ 定义: 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 ​ 原子性是拒绝多线程操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作。简而言之,在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。例如 a=1是原子性操作,但是a++和a +=1就不是原子性操作。Java中的原子性操作包括: ​ a. 基本类型的读取和赋值操作,且赋值必须是数字赋值给变量,变量之间的相互赋值不是原子性操作。 ​ b.所有引用reference的赋值操作 ​ c.java.concurrent.Atomic.* 包中所有类的一切操作 (2)可见性 ​ 定义: 指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。 ​ 在多线程环境下

浅谈Swift的属性(Property)

守給你的承諾、 提交于 2020-01-28 05:31:06
原文博客地址: 浅谈Swift的属性(Property) 今年期待已久的 Swift5.0 稳定版就已经发布了, 感兴趣的小伙伴可看我的这篇博客: Swift 5.0新特性更新 这篇博客可主要分享 Swift 的属性的相关介绍和剖析, 测试环境: Xcode 11.2.1 , Swift 5.1.2 属性分类 在 Swift 中, 严格意义上来讲属性可以分为两大类: 实例属性和类型属性 实例属性( Instance Property ): 只能通过实例去访问的属性 存储实例属性( Stored Instance Property ): 存储在市里的内存中, 每个实例都只有一份 计算实例属性( Computed Instance Property ) 类型属性( Type Property ): 只能通过类型去访问的属性 存储类型属性( Stored Type Property ): 整个程序运行过程中就只有一份内存(类似全局变量) 计算类型属性( Computed Type Property ) 类型属性可以通过 static 关键字定义; 如果是类也可以通过 class 关键字定义 实例属性属于一个特定类型的实例,每创建一个实例,实例都拥有属于自己的一套属性值,实例之间的属性相互独立 为类型本身定义属性,无论创建了多少个该类型的实例,这些属性全局都只有唯一一份

三、常用的汇编指令

﹥>﹥吖頭↗ 提交于 2020-01-27 20:42:16
常用的汇编指令: push :把一个32位的操作数压入堆栈中。这个操作导致esp被减4.esp被形象地称为栈顶。我们认为顶部地址是地址小的区域,那么, 压入堆栈的数据越多,这个堆栈也就越堆越高,esp也就越来越小。在32位平台上,esp每次减少4(字节)。 pop :相反,esp被加4,一个数据出栈。pop的参数一般是一个寄存器,栈顶的数据被弹出到这个寄存器中。 一般不会把sub、add这样的算术指令,以及call、ret这样的跳转指令归入堆栈相关指令中。但实际上在函数参数传递过程中,sub和add最常用来操作 堆栈;call和ret对堆栈也有影响。所以这里作为特殊处理。 sub :减法。格式为:sub 被减数,减数 add :加法。格式与sub类似。 ret :返回。实际返回地址是当前call对应的下一行代码,这个返回的地址一般会在call执行时被压入堆栈。 call:调用函数。 1 call的本质相当于push+jmp ret的本质相当于pop+jmp 如果需要在堆栈中分配4个4字节长整型的空间,则用esp减去4*4=16即可。 同时,也可以用add来恢复。常用于分配函数局部变量空间。 mov 数据移动指令,或者说数据复制命令。 用法是 mov 移到哪(到哪去),移动谁(从哪来) xor 异或指令,通常用于代替mov eax,0 lea指令 lea edi,[ebp-0cch]

常用汇编指令复习

天涯浪子 提交于 2020-01-27 04:43:10
从事 Windows 底层的开发,一定要懂得一定的汇编的语言。其实 Windows 的底层都是使用 C 语言代码编译而成的机器码,再被调试器反汇编成汇编语言代码。对于机器码我们肯定不好理解,这时候汇编语言就成了一个很好的中间媒介。 堆栈相关的常用指令 PUSH: 把一个 32 位的操作数压入堆栈中,这个操作导致 esp 减 4( 我们认为堆栈顶部是地址小的区域 ) ,操作数成为栈顶。 POP: 与 PUSH 指令相反,这个指令是取出栈顶的操作数,导致 esp 加 4 。 SUB: 减法指令,第一个参数是被减数所在的寄存器,第二个参数是减数所在的存储器 ADD: 加法指令,原理同上 RET: 返回指令,相当于跳转回调用函数的地方。 CALL: 调用函数 数据传送指令 MOV: 数据移动,这是最简单的数据传输指令,第一个参数书移动数据的目的地,第二个参数是数据的来源 XOR: 异或,这个本来是一个逻辑运算符,但是 XOR eax , eax 这样的指令常常用来代替 MOV eax , 0 ,好处是速度更快,占用字节更少。 LEA: 取得 ( 后面的操作数 ) 地址后放入前面的存储器中。 STOS: 串存储指令。为了解释这个指令,需要借助一段代码 : Mov ecx, 30h Mov eax,0ccccccch Rep stos dword pt res:[edi]

计算机系统大作业

半城伤御伤魂 提交于 2020-01-27 00:59:48
计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 计算机类 学   号 1180300412 班   级 1803004 学 生 yiguanghui 指 导 教 师 计算机科学与技术学院 2019年12月 摘 要 关键词:计算机系统、编译链接、异常控制流、虚拟内存 摘要:本文较详细地跟踪介绍了hello.c在Linux下的生命周期,从被程序员创建,到在系统上运行,然后输出简单的消息,最后终止。本文通过计算机系统课程中相关的知识来分析hello.c在Linux开发工具下经历预处理、编译、汇编、链接、加载、执行、终止、回收等过程和结果,跟踪程序的链接、进程创建及加载、虚拟内存转换、高速缓存访问、异常控制流、I/O管理等过程。 目 录 第1章 概述… - 4 - 1.1 Hello简介… - 4 - 1.2 环境与工具… - 4 - 1.3 中间结果… - 4 - 1.4 本章小结… - 4 - 第2章 预处理… - 5 - 2.1 预处理的概念与作用… - 5 - 2.2在Ubuntu下预处理的命令… - 5 - 2.3 Hello的预处理结果解析… - 5 - 2.4 本章小结… - 5 - 第3章 编译… - 6 - 3.1 编译的概念与作用… - 6 - 3.2 在Ubuntu下编译的命令… - 6 - 3.3 Hello的编译结果解析… - 6 - 3.4

汇编语言指令

拈花ヽ惹草 提交于 2020-01-26 21:26:19
指令助记符 如MOV, SUB这些词分别表示传送, 减法. 汇编源程序时, 系统使用内部对照表将每条指令的助记符翻译成对应的机器码 目的操作数 目的操作数一共有两个作用 参与指令操作 暂时储存操作结果 源操作数 源操作数主要提供原始数据或操作对象, 面向所有寻址方式. 例如, 在指令SUB AX, BX 中 的值作为减数提供给指令SUB 操作符 dup:表示定义重复的数据,和db、dw、dd配合使用,db 3 dup(‘A’)相当于db ‘AAA’。 注释 这是对源程序的说明, 在汇编中用 ; 号, 后面的内容将被注释   介绍指令前, 先熟悉下这些在指令中的符号(必须要记得) imme: 立即数 DST: 目的操作数 SRC: 源操作数 mem: 存储器操作数 OPR: 操作数 reg: 通用寄存器 EA: 偏移地址(偏移量) Sreg: 段寄存器 Port: 端口地址 Label: 标号 指令集不外乎下面几种: 数据传送指令 算术运算指令 逻辑运算与移位指令【整型 与 浮点型的处理】 串操作指令 程序控制指令 处理器控制指令 伪指令 一、数据传送【也叫转移】指令 通用数据传送指令. l MOV DST, SRC ;传送指令: 把源操作数的内容送入目的操作数 传送字或字节. 注意: 立即数做源操作数时, 立即数的长度必须小于等于目的操作数的长度 操作数DST, SRC分别为reg

[LLVM]在汇编语言上插入指令

痴心易碎 提交于 2020-01-26 05:27:07
问题: LLVM 如何实现在汇编语言的 .s 文件中所有 call 指令前后添加2行固定指令? 答: LLVM 中 function 相关的 pass 用于修改 ir ,而 machine function 相关的 pas 用于修改 mir ,也就相当于修改生成的汇编 编写 machine function pass 然后遍历每个指令,在 call 之前调用 buildMI 函数插入需要的指令,这个 pass 必须在 code emit 之前,指令调度之后,为了避免指令调度把插入的固定指令移动到其它位置 判断一个 mir 是否 call 函数,可以使用 mi->desc().isCall 判断 来源: CSDN 作者: adream307 链接: https://blog.csdn.net/adream307/article/details/103885963