美文网首页建工程
十九、 ARM64汇编(一)

十九、 ARM64汇编(一)

作者: Lovell_ | 来源:发表于2018-12-23 21:20 被阅读40次

    一、简介

    1、模拟器和真机的汇编是不一样的

    其实都是GNU的汇编,只是架构不一样,汇编是严重依赖机器的,机器架构不一样,所以对应的汇编指令也就不一样。

    所以我们调试程序的时候,统一运行在真机上面,因为我们的程序最终也是运行在真机上面的。

    所以,就不用去了解模拟器上的汇编,作用并不大。

    2、真机和模拟器上各自的汇编代码样式:

    真机上的汇编 模拟器上的汇编

    从上两图来看,二者汇编语言差别还是蛮大的。

    3、如何学好arm64汇编

    除了有arm64,还有arm32汇编,不过以后手机都是arm64构架,所以没必要学arm32汇编。

    学好arm64汇编要学好3个东西:

    学好这三个东西,这门汇编语言也就掌握的差不多了。



    二、通用寄存器

    这些是暂时需要用到的寄存器。

    如何查看寄存器?

    通用寄存器有什么用呢?
    ——通用的,存放些东西,如何存放呢?这需要学些指令,来操作。



    三、mov指令

    mov:move

    如何编写汇编指令:
    1、在OC或C中嵌入汇编;

    在OC或C中嵌入汇编

    2、外部建立一个汇编文件.s,再配个.h文件暴露函数的声明,以函数的形式来练习汇编(实现文件后缀.asm或.s);


    注意:
    1、在.h中是test(),但是在.s中是_test,因为底层调用带下划线的函数。
    2、如果不想公开这个函数,可以不带下划线,怎么写都行。

    1、给寄存器赋值

    2、寄存器间赋值



    四、add、sub指令

    add 加法
    sub 减法

    汇编代码——mov add sub 断点调试结果

    注意:汇编中,函数最后一定要写ret,否则会一直按顺序执行下去。他会认为下一个函数名只是下个代码块的标记。

    实现加法和减法功能:

    传进来的参数在哪呢?

    打断点 参数存放结果

    哪个寄存器用来返回?

    公开函数 汇编实现 结果



    五、cmp指令、cpsr寄存器

    cmp:compare 比较
    cpsr:Current Program Status Register 程序状态寄存器器
    spsr:Saved Program Status Register,异常状态下使⽤用

    另外:c:进位;v:溢出

    为正的情况:

    register write

    为负情况:



    六、b指令

    跳转指令



    七、带条件的b指令

    使用方法 b后面的条件对应cpsr的位置

    根据上上图,beq,去会看cpsr中的z位看是否为1.



    八、带if-else反汇编

    image.png

    蓝色部分的跳转,是为了实现执行完if的代码后,不执行else if的代码,继续执行后面的公共代码。

    相关文章

      网友评论

        本文标题:十九、 ARM64汇编(一)

        本文链接:https://www.haomeiwen.com/subject/ybigkqtx.html