汇编指令

3.3-常用汇编指令

偶尔善良 提交于 2019-12-04 02:39:53
如何阅读反汇编文件? 以下是一个例子 4bc: e3a0244e   mov r2, #1308622848 4c0: e3a0344e   mov r3, #1308622848 4c4: e5933000   ldr r3, [r3] 像4bc这些是代码运行的地址, e3a0244e是机器码 那常用的汇编指令有哪些? b, bl 这两条指令为跳转指令,不同之处在于bl指令除了跳转之外,还将返回地址保存在lr寄存器中。 mov 这个指令可以把一个寄存器的值赋给另一个寄存器,或者把一个常熟赋给寄存器。常数必须能用立即数来表示 当不能用立即数来表示时可以使用ldr命令来赋值。ldr是伪指令,它不是真实存在的指令,编译器会把它扩展成真正的命令。 ldr r1, =label 当它的第二个参数前有=号时,表示伪指令,否则表示内存访问指令 ldr r1, [r2, #4] 将地址r2+4的内存单元数据读取到r1中 ldr r1, [r2] 将地址为r2的内存单元的数据读取到r1中 ldr r1, [r2], #4 将地址为r2的内存单元数据读取到r1中,然后r2 = r2+4 str r1, [r2, #4] 将r1的数据保存到地址为r2+4的内存单元中 str r1, [r2] 将r1的数据保存到地址为r2的内存单元中 str r1, [r2], #4

关于ARM PC值

假装没事ソ 提交于 2019-12-04 02:24:17
PC值(Program Counter). ARM采用流水线来提高CPU的利用效率, 对于三级流水线, 一条汇编指令的执行包括 取值, 译码, 执行三个阶段. 当MOV指令的取指动作完毕后, 进入MOV指令的译码阶段, 同时开始ADD指令的取指动作. 由图中可以发现, 正在执行MOV指令时, 同时处于ADD的译码 阶段和SUB指令的取指阶段. 由于 PC值总是指向正在"取指"的指令 , 如上图, 正在执行的MOV指令时, PC值指向正在取指的指令SUB. 这中间相隔了两条指令. 对于32位CPU来说, 一条指令占用四个字节, 所以 PC = 当前程序执行地址 + 8个字节. 来源: https://www.cnblogs.com/cheyihaosky/p/11828306.html

深入了解tcmalloc(一):windows环境下无缝拦截技术初探

柔情痞子 提交于 2019-12-04 02:16:31
概述: 又到了一个总结提炼的阶段,这次想具体聊聊游戏引擎中使用的内存管理模块 tcmalloc 组件的使用心得。项目的前期曾经遇到过内存瓶颈,特别是 windows 系统下的客户端程序在经历长时间运行之后会出现内存占用率很高疑似泄漏的现象,排查了很久都没有找到原因,甚至一度无法定位问题出自游戏脚本层还是引擎层,后来在引擎中链接了 tcmalloc 组件,通过实时 dump 程序的内存信息最终找出了泄漏的元凶。 tcmalloc 的另一个优势就是通过高效率内存分配来提高游戏运行时性能,不得不说在使用 tcmalloc 之后,整个游戏的稳定性和效率都有了很大的提升。为了今后更有效和稳定地使用 tcmalloc 组件,就在这里深入剖析一下这个神器。 Tcmalloc 是 Google Perftools 中的一个组件,提供一整套高效健壮的内存管理方案,比传统 glibc 的内存分配和释放要快数倍;其次,基于 tcmalloc 之上的 heapprofiler 可以实时 dump 程序中 heap 的使用信息,是一个很好的检测内存泄漏的辅助工具;同时 tcmalloc 的使用又是极其方便,只需要在编译时增加一个链接选项,就可以无缝拦截 (patch) 原生操作系统运行库中的内存分配和释放接口,而无需修改已经完成的项目工程代码,大大减少移植整合的成本。 在 windows 平台下,

详解C中volatile关键字

五迷三道 提交于 2019-12-03 23:43:13
在PHP官网上看到一个浮点数BUG, 测试代码 。在SVN里看了一下修复方法:在变量的声明前加了个volatile关键字。不知道这个是什么意思,特意去网上查了一下,找到了这篇文章,写得不错,转载一下。 volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如 果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举 例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序: short flag; void test() { do1(); while(flag==0); do2(); } 这段程序等待内存变量flag的值变为1(怀疑此处是0,有点疑问,)之后才运行do2()。变量flag的值由别的程序更改,这个程序可能是某个硬件中 断服务程序。例如:如果某个按钮按下的话,就会对DSP产生中断,在按键中断程序中修改flag为1,这样上面的程序就能够得以继续运行。但是,编译器并 不知道flag的值会被别的程序修改,因此在它进行优化的时候,可能会把flag的值先读入某个寄存器,然后等待那个寄存器变为1。如果不幸进行了这样的 优化,那么while循环就变成了死循环

