汇编指令和操作

1 ldr伪指令有两种用途。
(1)当需要读取到寄存器中的数据超过了MOV,及MVN指令可以操作的范围时,可以使用LDR伪指令将该数据读取到寄存器中。
(2)还未用到。
2 ldr r0,=0x5300000 (把0x5300000下载到r0中)
mov r1,#0
str r1,[r0] (把r1的数据下载到r0中的地址对应的空间,这就是[]的作用)
3
@ 手动设置CPU模式为irq模式

mrs r0,cpsr

bic r0,r0,#0x1F
(清0,先将0x1f取反,低5位变为00000,然后与r0 与运算放到r0中。)
orr r0,r0,#0x12
(清0,先将0x1f取反低5位变为00000, 然后与r0 或运算放到r0中。)
msr cpsr_c,r0 (cpsr中的低8位,,)
涉及到cpsr,spsr,时都用mrs(读状态),msr(写状态)
4 伪指令本身也是指令,只是这条指令能识别不会直接翻译,会把他翻译成其他的机器代码。伪指令为了一些一条指令无法完成的指令。

5 .global _start 伪操作,不会翻译成机器指令,使程序可读性强,类似于C语言中的#号。规GUN ARM汇编器识别。
6 不同的汇编器对汇编语言的语法要求有所不同,目前常用的ARM汇编环境有一下两种。
ARM 汇编 (armasm ARM公司,绝大果树的windows下的开发者都在使用这一环境,他的语法完全按照ARM的规定)
GUN ARM汇编(GUN 计划) GUN交叉编译工具链中的汇编器,所采用的语法与armasm略有不同,LINUX下的开发者一般用这种环境)
7 .global _start
@ 扩展niuniu这个函数的作用域(扩展 出去)

.extern niuniu
(扩展进来)
.extern doirq
8 @ 代码段的结束
.end
9 b 20 的计算方式
0: ea000006 b 20 <reset>
16进制的6加两个0,变为6,变为10进制,
10 _start:
(程序的真正开始)
@ 0地址处存储(sram)的机器代码

@ 相当于C语言中的goto reset

b reset

nop

nop

nop

nop

nop

b irqhandle

nop
11 ldr sp,=0x1000;(这两个sp不同,因为不同的用户空间的sp独立的寄存器, 最大4K,所以0x1000)
ldr sp,0xf00;
12 @ cpu默认是关闭irq中断的,打开irq中断

mrs r0,cpsr

bic r0,r0,#0xC0
(清他的7和6位使中断irq,fiq使能)
msr cpsr_c,r0
13 汇编语言的16进制表示,英文表示。
31 30 29 28 27 26 25 24 23 ....0
头4位的a 1010表示无条件执行。24 L位,1表示返回,0表示不返回。
14 -32M +32M 2的26次方=64M;
15 正数的补码仍然是正数。负数的补码取反加1
16 流水线,3级取指令,译码,执行。
17 PC存的是正在预取得指令。
18 复位以后自动到了特权模式。
19 reset:

@ cpu默认打开看门狗,关闭看门狗

ldr r0,=0x53000000

mov r1,#0

str r1,[r0]
reset对应的地址总线,是下一条指令的地址总线的地址。
20 字32位,半字,16位。
21 b地址跳转
60: ea00005c b 1d8
5c->92,0x60+8->104,
92*4+104=472->0x1d8;

时间: 2024-10-06 04:15:01

汇编指令和操作的相关文章

Android 图解逆向工程中ARM常用汇编指令(一)

我们走得太快,灵魂都跟不上了. 微小的幸福就在身边,容易满足就是天堂. 在逆向和爆破中我们经常会在IDA中接触到汇编,一般做安卓的不会太了解VB回编等,不太了解的同学可以先查看上篇文章<Android ARM常用的汇编指令合集> 再来继续我们的学习,我们先来看张图. 这个view里面有 PUSH/LDR/SUB/MOVS/BLX/SUBS/BEQ/CMP ,这些差不多都是常见的,不过也不需要看得懂,理解这个指令即可,接下来我们就来分析下这些指令分别有什么作用吧. 先引入 概念性 东西,免得大家

