1        寄存器

1.1         通用寄存器

A64指令集可以看到31个64位通用(整数)寄存器,分别是R0-R30。 在64位上下文中,这些寄存器通常使用名称x0-x30来表示; 在32位上下文中寄存器使用w0-w30表示。 另外, 寄存器名称可以汇编语言显示为大写或小写。 在当寄存器在此过程调用标准中具有固定角色时,使用大写。

SP   栈指针

r30   LR  链接寄存器

r29   FP  帧寄存器

r19...r28 被调用者保存的寄存器

r18  如有需要为平台寄存器; 否则是临时寄存器

r17  IP1  第二个过程内调用临时寄存器,在其他情况可以用作临时寄存器

r16  IP0  第二个过程内调用临时寄存器,在其他情况可以用作临时寄存器

r9...r15   临时寄存器

r8   间接结果位置寄存器

r0...r7 参数/结果寄存器

前8个寄存器r0-r7用于将参数值传递给子程序并从中返回结果值一个功能。 它们也可用于在函数中保存中间值(但通常只在两者之间子程序调用)。

寄存器r18的作用是特定于平台的。 如果平台ABI需要专用的通用寄存器进行程序间状态(例如,线程上下文)然后它应该使用该寄存器来实现该目的。 如果平台ABI没有这样的要求,那么它应该使用r18作为附加的临时寄存器。该平台ABI规范必须记录该寄存器的用法。(寄存器r18类似于mips架构上的gp寄存器)

子程序调用必须保留寄存器r19-r29和SP的内容。在程序调用标准的所有变体中,寄存器r16,r17,r29和r30具有特殊作用。 在这些角色中他们用于保存地址时标记为IP0,IP1,FP和LR。

1.2         状态寄存器

除了通用寄存器之外,还有一个可以设置的状态寄存器(NZCV)。NZCV是状态寄存器的条件标志位,分别代表运算过程中产生的状态,其中:

N, negative condition flag,一般代表运算结果是负数

Z, zero condition flag, 指令结果为0时Z=1,否则Z=0

C, carry condition flag, 无符号运算有溢出时,C=1

V, oVerflow condition flag 有符号运算有溢出时,V=1

2        进程,内存和堆栈

2.1        
帧指针

代码应构造堆栈帧的链表。每个帧应链接到其调用者的帧并使用堆栈上两个64位值表示帧记录。最内层帧的帧记录(属于帧指针寄存器FP)应指向最近的例程调用。帧记录在堆栈中的位置不固定。注意:在每个帧记录的构建或销毁过程中总会有一段短暂的时间帧指针将指向调用者。

2.2        
子程序调用

A64指令集包含原始子程序调用指令BL和BLR,它们执行跳转-链接操作。 执行BL的效果是将程序计数器的顺序下一个值存储起来作为返回地址,进入链接寄存器(LR)并将目标地址放入程序计数器。
执行BLR的效果类似,只是它会从指定的寄存器中读取新的PC值。

2.3        
参数传递和返回值

函数的参数是存放在r0到r7这8个寄存器里面的。如果超过8个参数,就会入栈。函数的返回值是放在r0 寄存器里面的。

3        常用的汇编指令

3.1        
汇编指令

MOV    X1,X0         ;将寄存器X0的值传送到寄存器X1

ADD    X0,X1,X2     ;寄存器X1和X2的值相加后传送到X0

SUB    X0,X1,X2     ;寄存器X1和X2的值相减后传送到X0

AND    X0,X0,#0xF    ; X0的值与0xF相位与后的值传送到X0

ORR    X0,X0,#9      ; X0的值与9相位或后的值传送到X0

EOR    X0,X0,#0xF    ; X0的值与0xF相异或后的值传送到X0

