汇编指令

B跳转指令与Ldr指令几点区别

不羁的心 提交于 2019-12-29 01:49:33
B跳转指令是代码位置无关的,经过汇编后会替换为当前PC值加(减)一个修正值,不管这条指令是在哪一个地址执行,都能跳转到指定的位置。 B只能在当前PC的32M范围内跳转,LDR只能在当前PC的4KB(0xfff范围)跳转。 LDR PC,=xxx指令将向PC直接装载一个标号xxx的值,但标号经过编译后将被替换为一个与RO相对应的值,这样无论指令在何处执行都能跳转到一个指定的位置。 归纳如下: (1) b step1 :b跳转指令是相对跳转,依赖当前PC的值,偏移量是通过该指令本身的bit[2 3:0]算出来的,这使得使用b指令的程序不依赖于要跳到的代码的位置(位置无关码),只看指令本身。 (2) ldr pc, =step1 :该指令是从内存中的某个位置(step1)读出数据并赋给PC,同样依 赖当前PC的值,但是偏移量是那个位置(step1)的连接地址(运行时的地址),所以可 以用它实现从Flash到RAM的程序跳转。 来源: https://www.cnblogs.com/myblesh/archive/2012/04/17/2454162.html

arm-linux-ld 命令详解

烈酒焚心 提交于 2019-12-29 01:48:30
本文转自《S3C2410完全开发手册》 在开始后续实验之前,我们得了解一下arm-linux-ld连接命令的使用。在上述实验中,我们一直使用类似如下的命令进行连接: arm-linux-ld -Ttext 0x00000000 crt0.o led_on_c.o -o led_on_c_tmp.o 我们看看它是什么意思: -o选项设置输出文件的名字为led_on_c_tmp.o; “--Ttext 0x00000000”设置代码段的起始地址为0x00000000; 这条指令的作用就是将crt0.o和led_on_c.o连接成led_on_c_mp.o可执行文件,此可执行文件的代码段起始地址为0x00000000(即从这里开始执行)。 我们感兴趣的就是“—Ttext”选项!进入LINK目录,link.s代码如下: 1 .text 2 .global_start 3 _start: 4 b step1 5 step1: 6 ldr pc,=step2 7 step2: 8 b step2 Makefile 如下: 1 link:link.s 2 arm-linux-gcc –c -o link.o link.s 3 arm-linux-ld -Ttext 0x00000000 link.o -o link_tmp.o 4 #arm-linux-ld -Ttext 0x30000000

实验二——11.18

你说的曾经没有我的故事 提交于 2019-12-28 14:42:22
南京信息工程大学实验报告 实验日期 11.18 学院 计软院 专业 计科 年级 2017级 班次 6班 姓名 谢宏伟 学号 20171308260 一、实验目的 1. 熟练掌握使用debug工具编写和调试汇编命令的方法 2. 理解并掌握内存中多字节数据的存放 3. 理解并掌握「栈」内存空间的特性和使用 4. 理解并掌握8086汇编指令mov, add, sub, push, pop的用法 二、实验准备 1. 复习第 3 章「栈」的知识:栈的特性、寄存器 SS 和 SP、指令 push 和 pop 2. 完成教材 3.6~3.9 节内的问题 3.6~3.12,检测点 3.1~3.2 3. 结合教材实验1 (P35)及公邮文件中心→实验下的 “实验1辅助文档.pdf”复习debug 工具用法。 三、实验内容 1. 教材实验2(P71) 1)练习「1.预备知识:Debug 的使用」 2)在练习基础上,完成 「2. 实验任务」 补充: 为了便于验证实验结果,对「2. 实验任务」中的(1)做如下两点调整: ① 在使用 a 命令输入指令调试前,使用 e 命令将内存单元 0021:0 ~0021:7 连续 8 个字节数据修改为 30H, 31H, 32H, 33H,34H,35H,36H,37H ② 将 P74 实验任务(1)中第 1行的 mov ax, ffff → 改为 mov ax,

