汇编指令

关于ARM的PC指针(什么时候PC+8,PC+4,PC-4,PC-8)转

蓝咒 提交于 2019-12-06 04:28:37
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/lee244868149/article/details/49488575 要理解PC指针,首先就要好好了解LR指针 连接寄存器LR(r14):用来保存和恢复PC寄存器的内容,它有两个特殊功能。 (1)保存子程序返回地址。使用BL或BLX时,跳转指令自动把返回地址放入r14中;子程序通过把r14复制到PC来实现返回,通常用下列指令之一: MOV PC, LR BX LR 通常子程序这样写,保证了子程序中还可以调用子程序。 stmfd sp!, {lr} …… ldmfd sp!, {pc} (2)当异常发生时,异常模式的r14用来保存异常返回地址,将r14如栈可以处理嵌套中断。 程序计数器r15(PC):PC是有读写限制的。当没有超过读取限制的时候,读取的值是指令的地址加上8个字节,由于ARM指令总是以字对齐的,故bit[1:0]总是00。当用str或stm存储PC的时候,偏移量有可能是8或12等其它值。在V3及以下版本中,写入bit[1:0]的值将被忽略,而在V4及以上版本写入r15的bit[1:0]必须为00,否则后果不可预测。 知道PC寄存器和LR寄存器功能以后,再了解一下ARM处理器的三级流水线和多级流水线 首先

指令系统与汇编程序设计简答

橙三吉。 提交于 2019-12-06 03:19:47
(1)、什么叫指令?什么叫指令系统?8088指令系统有哪几种类型指令? 指令是CPU执行某种操作的命令。 CPU全部指令的集合称为指令系统。 8088的指令类型有传送类、算术运算类、逻辑运算类、转移和调用指令等。 (2)、什么叫寻址方式?8088指令系统有哪几种寻址方式? 寻址方式是指CPU获取操作数的方式。 寻址方式的种类:立即数寻址、寄存器寻址、内存操作数寻址 (3)、何为汇编语言程序?何为汇编程序?简述汇编程序的功能。 汇编语言程序是指由汇编语言指令编写的程序。 汇编程序是用来对汇编语言源程序进行汇编的程序。 汇编程序的功能:其功能是对汇编语言程序进行翻译,生成扩展名为OBJ的目标文件,如果源程序有语法错误汇编后不会产生目标文件,并且给出错误信息。 (4)、什么是变量?变量有哪几种属性?程序中如何访问变量? 变量代表内存操作数的存储地址,或者说变量名代表某个存储单元,通常定义在数据段、堆栈段或者附加段。 变量的属性:段属性、偏移属性、类型属性。 程序中通过变量名来访问变量。 (5)、什么是标号?标号有哪几种属性? 标号代表指令地址,它为转移指令提供了转移目标 标号的属性:段属性、偏移属性、类型属性。 (6)、80x86汇编语言中有哪几种运算符? 数值运算符,修改属性运算符,返回属性或数值运算符,方括号运算符和地址表达式。 (7)、80x86汇编语言程序中段的类型有哪几种

深入理解JAVA虚拟机原理之Dalvik虚拟机(三)

我的未来我决定 提交于 2019-12-05 22:38:58
更多Android高级架构进阶视频学习请点击: https://space.bilibili.com/474380680 本文是Android虚拟机系列文章的第三篇,专门介绍Andorid系统上曾经使用过的Dalvik虚拟机。 也许有人会问,既然Dalvik虚拟机都已经被废弃了,为什么我们还要了解它呢?出于下面的原因,让我觉得还是有必要了解一下Dalvik虚拟机的: Dalvik留下的很多机制在现在的Android系统是一样适用的,例如Dalvik指令,dex文件 并非每个人都是在最新版本的Android系统上工作 了解一项技术曾经的历史和演进过程,有助于增加对于现在状态的理解 Dalvik是Google专门为Android操作系统开发的虚拟机。它支持.dex(即“Dalvik Executable”)格式的Java应用程序的运行。.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。 Dalvik由Dan Bornstein编写,名字来源于他的祖先曾经居住过的小渔村达尔维克(Dalvík),位于冰岛。 栈 VS 寄存器 大多数虚拟机都是基于堆栈架构的,例如前面提到的HotSpot JVM。然而Dalvik虚拟机却恰好不是,它是基于寄存器架构的虚拟机。 对于基于栈的虚拟机来说,每一个运行时的线程,都有一个独立的栈。栈中记录了方法调用的历史

《程序员的自我修养》读书笔记 第二章 编译和链接

