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. flowable中使用到的一些方法。获取人员部门信息

    package org.springblade.desk.utils; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf ...

  2. setHeader方法的参数说明

    转自:http://blog.sina.com.cn/s/blog_510fdc8b0100v8sg.html response.setHeader 是用来设置返回页面的头 meta 信息, 使用时 ...

  3. Android硬件访问服务中的HAL-查看打印的信息

    JNI  向上提供本地函数,向下加载HAL文件并调用HAL的函数 HAL 负责访问驱动程序执行硬件操作. external\chromium_org\third_party\hwcplus\src\h ...

  4. 什么情况下调用doGet()和doPost()?

    默认情况是调用doGet()方法,JSP页面中的Form表单的method属性设置为post的时候,调用的为doPost()方法: 为get的时候,调用deGet()方法.

  5. JDBC数据连接之增删改查MVC

    每天叫醒自己的不是闹钟,而是梦想 conn层 package conn; import java.sql.Connection; import java.sql.DriverManager; impo ...

  6. 美团在TIDB方面的实践

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

  7. Linux介绍及系统安装

    1.Linux入门介绍 1.1简介 ​ Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX(Portable Operating System In ...

  8. spark常用提交任务的基本的参数配置

    #!/bin/bash #队列名 根据yarn的队列提交 realtime_queue=root #提交的任务名 my_job_name="OrderQZ" spark-shell ...

  9. IdentityServer4 之 Resource Owner Password Credentials 其实有点尴尬

    前言 接着IdentityServer4的授权模式继续聊,这篇来说说 Resource Owner Password Credentials授权模式,这种模式在实际应用场景中使用的并不多,只怪其太开放 ...

  10. Linux SSH , SCP 建立信任关系(免密传输)

    最近有个需求,Jenkins需要将war传输到各个项目节点中,所以需要远程执行各个节点的shell脚本.但是中间有个输入密码的过程,在自动化部署中是行不通的,故需要增加免密登录.具体如下: 如果想在  ...