深入分析Synchronized原理

一曲冷凌霜 提交于 2019-12-03 20:06:27
前言 记得开始学习Java的时候,一遇到多线程情况就使用synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是, 随着学习的进行我们知道在JDK1.5之前synchronized是一个重量级锁,相对于j.u.c.Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它 。 不过, 随着Javs SE 1.6对synchronized进行的各种优化后,synchronized并不会显得那么重了 。下面来一起探索synchronized的基本使用、实现机制、Java是如何对它进行了优化、锁优化机制、锁的存储结构等升级过程。 大家可以点击加群【JAVA架构知识学习讨论群】 473984645, (如多你想跳槽换工作,但是技术又不够,或者工作遇到了瓶颈,我这里有一个Java的免费直播课程,讲的是高端的知识点,只要有1-5年的开发工作经验可以加群找我要课堂链接。)注意:是免费的 没有开发经验的误入。 1 基本使用 Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。 Synchronized的作用主要有三个 : 原子性 :确保线程互斥的访问同步代码; 可见性 :保证共享变量的修改能够及时可见

Python历史「解密」Python底层逻辑 及Python 字节码介绍(转帖)

て烟熏妆下的殇ゞ 提交于 2019-12-03 15:24:26
帖子来源:https://www.ituring.com.cn/article/507878 一次纯粹的hacking Python的作者,Guido von Rossum,荷兰人。1982年,Guido从阿姆斯特丹大学获得了数学和计算机硕士学位。尽管,他算得上是一位数学家,但他更加享受计算机带来的乐趣,热衷于做任何和编程相关的活儿。 80年代,掀起了个人电脑浪潮,但受限于个人电脑配置低,所有的编译器的核心是做优化,以便让程序能够运行。在那个时代,程序员恨不得用手榨取计算机每一寸的能力。 有人甚至认为C语言的指针是在浪费内存,至于动态类型,内存自动管理,面向对象…… 别想了,那会让你的电脑陷入瘫痪。 而这种编程方式让Guido感到苦恼。Guido知道如何用C语言写出一个功能,但整个编写过程需要耗费大量的时间。 不过,他还有另一个选择shell。shell可以像胶水一样,将UNIX下的许多功能连接在一起。UNIX的管理员们常常用shell去写一些简单的脚本,以进行一些系统维护的工作,比如定期备份、文件系统管理等等。 然而,shell的本质是调用命令,并不能全面的调动计算机的功能。 Guido希望有一种语言,这种语言能够像C语言那样,能够全面调用计算机的功能接口,又可以像shell那样轻松的编程。 **ABC语言让Guido看到希望。**ABC是由荷兰的数学和计算机研究所开发的

基础知识

痞子三分冷 提交于 2019-12-03 14:06:36
机器语言: 展开来讲就是一台机器可以正确执行的命令,机器语言是机器指令的集合。 例如: 指令: 01010000 (PUSH AX) 电平脉冲: 但是机器语言也有弊端,全是二进制组成,难免会看错等等。 汇编语言的产生:正好是为了解决上面的问题 1、汇编语言的主体是汇编指令。 2、汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。 3、汇编指令是机器指令的助记符。 例如: 机器指令: 1000100111011000 汇编指令:MOV AX,BX 上面两步的操作的结果一样,将寄存器 BX的内容送到AX中 由此可见,汇编语言这样的写法与人类语言接近,便于阅读和记忆。 寄存器: 简单的讲是CPU中可以存储数据的器件,一个CPU中有多个寄存器,比如上面的AX,BX就是其中的一个寄存器的代号。 问题: 计算机只能识别机器语言,那要如何才能识别程序员用汇编语言写出来的东西呢? 答案: 通过相应的编译器来进行转换操作。 来源: https://www.cnblogs.com/zpchcbd/p/11798296.html

2.6-MIPS指令简介

