8086 汇编(一)

编程语言的发展

机器语言

  • 由0和1组成的机器指令
  • 如:0101 0001 1101 0110

汇编语言(assembly language)

  • 使用符号代替机器语言,因此也称为符号语言
  • 如:mov ax, bx

高级语言

  • C | C++ | Java | C# | Objective-C | Swift,更加接近人类的自然语言
  • 如:int a = b;

代码在终端设备上的转换过程

代码在终端设备上的转换过程

  • 汇编语言机器语言一一对应,每一条机器指令都有与之对应的汇编指令
  • 汇编语言可以通过编译得到机器语言机器语言可以通过反汇编得到汇编语言
  • 高级语言可以通过编译得到汇编语言/机器语言,但是汇编语言/机器语言几乎不可能还原成高级语言

汇编语言的特点

  • 可以直接访问、控制各种硬件设备,比如存储器,CPU等,能最大限度地发挥硬件的功能
  • 能够不受编译器的限制,对生成的二进制代码进行完全的控制
  • 目标代码简短,占用内存少,执行速度快
  • 汇编指令是机器指令的助记符,同机器指令一一对应。每一种型号的CPU都有自己的机器指令集/汇编指令集,所以汇编语言不具备可移植性
  • 知识点过多,开发者需要对CPU等硬件结构有所了解,不易于编写,调试,维护
  • 汇编对大小写不敏感,即不区分大小写,比如 mov ax, bx 和 MOV AX,BX 是一样的

汇编语言的用途

  • 编写驱动程序、操作系统(比如Linux内核的某些关键部分)
  • 对性能要求极高的程序或者代码片段,可以与高级语言混合使用(内联汇编)
  • 软件安全
    1.病毒的分析与防治
    2.逆向 | 加壳 | 脱壳 | 破解 | 外挂 | 加密解密 | 漏洞 | 黑客
  • 理解整个计算机系统的最佳起点和最有效途径
  • 为编写高效代码打下基础
  • 弄清楚代码的本质
    1.函数的本质究竟是什么?
    2.sizeof
    3.++a + ++a + ++a 底层如何执行的?
    4.编译器到底帮我们干了些什么?
    5.Debug模式和Release模式有什么关键的地方被我们忽略

汇编语言的种类

  • 目前讨论比较多的汇编语言有

    • 8086汇编(8086处理器是16bit的CPU)
    • Win32汇编
    • Win64汇编
    • ARM汇编(嵌入式,Mac,iPhone)
  • iPhone里面用到的是ARM汇编,但是不同的设备因为CPU架构的不同,也有所差异

    架构设备
    armv6iPhone, iPhone2, iPhone3G, 第一代iPod Touch, 第二代iPod Touch
    armv7iPhone3GS, iPhone4, iPhone4s, iPad, iPad2, iPad3(The new iPad), iPad mini, iPod Touch 3G, iPod Touch4
    armv7siPhone5, iPhone5c, iPad4(iPad with Retina Display)
    arm64iPhone5s, iPhone6, iPhone6s, iPhone6s Plus, iPad Air, iPad mini 2
  • 因为学习,所以建议先从最为经典的8086开始

    • 结构简洁,容易理解
    • 指令简单,便于记忆
    • 原理相通

几个必要的常识

  • 想要学好汇编,首先需要了解CPU等硬件结构
  • APP/程序的执行过程
    APP/程序的执行过程
  • 硬件相关最为重要的是CPU/内存
  • 在汇编中,大部分指令都是和CPU与内存相关的

注意

  • 不管是iOS代码还是Android代码,最终安装运行在手机上的都是一条条的机器指令的集合。
  • 高级语言是在汇编语言的基础上进行了一层包装,所以我们对App进行反汇编时看到的汇编指令集合里,有相当大一部分汇编指令是用来配置高级语言的运行相关环境,以支持高级语言的语法特性。
  • XCode断点调试时,显示对应的汇编指令 Debug - Debug Workflow - Always Show Disassembly
  • XCode断点调试时,查看寄存器里面保存的值,使用 register 指令
    由 rsp = 0x 0000 7fff 50d5 05d0 可知,一个寄存器里面保存的是64位的数据,即寄存器是64位的
  • Xcode断点调试时,使用 register read 指令,查看所有寄存器里面保存的值
  • XCode断点调试时,查看某条汇编指令的对应二进制,使用 memory read指令
    // memory read 内存地址
    memory read 0x10eeafa35
    
  • XCode断点调试时,查看指定寄存器里面的值,使用 po/x $寄存器名称 指令,po:以对象方式打印,/x:以十六进制打印,$:打印寄存器的值
    // 断点调试时,打印rip寄存器的值
    po/x $rip
    
  • XCode断点调试时,使用 ni 指令,可以单步执行汇编代码
  • XCode断点调试时,使用 s指令,可以进入到调用的下一层级
  • 内存的最小单元为字节(Byte)
  • 养成习惯:两个16进制位,代表一个字节的数据。例如:9C为一个字节的数据
    1Mb == 1/8 MB
    2^10 == 1k
    2^20 == 1M
    2^30 == 1G
    2^32 == 4G
    2^40 == 1T
    注意:1M是数量单位,1MB是容量单位
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值