汇编指令及其特点

基础知识

指令与伪指令

汇编指令:CPU机器指令的助记符,编译后得到1和0组成的机器码,由CPU读取执行

伪指令:本质上不是指令,由编译环境提供,谜底在于知道编译过程,最终不会生成机器码

不同的ARM风格

ARM官方汇编风格:指令一般大写,windows IDE开发环境常用。(譬如:LDR、STR)

GNU风格的ARM汇编:指令一般小写,linux中常用。(譬如:ldr、str)

ARM汇编的特点

ARM汇编特点1:LDR和STR架构

ARM采用RISC架构,CPU不能直接读取内存,需要将内存内容加载到CPU通用寄存器才能被CPU处理。

ldr(load register):将内存内容加载到通用寄存器    

str(store register):将指令存取通用寄存器

用ldr和str组合就能很好实现数据交换

ARM汇编特点2:八种寻址方式

寄存器寻址 mov r1, r2             //把r2存入r1
立即寻址 mov r0, #0xFF00           //把后面的数字存入r0
寄存器移位寻址 mov r0, r1, lsl #3      //把r1左移3位后存入r1
寄存器间接寻址 ldr r1, [r2]        //把r2这个内存地址所对应的值赋值给r1
基址变址寻址 ldr r1, [r2, #4]       //把r2+4后的内存地址多对应的值存入r1
多寄存器寻址 ldmia r1!, {r2-r7, r12}   //把r1到r7以及r12依次存在r1,r2,r3,r4,r5,r6,r7,r8
堆栈寻址 stmfd sp!, {r2-r7, lr}      //把堆栈SP中的内容依次存在r2,r3,r4,r5,r6,r7,lr中
相对寻址   beq flag           //跳转到标号flag
     flag:     

ARM汇编特点3:指令后缀

同一指令经常附带不同后缀,变成不同的指令。

经常使用的后缀有:

B(byte)功能不变,操作长度变为8位

H(half word)功能不变,长度变为16位      //由于我们在32位系统中,依次操作32位的效率是最高的,所以一般用ldr

S(signed)功能不变,操作数变为有符号 如 ldr ldrb ldrh ldrsb ldrsh   

S(S标志)功能不变,影响CPSR标志位 如 mov和movs movs r0, #0

ARM汇编特点4:条件执行后缀

无后缀:mov r0, r1

有后缀:moveq r0, r1    //如果eq后缀成立则执行mov r0, r1,如果不成立则本句代码作废

注意:(1)条件执行后缀是否成立,不是取决于本句代码,而是取决于之前代码执行的结果

   (2)条件后缀决定了本句代码是否执行,而不会影响上一句和下一句代码是否被执行

常用的一般就是EQ(equal)、NE(not equal)、GT(great than)、LT(less than)

ARM汇编特点5:多级指令流水线

为了让CPU处理起来更加的具有效率,CPU往往是一边执行指令的同时就在提前读取下面的指令了,对于三级流水线,以ARM为例子,在32位系统中,一条指令刚好4个字节。

举例分析:假设有三条指令地址为:0xd002_0040、0xd002_0044、0xd002_0048

当前已经执行到0xd002_0040,为了保证运行流畅高效,实际上CPU指令指针PC已经指向0xd002_0048了,开始做准备工作了。所以对应的,他们的地址分别为:PC-8和PC。

时间: 2024-11-03 21:22:16

汇编指令及其特点的相关文章

汇编指令解析

X86架构 [原创]X86汇编之指令格式解析 [原创]汇编指令之OpCode快速入门 [原创]X64汇编之指令格式解析 ARM架构:

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

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

如何实现对ARM汇编指令的调试?

学习ARM汇编语言时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在x86平台上执行ARM指令,可以使用qemu模拟器执行ARM汇编指令,具体的调试方法,一起来看看吧. 一.准备ARM汇编程序 首先,我们构造一段简单的ARM汇编程序作为测试代码main.s. .globl _start _start: mov R0,#0 swi 0x00900001 以上汇编指

汇编指令速查

指令 功能 AAA 调整加 AAD 调整除 AAM 调整乘 AAS 调整减 ADC 进位加 ADD 加 AND 与 ARPL 调整优先级 BOUND 检查数组 BSF 位右扫描 BSR 位左扫描 BSWAP 交换字节 BT 位测试 BTC 位测试求反 BTR 位测试清零 BTS 位测试置一 CALL 过程调用 CBW 转换字节 CDQ 转换双字 CLC 进位清零 CLD 方向清零 CLI 中断清零 CLTS 任务清除 CMC 进位求反 CMOVA 高于传送 CMOVB 低于传送 CMOVE 相等

汇编指令mov、add、sub、jmp

mov:寄存器,数据 mov:寄存器,寄存器 mov:寄存器,内存单元 mov:段寄存器,内存单元 mov:内存单元,寄存器 mov:内存单元,段寄存器 mov:段寄存器,寄存器 mov:寄存器,段寄存器 add:寄存器,数据 add:寄存器,寄存器 add:内存单元,寄存器 add:寄存器,内存单元 sub:寄存器,数据 sub:寄存器,寄存器 sub:内存单元,寄存器 sub:寄存器,内存单元 jmp:段地址:偏移地址  用段地址修改CS 用偏移地址修改IP jmp:寄存器,只用寄存器的内容

查看汇编指令的二进制代码

今天在尝试ptrace设置断点达时候想知道syscall这条汇编指令对应达二进制码是多少. 百度无果之后在stackoverflow上看到这么个问题 http://stackoverflow/questions/9815448/jmp-instruction-hex-code 里边哥们问jmp对应的二进制码是多少,大神是这么回答的 echo 'asm("mov $400835, %rax\n jmp %rax\n");' >a.c gcc -c a.c objdump -d a.

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

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

汇编指令:push、pop

8086CPU出栈入栈都是以字为单位进行的. push ax 由一下两步完成 1.SP=SP-2 2.将ax中的内容送入SS:SP指向的内存单元 pop ax 1.将SS:SP指向的内存单元中的内容送入ax 2.SP=SP+2 push 寄存器 pop 寄存器 push 段寄存器 pop 段寄存器 push 内存单元 pop 内存单元 只给出内存单元的偏移地址,段地址在指令执行时从ds中获得. 汇编指令:push.pop,布布扣,bubuko.com

带注释的汇编指令大全

一.数据传输指令 ─────────────────────────────────────── 它们在存贮器和寄存器.寄存器和输入输出端口之间传送数据. 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 各种 寄存器 的 内容 内存的情况 在机器码中