指令寄存器

安卓逆向入门教程

…衆ロ難τιáo~ 提交于 2019-12-20 23:13:52
一、环境配置 1.常用工具: JDK/SDK/NDK eclpise集成开发环境/Android Studio AndroidKiller/jeb/jadx / GDA/Androidk逆向助手 IDA/GDB apkhelper/getsign/APK上上签 模拟器(雷电、海马玩等) MT管理器/RE文件管理器 2.工具安装注意事项: 1.jdk安装路径中不能有中文 2.ndk的配置路径中不能有中文和空格,可以把它放在根目录 3.安装包文件不全,运行会出错 3.APK文件: APK是Android Package的缩写,即Android安装包。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。 4.APK文件目录: assets 不经过 aapt 编译的资源文件 lib .so文件 META-INF 文件摘要,摘要加密和签名证书文件目录 CERT.RSA 公钥和加密算法描述 CERT.SF 加密文件,它是使用私钥对摘要明文加密后得到的 密文信息,只有使用私钥配对的公钥才能解密该文 件 MANIFEST.MF 程序清单文件,它包含包中所有文件的摘要明文 res 资源文件目录,二进制格式 drawable 图片 layout 布局 menu 菜单 resources.arsc 经过 aapt

寄存器与存储器的区别

我们两清 提交于 2019-12-19 00:53:02
1、存储器功能: 存放指令和数据 ,并能由中央处理器(CPU)直接随机存取。 2、寄存器功能: 可将寄存器内的数据 执行算术及逻辑运算 ;存于寄存器内的地址可用来指向内存的某个位置,即寻址;可以用来 读写数据到电脑的周边设备 。 3、区别: 寄存器的速度比主存储器的速度要快很多,由于寄存器的容量有限,所以将 不需要操作的数据存放在主存储器 中,主存储器中的数据必须放入寄存器材能够进行操作。 简单地说: 寄存器 是 操作数据 的地方, 存储器 是 存放数据 的地方。 寄存器一般是指由基本的 RS触发器 结构衍生出来的D触发,就是一些 与非门 构成的结构,一般整合在CPU内,其读写速度跟CPU的运行速度基本匹配,但因为性能优越,所以造价昂贵,一般好的CPU也就只有几MB的2级缓存,1级缓存更小。 存储器 在CPU外,一般指 硬盘 , U盘 等可以在切断电源后保存资料的设备,容量一般比较大,缺点是 读写速度都很慢 ,普通的机械硬盘读写速度一般是50MB/S左右。内存和寄存器就是为了解决存储器读写速度慢而产生的多级存储机制。 来源: CSDN 作者: l羊羊a 链接: https://blog.csdn.net/weixin_43444901/article/details/103605080

ARM装配说明MCR/MRC学习

走远了吗. 提交于 2019-12-18 13:50:36
MCR指令ARM数据寄存器传送到协处理器寄存器。假设协处理器不能成功运行操作。会产生未定义指令中止。 语法教学格式: MCR{<cond>} p15, 0, <Rd>, <CRn>, <CRm>{,<opcode_2>} MCR2 p15, 0, <Rd>, <CRn>, <CRm>{,<opcode_2>} 当中。<cond>为指令运行的条件码。当<cond>忽略时指令为无条件运行。MCR2中,<cond>为Ob1111,指令为无条件运行指令。 <opcode_1>为协处理器将运行的操作的操作码。 对于CP15协处理器来说, <opcode_1>永远为0b000,当<opcode_1>不为0b000时,该指令操作结果不可预知。 <Rd>作为元寄存器的ARM寄存器。其值被传送到得协处理器寄存器中。 <Rd>不能为PC。当其为PC时。指令操作结果不可预知。 <CRn>作为目标寄存器的协处理器寄存器,其编号可能为C0,C1....C15。 <CRm>附加的目标寄存器或者原操作数寄存器。用于区分同一个编号的不同物理寄存器。当指令中不须要提供附加信息时,将C0指定为<CRm>,否则指令操作结果不可预知。 <opcode_2>提供附加信息,用于差别同一个编号的不同物理寄存器。当指令中指定附加信息时,省略<opcode_2>或者将其指定为0,否则指令操作结果不可预知。

寄存器,存储器,内存的区分

