0%

汇编语言

一、重点

  • 新增一个中断处理程序的步骤
    1. 编写新的中断处理程序
    2. 获取中断号m。
    3. 将新的中断处理程序装入内存或驻留内存,将新的中断处理程序的偏移地址和段地址保存到物理地址4*m和4*m+2处。

二、预备知识

三、寄存器

8086有14个寄存器:

  • 通用寄存器
    • 数据寄存器:ax、bx、cx、dx
    • 指针寄存器:sp、bp
    • 变址寄存器:si、di
  • 控制寄存器 ip、flag
  • 段寄存器:
    • 代码段 cs
    • 数据段 ds
    • 堆栈段 ss
    • 附加段 es

8086中[…]中的…只能是bx、bp、si、di。此时bp默认ss段,di默认es段,bx、si默认ds。

总线

物理地址的形成

为与先前的计算机兼容,现在的CPU还是使用段地址:偏移地址方式得到物理地址。

数据在计算机内的表现形式

  • 整数

    二进制补码表示。

    无符号数的补码还是原码。

    有符号数补码:

    ​ 从右向左,遇到第一个1后,反转剩余位。

标志寄存器

16位:flags 32位:eflags

标志位

  • 条件标志位 6个

    • SF

      符号标志

      结果是否为负,即最高位是否为1。

      对无符号数运算结果的记录,有符号数无意义。

    • ZF

      零标志

      相关指令执行后,结果是否为0。

    • OF

      溢出

      有符号数运算后是否产生溢出。

    • CF

      进位

      二进制无符号数进行运算时,记录进位或借位。

    • AF

      辅助

    • PF

      奇偶

      指令执行后,结果的所有bit中1的个数是否为偶数。

  • 控制标志位

    • DF

      方向

      是否从高地址向低地址处理字符串。

    • 中断允许

    • 跟踪

  • 系统标志位

影响标志寄存器的指令

有影响:

大都是运算指令,如add、sub、mul、div、inc、or、and、xor

无影响:

大多是传送指令,如mov、push、pop

还有call、ret

用到了标志位的指令

// TODO

操作标志寄存器

LAHF load ah from flags

SAHF store ah into flags

  • 传送
  • 进栈
  • 出栈

四、寻址方式

  • 寄存器寻址

    寄存器是操作数的存放地址。

    1
    inc bx
    1
    add ax,bx

    寄存器的位数决定了操作数的位数

  • 寄存器间接寻址

    格式: [R]

    注意:

    • 80x86中,R可以是8个32位通用寄存器(eax、ebx、ecx、edx、edi、esi、ebp、esp)中的任意一个,也可以是4个16位通用寄存器(bx、di、si、bp)中的一个,但不能是位的通用寄存器。
    • R是(bp、ebp、esp)时,默认段为ss。其他默认为ds。
  • 变址寻址

    格式:[R*F+V] [R*F+V] V[R*F]

    说明:R为寄存器(register),F(1、2、4、8)为比例因子(factor),V是位移量

    注意:

    • 当R为16位寄存器或esp时,F只能为1且必须省略不写。
    • V是有符号数、数值表达式、变量、标号,变量、标号取偏移地址。
    • V不可为寄存器。
  • 基址加变址寻址

    格式:[BR+IR*F+V] V[BR+IR*F] V[BR][IR*F]

    说明:BR基址寄存器 IR变址寄存器 F比例因子 V位移量

    注意:

    • 默认段寄存器由BR决定。
    • 使用16位寄存器时,BR只能是bx、bp,IR只能是si、di,F只能为1。bx时段默认为ds,bp默认为ss。
    • 使用32位寄存器时,BR可以选任意32位通用寄存器,IR可以选除esp外的任意通用寄存器。BR可以和IR相同,此时未带比例因子的为BR。当F为1时,在前面的为BR。ebp、esp时段为ss,其余为ds。
  • 立即寻址

    格式:n

    说明:n为常数或结果确定的表达式。

    示例:

    1
    mov word ptr [si],12h
    1
    mov eax,-12345678h
  • 直接寻址

    格式:段寄存器:[n] 变量 变量+常量

    说明:n为常数或数值表达式,表示偏移地址。

    注意:

    • 必须要加段寄存器

    示例:

    1
    inc buf
    1
    mov ds:[20h],cl