戏子无情 提交于 2019-12-05 20:51:15
2.1 被隐藏了的过程 在平常的应用程序开发中一般都不需要关注编译和链接过程,因为在IDE开发环境中一般都将编译和链接合到一起一步完成,直接生成可执行文件;通常将这个过程称为 构建(Buil) 。 对于最经典的C语言版"Hello World"的代码: #include <stdio.h> int main() { printf("Hello World\n"); return 0; } 我们在Linux下使用GCC来编译该代码时,只需使用几行简单的命令就完成对上述代码的编译等一系列过程(假设源码文件名为hello.c),生成可直接运行的的程序: $gcc hello.c $./a.oout Hello World 事实上,上述过程可分解为4个步骤,分别是 预处理(preprocess) 、 编译(compilation) 、 汇编(assembly) 和 链接(linking) ,其中前三个阶段都是文本形式的处理,如下图所示: 下面分别大致介绍下各个步骤的作用。 预编译 预编译过程主要处理那些源代码文件中以“#”开始的预编译指令。比如“#include”、“#define”等,常见的处理规则如下: 将所有的“#define”删除,并且展开所有的宏定义。 处理所有条件预编译指令,比如“#if”、“#ifdef”、“#endif”等。 处理“#include”预编译指令

计算机组成复习——概论

孤街浪徒 提交于 2019-12-05 19:51:24
Computer Organization 【 introduction 】 【 case1 】 就计算组成而言,在当下的计算机体系中通常采用的是冯诺伊曼体系的计算机——也就是标准的五大组成部分 : 控制器,存储器,运算器, Io( 输入设备和输出设备 ), 在当下的计算机往往都是采用的这种模式进行设计,当然还有其他的计算机体系结构,例如哈佛体系,这种体系下的计算机的指令存储器控制存储器是分开进行装置的,不像是冯诺伊曼体系中的那样,存储器是一个固定的封装好的元件,设想一下,假如你有一台采用了哈佛体系的计算机,其中的数据存储器和指令存储器是分开进行的,那么假设你要进行这样一个操作: 1+1= ? 1. 从输入设备键入 1 ,这个时候计算机接收来自键盘的外部中断(保护现场,中断响应,中断服务程序,返回断点),保存当前的执行状态,然后 cpu 响应当前中断,读入 1 到存储器中类似的键入 1+1 。 2. 当键入 “ = ”的时候相当对计算机下达了一条指令(有操作码),指令的组成在后面进行复习,但是指令是存储在指令存储器之中的,要对数据存储器的数据进行操作,并且返回到数据存储器的存储单元当中,要让 cpu 的 ALU 进行“ + ”的运算,这就需要总线将(指令) -----CPU-----( 数据存储器 ) 进行连接起来,自然而然回顾总线的概念 【 DEF 】总线

程序员需要了解的硬核知识之汇编语言(一)

会有一股神秘感。 提交于 2019-12-05 19:27:07
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。 汇编语言和本地代码 我们在之前的文章中探讨过,计算机 CPU 只能运行本地代码(机器语言)程序,用 C 语言等高级语言编写的代码,需要经过编译器编译后,转换为本地代码才能够被 CPU 解释执行。 但是本地代码的可读性非常差,所以需要使用一种能够直接读懂的语言来替换本地代码,那就是在各本地代码中,附带上表示其功能的英文缩写,比如在加法运算的本地代码加上 add(addition) 的缩写、在比较运算符的本地代码中加上 cmp(compare) 的缩写等,这些通过缩写来表示具体本地代码指令的标志称为 助记符 ,使用助记符的语言称为 汇编语言 。这样,通过阅读汇编语言,也能够了解本地代码的含义了。 不过,即使是使用汇编语言编写的源代码,最终也必须要转换为本地代码才能够运行,负责做这项工作的程序称为 编译器 ,转换的这个过程称为 汇编 。在将源代码转换为本地代码这个功能方面,汇编器和编译器是同样的。 用汇编语言编写的源代码和本地代码是一一对应的。因而,本地代码也可以反过来转换成汇编语言编写的代码

汇编(三)——关于寄存器的操作

三世轮回 提交于 2019-12-05 18:31:17
目录 汇编(三) 一、通用寄存器 二、加深对AX、BX、CX、DX印象 三、监测点2.1 四、地址寄存器 五、监测点2.2 六、CPU如何区分指令与数据 七、加深CPU如何区分指令和数据印象 八、IP寄存器和指令的关系 汇编(三) 一、通用寄存器 AX、BX、CX、DX 1 byte = 8 bit 2 byte = 16 bit 0000 0000 0000 0000 ~ 1111 1111 1111 11111 他们可以各自分为2个8位寄存器 AX = AH*AL BX = BH*BL CX = CH *CL DX = DH*DL 为什么存在通用寄存器? 1.因为为了兼容之前的8位寄存器,保证之前的程序,稍加修改就可以运行在8086CPU上 2.内存最小单元 8 bit CPU从内存中读取一个字节 8 bit字节的数据 8位数据 -> 8位寄存器中 16根数据线 8086CPU一次性可以处理 2种尺寸的数据 字节型数据 byte 8bit 8位寄存器中 字型数据 2byte 16bit 16位寄存器中 2个字节 一个字节是高位数据,一个是低位 二、加深对AX、BX、CX、DX印象 mov ax,5 mov ax,0 mov al,5 按下r查询,按下t执行 分析下面命令 mov ax,4E20 mov bx,ax mov ch,bl mov cl,bh mov dl,ch

