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. C#脚本引擎CS-Script

    最近想要在程序中嵌入一个C#脚本引擎,在.NET Framework时代用过一个叫做CS-Script的东西,感觉还是不错,发现现在也支持.NET Core了,试着嵌入一下. 比较 要说能够运行C#脚 ...

  2. [leetcode]103. Binary Tree Zigzag Level Order Traversal二叉树Z字形层序遍历

    相对于102题,稍微改变下方法就行 迭代方法: 在102题的基础上,加上一个变量来判断是不是需要反转 反转的话,当前list在for循环结束后用collection的反转方法就可以实现反转 递归方法: ...

  3. Hadoop支持的压缩格式对比和应用场景以及Hadoop native库

    对于文件的存储.传输.磁盘IO读取等操作在使用Hadoop生态圈的存储系统时是非常常见的,而文件的大小等直接影响了这些操作的速度以及对磁盘空间的消耗. 此时,一种常用的方式就是对文件进行压缩.但文件被 ...

  4. 算法图解第一章_二分查找_python

    什么是二分查找? 我们先玩一个游戏. 在1至100之间我写下一个数,由你来猜测这个数是多少.我会告诉你高了还是低了. 最简单的办法就是每次取一半. 例如 "50""低了& ...

  5. 手写一个RPC框架

    一.前言 前段时间看到一篇不错的文章<看了这篇你就会手写RPC框架了>,于是便来了兴趣对着实现了一遍,后面觉得还有很多优化的地方便对其进行了改进. 主要改动点如下: 除了Java序列化协议 ...

  6. LInux学习笔记之常用命令

    以下命令主要是平时用到的命令,对于一些经常用到的,就收集资料,归纳一下. 指令目录: 1.yum命令: 2.wget命令: 3.tar命令: 4../configure,make,make insta ...

  7. 10. C++对象模型和 this 指针

    1. 成员变量和成员函数分开存储 在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上 空对象占用内存空间为:1 ----> C++编译器会给每个空对象也分配一个字节 ...

  8. BPOS关于“相邻库存查询”的调整

    "相邻库存查询"的应用场景:主要是实现门店间,相互查看商品库存状况,但出于公司对门店的查看权限控制要求,不能一次性查看到相关店铺的所有库存,所以产生了"相邻库存查询&qu ...

  9. 断言封装整合到requests封装中应用(纠错False,Result循环,tag测试)

    检查json_key_value: 检查: requests.py # -*- coding: utf-8 -*-#@File :demo_04.py#@Auth : wwd#@Time : 2020 ...

  10. Python基础语法5-控制流语句