寻址注意事项

  • 源操作数与目的操作数不能都是存储器方式的。
  • 立即数没有类型,不含变量的存储器方式表示的操作数类型不明确,因此必须显示指明类型。
  • 如果类型都是明确的,那类型必须匹配。
  • 段超越
    • 取指令(not等)只能用cs段
    • 压栈、出栈只能用ss段
    • 串操作中的目的串只能用es段

五、宏汇编语言

表达式

  • 常量

    用伪指令equ或=来定义

  • 数值表达式

    • 算术运算
    • 逻辑运算
    • 大小关系运算
  • 变量

    用db、dw、dd等数据定义伪指令来定义

    属性:

    • 所属段
    • 偏移地址
    • 类型(字节、字、双字等)

    格式:变量名 数据定义伪指令 表达式[,…]

    注意:

    表达式可以为:

    • 数值
    • ASCII字符串
  • 标号

    属性:

    • 段属性
    • 偏移地址
    • 类型 NEAR FAR
  • 地址表达式

    • 属性定义算符
      • 类型运算符 PTR
      • 定义类型运算符 THIS 指定下一个能分配的存储单元的类型
    • 属性分离算符
      • 取段址算符 SEG
      • 取偏移地址算符 OFFSET
      • 取类型算符 TYPE
    • 其他算符
      • LENGTH 取变量所含的数据存储单元个数算符
      • SIZE 取变量所含的数据存储区大小算符
      • HIGH LOW 字节分离算符

机器指令语句

  • 数据传送

    • 一般数据传送

      • 传送

        • 一般传送 MOV
        • 有符号数传送 MOVSX
        • 无符号数传送 MOVZX
      • 数据交换

        • 一般数据交换 XCHG

          源操作数不能是立即数

        • 字节交换 BSWAP

        • 交换加 XADD

      • 查表转换

        • XLAT

          将(bx)(ebx)为首址,(al) 为位移量的字节存储在al中

    • 地址传送

      • 传送偏移地址 lea (load effective address)
      • 传送偏移地址及数据段首址地址 LDS
      • 传送偏移地址及附加数据段 LES
  • 算术运算

      • inc
      • add
      • dec
      • neg 求补 每一位取反后+1
      • sub
      • cmp
      • 有符号乘 imul
      • 无符号乘 mul
      • IDIV
      • DIV
    • 符号扩展
      • CBW
      • CWD
      • CWDE
      • CDQ
  • 位操作

    • 逻辑运算

      • NOT

      • AND

      • TEST

        源操作数与目的操作数做and,然后置标志位

      • BT

        根据位编号对目的操作数中的位来测试

        1
        bt eax, 52
      • OR

      • XOR

    • 移位

      • SAL

      • SHR

        逻辑右移,最高位补0

      • SAR

        算术右移,最高位不变

      • ROL

      • ROR

      • RCL

        带进位的循环左移

      • RCR

    • 双精度移位指令

伪指令语句

也称汇编控制指令

  • 处理器选择

    .386 .8086

  • 数据定义

    • db
    • dw
  • 符号定义

    • 等价伪指令 equ
    • 等号 =
    • 定义符号名 label
  • 段定义

    • 段定义

      1
      2
      3
      segment_name segment 
      ...
      segment_name ends

      使用类型:

      use16 use32

    • 假定 assume

    • 置汇编地址计数器 $

      ​ ORG 设置汇编地址计数器$的值

  • 过程定义

  • 程序模块的定义与通信伪指令

  • 宏定义

  • 条件汇编

  • 格式控制、列表控制及其他功能伪指令