浅谈汇编

不羁的心 提交于 2019-12-05 16:46:38
创建编写汇编文件: 首先创建一个空文件 命名方式以.s结尾 第一行需要声明一个代码段 .text 第二行声明一个global + 方法名 .global test 指令: 汇编代码注释在行前加上 ; ret:返回 mov指令:目的寄存器,源操作数 举例:mov x0, #0x8 将8赋值给x0 add指令:将两个寄存器相加 sub指令:将两个寄存器相减 cmp指令:比较指令 操作数1 操作数2:cmp x0, x1 用x0减去x1,并将结果放到cpsr(程序状态寄存器)寄存器里 b 指令:跳转指令,相当于jump b 目标地址 bl指令:带返回的跳转指令,与b指令的区别是使用bl指令,ret指令才会生效 内存操作: 1、load,从内存中装载数据 ldr指令:从内存中读取数据 ldr x0, [x1] ldur指令: ,一般如果数据为负数,会用ldur ldp指令:从内存中读取数据,放到一对寄存器中 ldp w0, w1, [x2, #0x10] 2、store,往内存中存储数据 str指令:往内存中写入数据 str w0, [x1],将w0的数据写入到x1中 stur指令:参考ldur指令 stp指令:参考ldp指令 wzr指令:零寄存器 xzr指令:零寄存器 程序计数器: pc(Program Counter) 记录CPU当前指令是哪一条指令

llvm编译系统结构分析

核能气质少年 提交于 2019-12-05 06:17:41
LLVM 编译系统分析 中间代码 工具集 编译流程 整个 LLVM 编译系统的组成可分成三部分:LLVM 中间代码,用于分析、 优化、代码生成等工作的集成库,以及建立在以上集成库基础之上的工具,包括汇 编器、链接器、调试器等等。本章将先依次分析这三个组成部分,然后再对 LLVM 的编译流程作详细的说明。 中间代码 LLVM 中间代码是一种采用 SSA 形式的 IR(Immediate Representation,中间 表达),使用的指令集为 LLVM 虚拟指令集。该指令集是一个类似 RISC(Reduced Instruction Set Computer,精简指令集计算机)的三地址指令集,含有简单的控制 指令和使用带类型指针的访存指令,拥有独立于高级语言和目标处理器的语法,易 于进行代码分析和优化。使用 LLVM 虚拟指令集的 LLVM 中间代码可以三种方式 存在:存在于内存中的编译器 IR、存在磁盘上的字节码(bytecode)、以及可供人 阅读的汇编代码。这三种存在方式是同一中间代码的不同表达形式,可分别用于: 在编译器执行编译遍时提供方便高效的中间代码转换或者中间代码分析、作为 JIT 编译器(Just-In-Time Compiler)在本地执行客户处理器代码的格式、以及方便开 发人员进行代码调试的汇编代码。LLVM 中间代码由虚拟指令集、中间代码高层结构

编译的整个过程:预编译、编译、汇编、链接

て烟熏妆下的殇ゞ 提交于 2019-12-05 02:33:20
编译分为四个步骤: 每个步骤将文件编译成别的格式,如下: 详解: 1.预编译: 预编译过程主要做4件事: ①展开头文件 在写有#include <filename>或#include "filename"的文件中,将文件filename展开,通俗来说就是将fiename文件中的代码写入到当前文件中; ②宏替换 ③去掉注释 ④条件编译 即对#ifndef #define #endif进行判断检查,也正是在这一步,#ifndef #define #endif的作用体现出来,即防止头文件被多次重复引用 2.编译 将代码转成汇编代码,并且在这个步骤中做了两件很重要的工作: ①编译器在每个文件中保存一个函数地址符表,该表中存储着当前文件内包含的各个函数的地址; ②因为这步要生成汇编代码,即一条一条的指令,而调用函数的代码会被编译成一条call指令,call指令后面跟的是jmp指令的汇编代码地址,而jmp指令后面跟的才是“被调用的函数编译成汇编代码后的第一条指令”的地址,但是给call指令后面补充上地址的工作是在链接的时候做的事情。 3.汇编 将汇编代码转成机器码 4.链接 编译器将生产的多个.o文件链接到一起生成一个可执行.exe文件; 但是在这个过程中,编译器做的一个重要的事情是将每个文件中call指令后面的地址补充上;方式是从当前文件的函数地址符表中开始找,如果没有