て烟熏妆下的殇ゞ 提交于 2019-12-18 11:00:48
从范围来看,它们所指的范畴不一样。 寄存器是中央处理器内的组成部份。它跟CPU有关。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。 存储器范围最大,它几乎涵盖了所有关于存储的范畴。寄存器,内存,都是存储器里面的一种。凡是有存储能力的硬件,都可以称之为存储器,这是自然,硬盘更加明显了,它归入外存储器行列,由此可见——。 内存既专业名上的内存储器,它不是个什么神秘的东西,它也只是存储器中的沧海一粟,它包涵的范围也很大,一般分为只读存储器和随即存储器,以及最强悍的高速缓冲存储器(CACHE),只读存储器应用广泛,它通常是一块在硬件上集成的可读芯片,作用是识别与控制硬件,它的特点是只可读取,不能写入。随机存储器的特点是可读可写,断电后一切数据都消失,我们所说的内存条就是指它了。 CACHE是在CPU中速度非常块,而容量却很小的一种存储器,它是计算机存储器中最强悍的存储器。由于技术限制,容量很难提升,一般都不过兆。 ———————————————— 版权声明:本文为CSDN博主「白手起家的亿万富翁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn

汇编语言常见的错误

喜你入骨 提交于 2019-12-18 08:09:59
一些常见的错误描述 错误编号 错误描述 0 Block nesting error 嵌套出错.嵌套的过程,段,结构,宏指令或重复块等非正常结束.例如在嵌套语句中有外层的结束语句,而无 内层的结束语局 1 Extra characters on line 一语句行有多余字符,可能是语句中给出的参数太多 2 Internal error-Register already defined 这是一个内部错误.如出现该错误,请记下发生错误的条件,并使用Product Assistance Request 表与 Microsoft公司联系 3 Unkown type specifer 未知的类型说明符.例如类型字符拼错,把BYTE写成BIT,NEAR写成NAER等 4 Redefinition of symbol 符号重定义.同一标识符在两个位置上定义.在汇编第一遍扫描时,在这个标识符的第二个定义位置上给出 这个错误 5 Symbol is multidefined 符号多重定义.同一标识符在两个位置上定义.在汇编第二遍扫描时,每当遇到这个标识符都给出这个错误 6 Phase error between passes 两次扫描间的遍错.一个标号在二次扫描时得到不同的地址值,就会给出这种错误.若在启动MASM时使用/D 任选项,产生第一遍扫描的列表文件,它可帮助你查找这种错误 7 Already

汇编语言程序设计学习笔记(第一遍学习)-第1节:机器语言编程到汇编语言的产生

柔情痞子 提交于 2019-12-18 08:09:39
  大家好!今天是我学习汇编语言的第一课。我感觉汇编好好玩啊! 机器码编程   哇! 一上来就写程序了啊,还是用机器码的啊!是呢!嘿嘿!我们去下载1个二进制编辑器,我也不知道哪款好用点,我下载的是FlexHEX。然后我们打开它,并写入一下代码:CD 00 以前我学C语言的时候,我知道CD 00 其实就是1100 1101 0000 0000啦!然后我们保存它为1个文件。关于文件名随便取啦!然后我们运行打开cmd,我们把刚才编辑保存好的文件拖到cmd中然后再运行! 哇!程序输出了Divide overflow 好棒啊!一上来就可以机器码编程啦!而且只有2字节呀!看起来也不是那么的复杂啊!但是我看下面的程序,下面的程序是welcome to masm的机器码: 大家看到了吗?!好多的01011001啊,要是我们写二进制机器码的时候1个被错误的写成0了,那如何去调试查找啊,所以汇编语言产生了哦!汇编语言它的主题是汇编指令,汇编指令呢只是机器指令便于书写记忆的一种格式。比如:机器指令1000100111011000 它的意思是寄存器BX的内容送到AX中,对于的汇编指令是:MOV AX,BX。大家看,这样的写法是不是更接近人类语言呀!(咦!什么是寄存器啊,这里怎么冒出来个寄存器,寄存器是CPU中可以存储数据的器件,一个CPU中有多个寄存器,AX,BX就是其中2个寄存器的代号)

关于jvm内存模型以及jvm内存结构划分