常用DOS系统功能调用

  • 1号调用 键盘输入一个字符,存入al
  • 2号调用 输出一个dl中的字符到显示器
  • 9号调用 将ds:dx 指向的以$结尾的字符串送到显示器显示

六、程序设计的基本方法

顺序

分支

转移指令

  • 条件转移

    • 简单条件转移
    • 无符号数条件转移
    • 有符号数条件转移
    • 循环转移
  • 无条件转移

    可以段内,可以段间

    JMP CALL RET INT IRET

循环

子程序

定义:

1
2
3
4
dtob proc near
...
...
dtob endp

调用:

call

返回:

ret

七、其他方法和技术

字符串操作

目的段只允许在当前附加段中,所以程序中一定要定义附加数据段,最简单的办法就是让当前数据段与附加数据段重合。

  • 传送 MOVS

    作用:DS:[SI]->ES:[DI]

    所以使用该指令前要设置好DS,SI,ES,DI。

  • 搜索 SCAS

    在ES:[DI]开始的串中搜索AL中存放的字符。

  • 比较 CMPS

    可带前缀REPE/REPZ REPNE/REPNZ

    前者CX/ECX不=0,ZF=1 未比较完且两串元素相等时继续比较。

    后者CX/ECX不=0,ZF不=1,未比较完且两串元素不相等时继续比较。

  • 取 LODS

    DS:[SI]->AL

  • 存 STOS

    AL->DS:[SI]

重复前缀:

  • REP
  • REPE REPZ
  • REPNE REPENZ

宏指令

  1. 宏定义
  2. 宏调用
  3. 宏展开

定义:

1
2
3
4
name macro
...
...
name endm

调用:直接用宏名调用。

传参:

  • 带间隔符的参数

    < > 尖括号括住

  • 数字参数

    %

  • 宏参数的连接

    &

  • 宏体中的变量与标号

    local

重复汇编伪指令:

  • 给定次数的重复汇编
1
2
3
4
rept 26
db char
char = char+1
endm
  • 不定次数的重复汇编

    IRP

    IRPC

条件汇编伪指令:

1
2
3
4
5
IF

ELSE

ENDIF

引入宏库:

1
include macro.lib

模块化程序

  • 组合方式
    • 定位方式
    • 组合方式
    • ‘类别’
  • 通信方式

八、输入/输出和WIN32编程

九、中断

内中断

中断源:

中断向量表:

​ 存储了中断处理程序的入口地址

  1. 编写中断处理程序
  2. 安装(复制到固定地址处)
  3. 设置中断向量表

外中断

十、嵌入式

名词

Soc System on Chip 片上系统

BSP Board Support Package

USB Universal Serial Bus 通用串行总线

$I^2C$ Inter-Integrated Circuit

MMU Momory Manager Unit 内存管理单元

概述

  • 嵌入式系统定义:

    应用为中心,以计算机技术为基础,软件、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。

  • 组成:

    • 嵌入式微处理器
    • 外围硬件设备
    • 嵌入式操作系统
    • 用户的应用程序
  • 嵌入式系统的特点

    • 关注成本

    • 实时性

    • 使用嵌入式操作系统 EOS Embedded Operating System

    • 减少软件的瞬时故障

    • 低功耗

    • 运行环境

    • 系统资源有限

    • 在ROM中存放所有程序的目标代码

    • 处理器选择多样化

      • 微处理器 MPU
      • 微控制器 MCU
      • 数字信号处理器 DSP Digital Signal Processor
      • 片上系统 SoC System On Chip
    • 专用开发工具和方法设计

    • 软件的固件化

      嵌入式系统是一个软硬件高度结合的产物,为了提高执行速度和系统可靠性,嵌入式系统的软件一般都固化在存储器西片或处理器芯片中。

    • 构成

      • 核心芯片

        • 嵌入式微处理器

          具有32位以上的处理器,性能较高,价格较贵。

        • EMCU

          又称单片微型计算机 Single Chip Microcomputer,低廉的价格,优良的性能。

        • EDSP

          强大的数据处理功能和高运行速度。

        • ESoC

          客户定制的,面向特定用途的。

      • 存储器

        • 易失性存储器

          • SRAM

            最早最成熟

          • DRAM

            高密度高带宽

        • 非易失性存储器

          • OTP
          • ROM
          • EEPROM
          • Flash
      • 常规外设及其接口

      • 专用外设及其接口

      • 嵌入式操作系统

      • 板级支持包 BSP Board Support Package

        让硬件支持操作系统

      • 应用程序

      • 嵌入式开发工具