汇编实验二 用机器指令和汇编指令编程

﹥>﹥吖頭↗ 提交于 2019-12-28 14:42:02
实验日期 11.18 学院:计软院 专业: 计科 年级: 2017级 班次:6班 姓名:庄桢立 学号:20171308231 一、实验目的 1. 熟练掌握使用debug工具编写和调试汇编命令的方法 2. 理解并掌握内存中多字节数据的存放 3. 理解并掌握「栈」内存空间的特性和使用 4. 理解并掌握8086汇编指令mov, add, sub, push, pop的用法 二、实验准备 1. 复习第 3 章「栈」的知识:栈的特性、寄存器 SS 和 SP、指令 push 和 pop 2. 完成教材 3.6~3.9 节内的问题 3.6~3.12,检测点 3.1~3.2 3. 结合教材实验1 (P35)及公邮文件中心→实验下的 “实验1辅助文档.pdf”复习debug 工具用法。 三、实验内容 1. 教材实验2(P71) 1)练习「1.预备知识:Debug 的使用」 2)在练习基础上,完成 「2. 实验任务」 补充: 为了便于验证实验结果,对「2. 实验任务」中的(1)做如下两点调整: ① 在使用 a 命令输入指令调试前,使用 e 命令将内存单元 0021:0 ~0021:7 连续 8 个字节数据修改为 30H, 31H, 32H, 33H,34H,35H,36H,37H ② 将 P74 实验任务(1)中第 1行的 mov ax, ffff → 改为 mov ax, 0021 实验前

int指令(软件中断指令)