走远了吗. 提交于 2019-12-03 11:54:12
  MIPS秉承着指令数量少, 指令功能简单的设计理念,那这样的设计理念 是如何实现的呢?在这一节,我们就将来分析MIPS指令的特点。   相比于X86指令所提供的动辄上千页的指令说明,MIPS指令 只用这两页纸就可以说清楚了。MIPS指令的基本格式 就分为这三种,R型,I型和J型。R型指的是寄存器型, I型指的是立即数型,J型指的是转移型。 我们用这张表对MIPS的指令进行不同纬度的分类,横轴是按照指令的格式 分为R型、I型和J型,纵轴则是根据指令的功能类型分为运算指令、 访存指令和分支指令。首先,我们来看指令格式为R型的运算指令。 R型指令总共包含六个域,其中最高位的opcode域 是六个比特,最低位的funct域也是六个比特, 中间的四个域,均为五个比特,我们分别来看各个域的用途。 opcode域,用于指定指令的类型,对于所有的R型指令,这个域的值,均为零, 但这并不是说明R型指令只有一种,它还需要用funct域来更为精确的指定指令的类型。所以说,对 于R型指令,实际上一共有12个比特操作码, 那大家可以思考一下,为什么不将opcode域和funct域合并成一个12比特的域呢? 那样岂不是更直观明了吗?我们再来看这些5比特的域。 RS域,这个域通常用来指定第一个源操作数所在的寄存器编号, rt域通常用来指定第二个源操作数所在的寄存器的编号,

2.5-MIPS体系结构

左心房为你撑大大i 提交于 2019-12-03 11:53:27
  MIPS是精简指令系统的代表,采用了与X86相反的设计理念,并引领了精简指令系统的潮流, 那就让我们一起来看一看这究竟是怎么一回事。R ISC是精简指令系统计算机的简称,与之相对,之前的计算机上的指令系统就被称为 复杂指令系统,X86就是其中的代表。 现在MIPS处理器已经不再应用在计算机产品中了, 但是在广义的计算设备包括数字电视,游戏机,网络设备 等领域仍然有广泛的应用。   第一代的MIPS是32位的,在1985年推出了对应的处理器,R2000,90年, R3000处理器对应着第二代的MIPS,92年,MIPS扩展到了64位,94年,64位的MIPS又 进一步升级,96年的MIPS5并没有对应的处理器, 然后在99年,MIPS指令系统进行了较大的调整,形成了MIPS32,到了99年,以MIPS5为基础, 推出了MIPS64指令系统,MIPS的设计指导思想非常的简单, 从它的名字就可以看出来。MIPS全称的含义是一个流水线不会互锁的微处理器,流水线是 现代微处理器为提高性能而采用的一项技术,而流水线中的互锁 则是导致流水线性能降低的一个非常重要的因素。从这个名称也可以看出,MIPS的 指导思想是希望其指令的设计能让微处理器运行的更快,性能更好。 所以它主要的关注点是减少指令的类型,并且降低指令的复杂度,所以在MIPS指令系统当中, 指令的总数是很少的。

程序员需要了解的硬核知识之磁盘

亡梦爱人 提交于 2019-12-03 10:05:26
程序员需要了解的硬核知识之磁盘 https://www.cnblogs.com/cxuanBlog/p/11776310.html 此篇文章是 《程序员需要了解的硬核知识》系列第四篇,历史文章请戳 程序员需要了解的硬核知识之内存 程序员需要了解的硬核知识之CPU 程序员需要了解的硬核知识之二进制 我们大家知道,计算机的五大基础部件是 存储器 、 控制器 、 运算器 、 输入和输出设备 ,其中从存储功能的角度来看,可以把存储器分为 内存 和 磁盘 ,内存我们上面的文章已经介绍过了,那么此篇文章我们来介绍一下磁盘以及内存和磁盘的关系。 认识磁盘 首先,磁盘和内存都具有存储功能,它们都是存储设备。区别在于,内存是通过 电流 来实现存储;磁盘则是通过 磁记录技术 来实现存储。内存是一种高速,造假昂贵的存储设备;而磁盘则是速度较慢、造假低廉的存储设备;电脑断电后,内存中的数据会丢失,而磁盘中的数据可以长久保留。内存是属于 内部存储设备 ,硬盘是属于 外部存储设备 。一般在我们的计算机中,磁盘和内存是相互配合共同作业的。 一般内存指的就是主存(负责存储CPU中运行的程序和数据);早起的磁盘指的是软磁盘(soft disk,简称软盘),就是下面这个 (2000年的时候我曾经我姑姑家最早的计算机中见到过这个,当时还不知道这是啥,现在知道了。) 如今常用的磁盘是硬磁盘(hard disk,简称硬盘)