怎甘沉沦 提交于 2019-12-18 04:03:24
好久没有更新博客了 甚是怀念 网上看了很多资料都是对于两者概念比较模糊 首先关于JVM启动流程 * 接下来是JVM内存结构,是结构并不是内存模型 PC寄存器 每个线程拥有一个PC寄存器 在线程创建时 创建H 指向下一条指令的地址 执行本地方法时,PC的值为undefined 方法区 保存装载的类信息 类型的常量池 字段,方法信息 方法字节码 通常和永久区(Perm)关联在一起 但是基于JDK改动: JDK6时,String等常量信息置于方法 JDK7时,已经移动到了堆 Java堆 和程序开发密切相关 应用系统对象都保存在Java堆中 所有线程共享Java堆 对分代GC来说,堆也是分代的 Java栈 线程私有 栈由一系列帧组成(因此Java栈也叫做帧栈) 帧保存一个方法的局部变量、操作数栈、常量池指针 每一次方法调用创建一个帧,并压栈 ** 栈、堆、方法区交互 ** 具体代码体现: public class AppMain //运行时, jvm 把appmain的信息都放入方法区 { public static void main ( String [ ] args ) //main 方法本身放入方法区。 { Sample test1 = new Sample ( " 测试1 " ) ; //test1是引用,所以放到栈区里, Sample是自定义对象应该放到堆里面 Sample

volatile的作用

前提是你 提交于 2019-12-17 11:08:41
[转] http://blog.21ic.com/user1/2949/archives/2007/35599.html   一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3). 多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。 假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。 1). 一个参数既可以是const还可以是volatile吗?解释为什么。 2). 一个指针可以是volatile 吗?解释为什么。 3). 下面的函数有什么错误: int square(volatile int *ptr) { return *ptr * *ptr; }

《30天自制操作系统》笔记(12)——多任务入门

大兔子大兔子 提交于 2019-12-16 23:42:14
《30天自制操作系统》笔记(12)——多任务入门 进度回顾 上一篇 介绍了设置显示器高分辨率的方法。本篇讲一下操作系统实现多任务的方法。 什么是多任务 对程序员来说,也许这是废话,不过还是说清楚比较好。 多任务就是让电脑 同时 运行多个程序(如一边写代码一边听音乐一边下载电影)。 电脑的CPU只有固定有限的那么一个或几个, 不可能 真的同时运行多个程序。所以就用近似的方式,让多个程序 轮换 着运行。当轮换速度够快(0.01秒),给人的 感觉 就是"同时"运行了。 多任务之不实用版 我们首先从最基本的想法开始,做一个不实用版的多任务作为例子。在学习这个例子的过程中引入真正的多任务必须的TSS、TR、far模式JMP的概念,为后续内容打基础。 当你向CPU发出任务切换的指令时,CPU会先把寄存器中的值全部 写入 内存某处;然后,从内存另一位置把所有寄存器的值 读取 出来。这就完成了一次任务切换。 任务切换消耗的时间就是读写内存消耗的时间,大概为 0.0001秒 。 任务状态段TSS 存取全部寄存器的值这件事,当然需要有一个数据结构,这就是 "任务状态段" (Task Status Segment)简称TSS。 1 struct TSS32 2 { 3 int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3; 4 int eip,

X86 CS IP 寄存器

隐身守侯 提交于 2019-12-15 21:41:13
CS寄存器和IP寄存器:   首先强调一下,这两个寄存器非常非常重要,CS的全拼为“Code segment”,即代码段寄存器,对应于内存中的存放代码的内存区域,用来存放内存代码段区域的入口地址(段基址)。   CPU在执行指令时,通过代码寄存器CS和指令指针寄存器IP(instruction Pointer)来确定要执行的下一条指令的内存地址。   CS:IP 两个寄存器指示了CPU当前要赌气的指令地址,计算方式一般为CS左移4位然后加上IP寄存器,作为地址去取内容。   CPU的制造商会为这两个寄存器设置出厂初始值,这2个初始值,其实就决定了第一条执行指令的地址,这是所有程序的源头,没有这个初始值,多么复杂精妙的程序都没用,因为CPU压根就不会鸟你。随着X86的发展,第一条指令并不是一成不变的,   (1)8086:CPU reset后CS寄存器的值为0xFFFF,IP寄存器的值为0,所以将CS左移4位+IP,换算出的物理地址为0xFFFF0,这个地址就是         1MB往下16字节的位置。   (2)80286:CPU reset之后CS的只为0xF000,IP的只为0xFFF0,算法同样是CS左移4位+IP,计算出的物理地址也是0xFFFF0   (3)80386:到了386年代,一切都变了,此时CPU reset后CS的只为0xF000