LDR    X5,[X6,#0x08]        ;X6寄存器加0x08的和的地址值内的数据传送到X5

STR  X0, [SP, #0x8]           ;X0寄存器的数据传送到SP+0x8地址值指向的存储空间

STP  x29, x30, [sp, #0x10]    ;入栈指令

LDP  x29, x30, [sp, #0x10]    ;出栈指令

CBZ   ;比较(Compare),如果结果为零(Zero)就转移(只能跳到后面的指令)

CBNZ  ;比较,如果结果非零(Non Zero)就转移(只能跳到后面的指令)

CMP  ;比较指令,相当于SUBS,影响程序状态寄存器CPSR

B/BL  ;绝对跳转#imm, 返回地址保存到LR(X30)

RET  ;子程序返回指令,返回地址默认保存在LR(X30)

其中 MOV 指令只能用于寄存器之间传值,寄存器和内存之间传值通过 LDR 和 STR

3.2        
跳转指令

跳转指令都是带有条件的,就是说需要根据状态寄存器中的一些状态来控制分支的执行。跳转指令的条件码列表如下:

0000     EQ        Z=1
     相等

0001     NE(Not Equal)   Z=0      不相等

0010     CS/HS(Carry Set/High or Same)   C=1      无符号数大于或等于

0011     CC/LO(Carry Clear/LOwer)   C=0      无符号数小于

0100     MI(MInus) N=1
     负数

0101     PL(PLus)     N=0
     正数或零

0110     VS(oVerflow set)     V=1      溢出

0111     VC(oVerflow clear) V=0      没有溢出

1000     HI(HIgh)     C=1,Z=0
    无符号数大于

1001     LS(Lower or Same) C=0,Z=1     无符号数小于或等于

1010     GE(Greater or Equal)       N=V     有符号数大于或等于

1011     LT(Less Than)    N!=V    有符号数小于

1100     GT(Greater Than)     Z=0,N=V    有符号数大于

1101     LE(Less or Equal)     Z=1,N!=V   有符号数小于或等于

1110     AL        任何
    无条件执行(默认)

1111     NV       任何
    从不执行

beq就代表相等时跳转。

KDB调试 — ARM的更多相关文章

  1. 用Qemu运行/调试arm linux【转】

    转自:https://blog.csdn.net/absurd/article/details/78984244 用Qemu运行/调试arm linux,这事情干过好几次了,久了就忘记了,每次都要重新 ...

  2. visualgdb 调试arm

    目录 visualgdb 调试arm 没有ssh的开发板使用telnet 使用telent的gdbserver title: visualgdb 调试arm date: 2019/11/19 10:0 ...

  3. 【Linux开发】CCS远程调试ARM,AM4378

    注意一点:CCS也是安装在Linux主机上的,不是安装在Windows上的,我在Windows上做出了很多尝试,但最终也不没明白究竟要用怎样的格式去执行在ARM-Linux应用程序,out文件ELF可 ...

  4. 如何在linux主机上运行/调试 arm/mips架构的binary

    如何在linux主机上运行/调试 arm/mips架构的binary 原文链接M4x@10.0.0.55 本文中用于展示的binary分别来自Jarvis OJ上pwn的add,typo两道题 写这篇 ...

  5. 【转载】eclipse调试arm裸机程序

    一.集成开发环境 软件部分:eclipse , GDB Server , Jlink软件 硬件部分:Jlink硬件 准备工作1:从SD/NOR Flash启动,格式化nand flash 准备工作2: ...

  6. 在QEMU中调试ARM程序【转】

    转自:http://linuxeden.com/html/develop/20100820/104409.html 最近我想调试一个运行在QEMU模拟ARM系统中的Linux程序.我碰到过一些麻烦,因 ...

  7. QT Creator 环境使用 remote debug 调试 arm 程序

    这里使用的 4.8.5 QTE 环境,之前尝试过远程使用 GDB 来调试板子上的 QT 程序,但是没成功.没有调试手段比较痛苦,今天又花了点时间,居然搞定了.粗做记录. 工具版本: 1. QtCrea ...

  8. Ubuntu12.10 使用JLink连接开发板用arm-gdb调试ARM程序

    Part1 环境搭建和工具安装 1.1 设置交叉编译环境 安装相关的编译工具: sudo apt-get install build-essential gcc-arm-linux-gnueabi 这 ...

  9. 手把手教你使用eclipse+qemu+gdb来单步调试ARM内核【学习笔记】

    平台信息:linux4.0 平台:qemu 作者:庄泽彬 说明:笨叔叔的Linux视频的笔记 一.编译linux源码 export CROSS_COMPILE=arm-linux-gnueabi- e ...

随机推荐

  1. Gitignore 配置语法

    Gitignore 配置语法 原文地址:http://kuanghy.github.io/2016/05/17/gitignore Git 的 .gitignore 配置文件用于配置不需要加入到版本管 ...

  2. Zookeeper什么,它可以做什么?看了这篇就懂了

    前言 什么是ZooKeeper,你真的了解它吗.我们一起来看看吧~ 什么是 ZooKeeper ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供 ...

  3. CSS系列 (04):盒模型详解

    盒模型 CSS盒模型分成W3C标准盒模型和IE模型 W3C标准盒模型(默认):box-sizing: content-box padding和border都会撑开盒子,改变盒子的宽度高度 总宽度:wi ...

  4. Redis基础篇(四)持久化:内存快照(RDB)

    AOF好处是每次执行只需要记录操作命令,记录量不大.但在故障恢复时,需要逐一执行AOF的操作命令,如果日志很大,恢复就很慢. 今天学习另一种持久化方式:内存快照.内存快照,是Redis某一时刻的状态, ...

  5. 阿里面试:问springBoot自动装配我这样回答的,面试官对我竖起了大拇指

    引言 最近有个读者在面试,面试中被问到了这样一个问题"看你项目中用到了springboot,你说下springboot的自动配置是怎么实现的?"这应该是一个springboot里面 ...

  6. Echarts数据可视化,easyshu图表集成。

      介绍: ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Sa ...

  7. GraduateDesign-给APP添加获取位置信息和天气预报的功能(json)

    首先,我的app需要通过网络来获取当前所在的位置.这里我找到了一个json来获取本地位置信息. http://int.dpool.sina.com.cn/iplookup/iplookup.php?f ...

  8. Arduino IDE 开发 ESP-01S/ESP-01物联网实战检测温度湿度上传MQTT服务器

    一.硬件准备 USB转ESP8266两块.DHT11温度湿度传感器.ESP8266-01/ESP8266-01一块(如果学习的话多买几块,ESP-01/ESP-01S的区别) USB转ESP8266 ...

  9. Javascript 获得数组中相同或不同的数组元素   

    Javascript 获得数组中相同或不同的数组元素 在Javascript中,偶尔会用到获取数组中相同或不同的元素值的情况,以下提供了获得数组中相同或不同的 元素函数供参考学习使用. // 数字类型 ...

  10. linux零基础之--常用命令

    linux: 用户命令 linux 目录切换命令 linux文件命令 linux : vi编辑器 linux:打包压缩