zoukankan      html  css  js  c++  java
  • 汇编语言初探

    汇编语言初探

    0x00 参考

    0x01 要点概述

    • 标准化以后,称为 assembly language,缩写为 asm,中文译为汇编语言。

    • 汇编语言是二进制指令的文本形式,与指令是一一对应的关系。

    • 每一种 CPU 的机器指令都是不一样的,因此对应的汇编语言也不一样。

      早期的 x86 CPU 的8个寄存器名称
      EAX EBX ECX EDX EDI ESI EBP ESP
      ESP 寄存器有特定用途,保存当前 Stack 的地址

    • gcc 将程序转成汇编语言:gcc -S example.c

    • 一般来说,调用栈有多少层(即函数有多少个),就有多少帧。

    • 一句汇编语言有一个CPU指令和零到多个运算子组成

    0x02 x86 CPU 汇编指令

    push 指令

    用于将运算子放入Stack。
    该指令有一个前置操作:它会先取出 ESP 寄存器里面的地址,将其减去几个字节,然后将新地址写入 ESP 寄存器。

    pop 指令

    用于取出 Stack 最近一个写入的值(即最低位地址的值),并将这个值写入运算子指定的位置。
    该指令还会将 ESP 寄存器里面的地址加4,即回收4个字节。

    mov 指令

    用于将一个值写入某个寄存器。

    add 指令

    用于将两个运算子相加,并将结果写入第一个运算子。

    call 指令

    用来调用函数。

    ret 指令

    用于终止当前函数的执行,将运行权交还给上层函数。也就是,当前函数的帧将被回收。

    0x03 ARM CPU 汇编指令

    单行注释用 @ 表示,多行注释用 /* */

    所有以点开头的都是汇编器指令,就是给汇编器读的指令,不属于ARM指令集

    • .flie:指定了源文件名。手写可忽略

    • .align:指定了代码对齐方式你后面跟的是2的次方

    • .ascii:声明字符串

    • .global:声明全局符号。全局符号是指在本程序外可访问的符号

    • .type:指定符号的类型,“.type main,%function”表示main为函数

    • .word: 用来存放地址

    • .size:设定指定符号的大小。“.size main,.-main”中的”.”表示当前地址,减去main符号的地址为整个main函数的大小

    • .ident:编译器标识,无实际意义

    STR指令

    用于从源寄存器中将一个32位的字数据传送到存储器中。
    该指令在程序设计中比较常用,寻址方式灵活多样,使用方式可参考指令LDR。

    • STR R0, [R1], #8 : 将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。

    • STR R0, [R1, #8] ; 将R0中的字数据写入以R1+8为地址的存储器中。

  • 相关阅读:
    题解 P4999 【烦人的数学作业】
    题解 P2657 【[SCOI2009] windy 数】
    题解【洛谷 P1466 [USACO2.2]集合 Subset Sums】
    乘法逆元
    浅谈二维前缀和
    浅谈位运算
    浅谈 Lucas 定理
    浅谈 exgcd
    【洛谷P1754 球迷购票问题】题解
    RPA机器人工厂化时代下,艺赛旗要做什么样的“四新”产品
  • 原文地址:https://www.cnblogs.com/guduyl/p/11423011.html
Copyright © 2011-2022 走看看