痞子三分冷 提交于 2019-12-27 05:14:35
INT(软件中断指令)是CALL指令的一种特殊形式。call指令调用调用的子程序是用户程序的一部分,而INT指令调用的操作系统提供的子程序或者其他特殊的子程序。 中断服务子程序和标准过程的最大区别是 汇编程序可以有任意个过程,中断服务子程序最多有256个过程、 INT指令共有四中不同的格式: 《1》 int n   n是中断号,这就允许用户程序调用256个中断服务子程序。   该指令2字节长度,第一字节是int机器码,第二字节是8位立即数,表示中断号。   CPU在执行到INT指令时,通过中断描述符表找到中断号对应的中断服务子程序的地址,(本质上就是一个异常处理程序的软件调用) 《2》 int 3   INT 3 是中断指令的一种特殊形式,仅有一个字节长。   调试器将该指令当作软件中断指令来用。调试的时候,当程序中的某一位置加断点的时候,调试器会把断点处指令编码的第一个字节替换为INT 3指令的编码。 当程序执行到INT 3,回向调试器申请系统调用,调试器因此获得CPU控制权。之后,再用原先的编码替换INT 3 编码。 《3》INTO 中断号4   如果溢出标志位为1,则INTO指令会产生一个软件中断,利用这个指令可以快速测试算术运算指令之后是否有溢出产生。 《4》BOUND 中断号5   BOUND reg,mem   其执行算法为:if(reg<[mem])or(reg>

SIMD指令集

▼魔方 西西 提交于 2019-12-25 05:50:11
概述 SIMD,即Single Instruction, Multiple Data,一条指令操作多个数据。是CPU基本指令集的扩展。主要用于提供fine grain parallelism,即小碎数据的并行操作。如说图像处理,图像的数据常用的数据类型是RGB565, RGBA8888, YUV422等格式,这些格式的数据特点是一个像素点的一个分量总是用小于等于8bit的数据表示的。如果使用传统的处理器做计算,虽然处理器的寄存器是32位或是64位的,处理这些数据确只能用于他们的低8位,似乎有点浪费。如果把64位寄存器拆成8个8位寄存器就能同时完成8个操作,计算效率提升了8倍.SIMD指令的初衷就是这样的,只不过后来慢慢cover的功能越来越多. 好多处理器都有SIMD指令,我们先仅关注Intel的SIMD。Intel的初代SIMD指令集是MMX,Multi-Media Extension, 即多媒体扩展,因为它的首要目标是为了支持MPEG视频解码.MMX将64位寄存当作2X32或8X8来用,只能处理整形计算.这样的64位寄存器有8组,分别命名为MM0~MM7.这些寄存器不是为MMX单独设置的,而是借用的FPU的寄存器,也就是说MMX指令执行的时候,FPU就没有办法工作。后来Intel进一步实现了SSE, SSE2~SSE4指令集,给了他们单独的寄存器,之后MMX就被停掉了。

AVR汇编初探之一《AVR单片机的CPU内部结构》

别说谁变了你拦得住时间么 提交于 2019-12-24 10:57:39
学单片机那么久了,感觉想要深入,还得看汇编语言,至少得了解单片机内部结构。 下面就以ATmega16为例,介绍一下AVR单片机结构和汇编语言。 AVR单片机的CPU内核结构 如上两图,左图是虚线框内AVR CPU的内核结构,右图是AVR单片机内核结构的方框图,可以看出AVR单片机的数据总线(CPU字长)是8位的,也就说它是8位单片机。 AVR采用了Harvard结构,具有独立的数据和程序总线,CPU在执行一条指令的同时,就将PC中指定的下一条指令取出,构成了一级流水线运行方式,实现了一个时钟周期执行一条指令,数据吞吐量高达1MIPS/MHz。 AVR CPU内核由几个重要的部分组成,它们分别是: A.算数逻辑单元ALU(Arithmetic Logic Unit) AVR ALU与32个通用工作寄存器直接相连。寄存器与寄存器之间、寄存器与立即数之间的ALU运算只需要一个时钟周期。ALU操作分为3类:算术、逻辑和位操作,此外还提供了支持无/有符号数和分数乘法的乘法器,操作结果的状态将影响到状态寄存器SREG(Status Register)。 B.程序计数器PC、指令寄存器和指令译码器 程序计数器PC用来存放下一条需要执行指令在程序存储器(ROM)空间的地址(指向FlashROM空间),取出的指令存放在指令寄存器中,然后送入指令译码器中产生各种控制信号,控制CPU的运行(执行指令)。

计算机三级嵌入式笔记

微笑、不失礼 提交于 2019-12-23 21:37:15
计算机三级嵌入式笔记 ARM汇编指令 LDR/STR LDR加载指令 LDR伪指令 LDR 的两种用法 ARM汇编指令 LDR/STR ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。 若想把数据从内存中某处读取到寄存器中,只能使用ldr: ldr r0 , 0x12345678 把0x12345678这个地址中的值存放到r0中 mov不能实现这个功 能,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中 还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个值(一般是一个地址)写到某寄存器中 ldr r0 , = 0x12345678 把0x12345678这个值写到r0中,所以,ldr伪指令和 mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的 立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。 LDR加载指令 LDR指令的格式为: LDR{条件} 目的寄存器,<存储器地址> LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用亍从存储器中读取32位的字数据到通用寄存器,然后对数据迕行处理

安卓逆向入门教程

…衆ロ難τιá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

CAS--JAVA为什么选择它,如何解析并实现它?

纵饮孤独 提交于 2019-12-20 02:44:38
这边参考的是: A-B-A问题: https://hesey.wang/2011/09/resolve-aba-by-atomicstampedreference.html CAS解析: https://blog.csdn.net/v123411739/article/details/79561458 https://www.cnblogs.com/onlywujun/articles/3529572.html 牛人: http://ifeve.com/ 首先CAS 是是什么? Compare and Swap,是比较并交换的意思。 CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。 它是一种非阻塞型的算法,一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。 现代的CPU提供了特殊的指令,可以自动更新共享数据,而且能够检测到其他线程的干扰,而 compareAndSet() 就用这些代替了锁定。 这边拿AtomicInteger来研究在没有锁的情况下是如何做到数据正确性的。 private volatile int value; 在没有锁的机制下可能需要借助volatile原语,保证线程间的数据是可见的(共享的)。 这样在获取变量的值的时候才能直接读取。 public final int