设计方法

  • 单片机

    汇编语言编写相应的程序即可。

  • 嵌入式处理器系统

    • 处理器选型
      • 够用
      • 适用
      • 成本
      • 功耗
      • 软件开发工具
      • 内置调试工具
      • 评估板
    • 操作系统
    • 编程语言
  • 测试工具

    • 内存分析工具
    • 性能分析
    • GUI测试
    • 覆盖分析
  • 测试策略

    • 单元测试

    • 集成测试

    • 系统测试 确认测试

      所有的系统测试和确认测试都要在目标环境下进行

处理器

标准的指令集架构有两大体系,精简指令集架构 RISC Reduced Instruction Set Computer,复杂指令集架构 CISC Complex Instruction Set Computer。

处理器采用两大体系结构冯·诺依曼和哈佛结构。

  • 嵌入式系统对微处理器的要求
    • 实时性
    • 技术密集
    • 专用紧凑
    • 安全可靠

ARM处理器

  • ARM内核命名规则

  • ARM处理器结构

    • RISC体系结构 Reduced Instruction Set Computer

      只有加载和存储指令可以访问存储器

      数据处理指令只对寄存器的内容进行操作

    • Thumb

      在性能和代码大小之间提供了出色的折中

      7种处理器模式:

      • 用户模式
      • FIQ 中断模式
      • IRQ 中断模式
      • 管理模式
      • 终止模式
      • 系统模式
      • 未定义
    • 寄存器

      37个寄存器:

      • 程序计数器 PC

      • 程序状态寄存器

        当前程序状态寄存器 CPSR

        备份的程序状态寄存器 SPSR

  • 具体的ARM7TDMI Thumb Debug Multiply Ice

FPGA

现场可编程门阵列 Field Programmable Gate Array FPGA

  • FPGA结构资源

    • 硬件资源

    • 软件资源

    • IP核资源

      IP核可以解析为拥有知识产权的设计,可以通过授权而应用的通用模块。

SoC

特点:

  1. 设计时大量使用可复用的IP
  2. 其制成

克服前后端相分离的弊病。

SoPC:

System on Programmable Chip 片上可编程系统

多核处理器:

片上多核处理器 CMP Chi Multi-Processor

常用架构:

SMP Symmetric Multiprocessing

AMP

多核处理器需要考虑的问题:

  • 节点间通信方式

    • 基于共享内存的访问方式
    • 基于消息传递的访问方式
  • 任务调度策略

    • 静态调度
    • 动态调度
  • cache一致性

    cache作用:协调处理器和存储器速度不匹配的问题。

    协议机制:

    • 基于监听
    • 基于目录
  • 系统异构性

    如大端小端

存储器

  • 嵌入式系统的存储器选择

    选择原则:

    • 内部存储器与外部存储器
    • 引导存储器
    • 配置存储器
    • 程序存储器
    • 数据存储器
    • 易失性存储器和非易失性存储器
    • 串行存储器与并行存储器
  • 可擦除可编程ROM EPROM

  • 在线编程和擦除 E^2PROM

  • Flash 闪存

    之所以称为闪存,是因为用电擦除且能擦除整个存储矩阵或部分存储矩阵,通过公共源极或公共衬底加高压实现,速度很快。

    将程序和数据写入到Flash存储器中的过程叫编程

