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. CentOS7 实战源码部署php服务与nginx 的整合

    简介:实战演练php服务的搭建 PHP是一种脚本语言,常用于做动态网站的. 源码编译安装: 安装依赖组件: yum -y install gcc gcc-c++ bzip2 bzip2-devel b ...

  2. mac 清理磁盘空间

    128G mac真的用的很崩溃,发现系统占用80G ,肯定是有问题的,发现了是缓存的原因,删除后好多了,记录一下. 从管理里进入之后,从文稿中选择"文件浏览器"可以看到每一个文件夹 ...

  3. Spring事务管理?

    事务管理方式: 1.编码方案,不建议使用,具有侵入性,在原有的业务代码基础上去添加事物管理代码 2.声明式事务控制,基于AOP对目标进行代理,不具有侵入性,不需要修改原来的业务代码

  4. MySQL性能分析show profiles详解

    前言 前几篇文章我们讲了什么是 MySQL 索引,explain分析SQL语句是否用到索引,以及索引的优化等一系列的文章,今天我们来讲讲Show profiles,看看SQL耗时到底出现在哪个环节. ...

  5. 美团在TIDB方面的实践

    摘自-https://www.v2ex.com/t/508094 一.背景和现状 在美团,基于 MySQL 构建的传统关系型数据库服务已经难于支撑公司业务的爆发式增长,促使我们去探索更合理的数据存储方 ...

  6. Linux 路由 静态路由

    Linux 路由 静态路由 目录 Linux 路由 静态路由 一.临时生效,使用命令route A.添加到主机的路由 B.添加到网络的路由 C.添加默认路由 D.删除路由 E.查看所有路由信息 二.临 ...

  7. 基于socket的netty demo

    前面一文说了 基于http的netty demo 和http不一样,http可以用浏览器来充当客户端调用,所以基于socket的netty,必须要编写客户端和服务器的代码 实现功能: 客户端给服务器发 ...

  8. java之volatile

    一.谈谈对volatile的理解 volatile是java虚拟机提供的轻量级的同步机制 保证可见性.不保证原子性.禁止指令重排 1.可见性理解:所有线程存放都是主内存的副本(比如某个变量值为25), ...

  9. MySQL更新勿用and

    项目实战  一次错误的更新 更新前的数据 执行更新语句  然后我们查看下更新后的数据,发现居然数据为空? 使用主键id的方式查询这条数据,发现需要更新的手机号码居然变为了0 当我们把更新语句中的and ...

  10. 这么优雅的Java ORM没见过吧!

      Java的ORM框架有很多,但由于Java语言的限制大部分都不够优雅也不够简单,所以作者只能另辟蹊径造轮子了.照旧先看示例代码了解个大概,然后再解释实现原理. 一.ORM示例 1. Insert ...