【嵌入式Linux+ARM】ARM体系结构与编程(ARM汇编指令)

自己的一些简单的总结,也是最常用的ARM汇编指令,之后也会不断的补充完善. 1. 汇编系统预定义的段名 .text    @代码段 .data   @初始化数据段 .bss    @未初始化数据段 需要注意的是,源程序中.bss段应该在.text之前. 2.定义入口点 汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点. .text .global _start _start: 3 .word用法 word expression就是在当前位置放一个wo

带注释的汇编指令大全

一.数据传输指令 ─────────────────────────────────────── 它们在存贮器和寄存器.寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节.  如:MOV eax,11  意思:eax=11 MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX

一些汇编指令

AX Accumulator   用累加器进行的操作 输入输出 乘除 操作BX 基址寄存器 (Base Register) CX 计数寄存器 (Count Register)常用于 循环 计数器  在 位操作中 要用 CL来指明 位移的位数DX  数据寄存器(Data Register)  在 进行 双字节 运算时  也可以 存放 io 的端口地址MOV 数据传送指令 ADD 算数指令编程环境 Masm  调试 工具 DebugDebug  cpu 各种 寄存器 的 内容 内存的情况 在机器码中

[zhuan]arm中的汇编指令

http://blog.csdn.net/qqliyunpeng/article/details/45116615 一. 带点的(一般都是ARM GNU伪汇编指令) 1. ".text".".data".".bss" 依次表示的是 “以下是代码段”, “以下是初始化数据段”, “以下是未初始化数据段”. 2.".global" 定义一个全局符号,通常是为ld使用.比如经常看到的 .global _start 3.".

学习linux内核时常碰到的汇编指令(1)

 转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvg.html 80X86 汇编指令符号大全 +.-.*./∶算术运算符. &∶宏处理操作符.宏扩展时不识别符号和字符串中的形式参数,如果在形式参数前面加上一个& 记号,宏汇编程序就能够用实在参数代替这个形式参数了. $∶地址计数器的值——记录正在被汇编程序翻译的语句地址.每个段均分配一个计数器,段内定义的所有标号和变量的偏移地址就是当前汇编地址计数器的值. ?∶操作数.在数据定义语句中,操作

8080汇编指令大全

8080汇编手册数据传输指令 ────────────────────────────── 它们在存贮器和寄存器.寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD 把EAX,ECX,E

16位汇编第六讲汇编指令详解第二讲

16位汇编第六讲汇编指令详解第二讲 1.比较指令 CMP指令 1.CMP指令是将目的操作数减去源操作数,按照定义相应的设置状态标志 2.CMP指令执行的功能与SUB指令(相减指令)一样,但是不同的是CMP指令之根据结果设置标志位 而不修改值 可以操作的指令格式 CMP reg,imm/reg/mem CMP mem,imm/reg 上面是CMP指令的语法,具体的也可以查询帮助文档,inter手册 inter手册查的办法 第一个框代表了CMP指令的所有语法 比如 reg,reg 表示可以比较寄存器

11.汇编代码简单操作

11.汇编代码简单操作 使用汇编的原因很简单,就是汇编代码的高效.在机器启动的时候,利用汇编的高效,对硬件进行初始化,为加载内核,提供条件. 目前常用的ARM汇编指令有两种: *ARM标准汇编:适用于ARM公司的汇编器,适合在Windows平台下使用. *GNU汇编:使用与GNU交叉编译工具链中的汇编器,适合于Linux平台开发. 3.汇编程序框架:注意下面的操作环境是Redhat 6.4 + eclipse C/C++ +CDT插件. 汇编代码的基本框架 ? 汇编用到的地方,启动代码,效率要求