外围设备和IO接口

  • LCD Liquid Crystal Display

    体积小 重量轻 辐射低

  • 常见输入输出接口类型

    • $I^2C$ Inter-Integrated Circuit

      通过串行数据线SDL 和串行时间线 SCL Serial Clock Line连接嵌入式处理器与外设IC设备。

    • $I^2S$ Inter-IC Sound

    • CAN Controller Area Network

      稳定性不错(知道这个就行了)

    • USB Universal Serial Bus

    • 红外线

      方向性

    • 蓝牙

      球状

    • 以太网 (不考)

  • 嵌入式最小系统

    1. 处理器
    2. 内存
    3. 时钟
    4. 电源和复位
  • 驱动程序与寄存器

    直接利用寄存器与周边沟通的程序,也叫驱动程序。

    获取周边的方式:

    内存映像

    IO地址

操作系统

  • 特征

    1. 小巧
    2. 实时性
    3. 可装卸
    4. 固化代码
    5. 弱交互性
    6. 强稳定性
    7. 统一的接口
  • 实时操作系统的常用术语

  • 常用的操作系统

    • VxWorks
    • QNX 开源
    • Nucleus PLUS 软件组件构成OS
    • uC/OS

问题

  • arm处理器流水线

    ARM7 3级流水线 取址 译码 执行

    ARM9 5

    ARM10 6

十一、更多

  • 汇编源程序 .asm

    汇编 .obj

    link .exe

  • see lang/assembly.md

    1. jmp 无条件转移

    2. 立即数不能直接送入段寄存器

    3. 代码段中有标号时,一定要用assume指出cs

    4. macro 宏定义

    5. 1
      2
      3
      ; 下面两句不要忘记写
      mov ax,data
      mov ds,ax
    6. lodsb ; 从输入串中(ds:[di])取一个字符->al

      另:lodsw

    7. 2号功能:显示输出 (dl) = 输出字符

      1
      2
      3
      4
      5
      out1    macro a
      mov dl,a
      mov ah,2
      int 21h
      endm
    8. 10号功能:带缓冲的键盘输入 ds:[dx]=缓冲区首址

      1
      2
      3
      4
      5
      scan    macro a
      lea dx,a
      mov ah,10
      int 21h
      endm
    9. 清屏

      1
      2
      mov ax,3
      int 10h
    10. ?表示所定义的变量无特定初值

    11. 常量不会存储在数据段里

    12. 乘除指令

    • 有符号乘

      1
      imul opd,ops

      ​ opd为16/32位的寄存器,ops为同类型的寄存器、存储器操作数或立即数

      1
      imul opd,ops,n

      opd为16/32位的寄存器,ops为同类型的寄存器、存储器操作数,n为立即数

      1
      imul ops

      ops为寄存器或存储器操作数,代表x*ops,x类型由ops决定

      (al)*(ops)->ax

      (ax)*(ops)->dx,ax // dx高位,ax低位

      (eax)*(ops)->edx,eax

      若高位不是低位的符号扩展,则cf=1、of=1,否则cf=0、of=1

    • 无符号乘

      1
      mul ops

      参与运算的源操作数及结果都是无符号数

    • 有符号除

      1
      idiv ops

      字节除法:(ax)/(ops)->al(商),ah(余数)

      字除法:(dx,ax)/(ops)->ax,dx

      双字除法:(edx,eax)/(ops)->eax,edx

      前面的存放高位,后面的存放低位

      余数与被除数同号

    • 无符号除

      1
      div ops

      字节除法:(ax)/(ops)->al(商),ah(余数)

      字除法:(dx,ax)/(ops)->ax,dx

      双字除法:(edx,eax)/(ops)->eax,edx

  • 8086 CPU 寄存器简介

  • ip、eip不能直接作为操作数

  • 栈操作,操作数类型必须为字(word)

debug使用

  • R

    查看、改变寄存器内容

  • D

    查看内存(存储器)中的内容

  • E

    改写内存中的内容

  • U

    机器->汇编

  • T

    执行机器指令

  • A

    以汇编指令的格式在内存中写入机器指令