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. Flash Player的终章——赠予它的挽歌

    本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 12月28日消息,微软已经确认Windows 10在下一次更新时将自动删除F ...

  2. SSRF之利用dict和gopher吊打Redis

    SSRF之利用dict和gopher吊打Redis 写在前面 SSRF打Redis也是老生常谈的东西了,这里复现学习一下之前在xz看到某师傅写的关于SSRF利用dict和gopher打内网服务的文章, ...

  3. JavaDailyReports10_04

    修改后的出题系统 1.添加用户自定义是否出现乘除法,自由选择符号和个数,并且可以自定义操作数的取值范围. 1 /* 2 * 2.可定制(数量/打印方式):输入大的数量值,测试一下系统是否崩溃,反向查找 ...

  4. java位运算符生产环境应用分析

    在实际应用场景中 特别是 1,2,4,8,16 这种2的整数次幂的数字,因为具有非常典型的特点 首先是 1.2.4 这几位数了,因为他们的特点就是二进制只有一个为 1 的位,其他位都是 0,并同其他数 ...

  5. 多线程,线程类三种方式,线程调度,线程同步,死锁,线程间的通信,阻塞队列,wait和sleep区别?

    重难点梳理 知识点梳理 学习目标 1.能够知道什么是进程什么是线程(进程和线程的概述,多进程和多线程的意义) 2.能够掌握线程常见API的使用 3.能够理解什么是线程安全问题 4.能够知道什么是锁 5 ...

  6. YuebonCore 2021第一版发布,重构功能菜单模块

    YuebonCore 2021.1.6 版本发布了,这是该软件 2021 年的首个版本更新. 对功能菜单模块进行重构,简化功能模块的新增配置,删除了原有的sys_function功能表,,优化sys_ ...

  7. java操作hive和beeline的使用

    一.java操作hive 1.启动服务:hiveserver2,让hive开启与外部连接的服务 nohup hiveserver2 1>/dev/null 2>/dev/null & ...

  8. spark:join与cogroup

    1.RDD[K,V],键值对类型的rdd的函数在PairRDDFunctions这个类中 rdd类中,通过隐士转换让rdd有了PairRDDFunctions这个类里面方法的功能 2.rdd 的joi ...

  9. 容器编排系统K8s之节点污点和pod容忍度

    前文我们了解了k8s上的kube-scheduler的工作方式,以及pod调度策略的定义:回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14243312.ht ...

  10. (数据科学学习手札102)Python+Dash快速web应用开发——基础概念篇

    本文示例代码与数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的新系列教程Python+Dash快 ...