原作者是哪位大佬已经不可考,写的挺好的转发一波,侵删
关注
注意
- 乘除
重点
- 新增一个中断处理程序的步骤
- 编写新的中断处理程序
- 获取中断号m。
- 将新的中断处理程序装入内存或驻留内存,将新的中断处理程序的偏移地址和段地址保存到物理地址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
- 传送
- 进栈
- 出栈
寻址方式
-
寄存器寻址
寄存器是操作数的存放地址。
inc bx
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为常数或结果确定的表达式。
示例:
mov word ptr [si],12h
mov eax,-12345678h
-
直接寻址
格式:
段寄存器:[n]
变量
变量+常量
说明:n为常数或数值表达式,表示偏移地址。
注意:
- 必须要加段寄存器
示例:
inc buf
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
根据位编号对目的操作数中的位来测试
bt eax, 52
-
OR
-
XOR
-
-
移位
-
SAL
-
SHR
逻辑右移,最高位补0
-
SAR
算术右移,最高位不变
-
ROL
-
ROR
-
RCL
带进位的循环左移
-
RCR
-
-
双精度移位指令
-
伪指令语句
也称汇编控制指令
-
处理器选择
.386
.8086
… -
数据定义
- db
- dw
- …
-
符号定义
- 等价伪指令 equ
- 等号 =
- 定义符号名 label
-
段定义
-
段定义
segment_name segment ... segment_name ends
使用类型:
use16
use32
-
假定 assume
-
置汇编地址计数器 $
ORG 设置汇编地址计数器$的值
-
-
过程定义
-
程序模块的定义与通信伪指令
-
宏定义
-
条件汇编
-
格式控制、列表控制及其他功能伪指令
常用DOS系统功能调用
- 1号调用 键盘输入一个字符,存入al
- 2号调用 输出一个dl中的字符到显示器
- 9号调用 将
ds:dx
指向的以$结尾的字符串送到显示器显示
程序设计的基本方法
顺序
分支
转移指令
-
条件转移
- 简单条件转移
- 无符号数条件转移
- 有符号数条件转移
- 循环转移
-
无条件转移
可以段内,可以段间
JMP CALL RET INT IRET
循环
子程序
定义:
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
宏指令
- 宏定义
- 宏调用
- 宏展开
定义:
name macro
...
...
name endm
调用:直接用宏名调用。
传参:
-
带间隔符的参数
< > 尖括号括住
-
数字参数
%
-
宏参数的连接
&
-
宏体中的变量与标号
local
重复汇编伪指令:
- 给定次数的重复汇编
rept 26
db char
char = char+1
endm
-
不定次数的重复汇编
IRP
IRPC
条件汇编伪指令:
IF
ELSE
ENDIF
引入宏库:
include macro.lib
模块化程序
- 组合方式
- 定位方式
- 组合方式
- ‘类别’
- 通信方式
输入/输出和WIN32编程
中断
内中断
中断源:
中断向量表:
存储了中断处理程序的入口地址
- 编写中断处理程序
- 安装(复制到固定地址处)
- 设置中断向量表
外中断
嵌入式
名词
Soc System on Chip 片上系统
BSP Board Support Package
USB Universal Serial Bus 通用串行总线
I 2 C I^2C I2C 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:
特点:
- 设计时大量使用可复用的IP
- 其制成
克服前后端相分离的弊病。
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 2 C I^2C I2C Inter-Integrated Circuit
通过串行数据线SDL 和串行时间线 SCL Serial Clock Line连接嵌入式处理器与外设IC设备。
-
I 2 S I^2S I2S Inter-IC Sound
-
CAN Controller Area Network
稳定性不错(知道这个就行了)
-
USB Universal Serial Bus
-
红外线
方向性
-
蓝牙
球状
-
以太网 (不考)
-
-
嵌入式最小系统
- 处理器
- 内存
- 时钟
- 电源和复位
-
驱动程序与寄存器
直接利用寄存器与周边沟通的程序,也叫驱动程序。
获取周边的方式:
内存映像
IO地址
操作系统
-
特征
- 小巧
- 实时性
- 可装卸
- 固化代码
- 弱交互性
- 强稳定性
- 统一的接口
-
实时操作系统的常用术语
-
常用的操作系统
- VxWorks
- QNX 开源
- Nucleus PLUS 软件组件构成OS
- uC/OS
问题
-
arm处理器流水线
ARM7 3级流水线 取址 译码 执行
ARM9 5
ARM10 6
更多
-
汇编源程序 .asm
汇编 .obj
link .exe
-
see
lang/assembly.md
-
ip、eip不能直接作为操作数
-
栈操作,操作数类型必须为字(word)
debug使用
-
R
查看、改变寄存器内容
-
D
查看内存(存储器)中的内容
-
E
改写内存中的内容
-
U
机器->汇编
-
T
执行机器指令
-
A
以汇编指令的格式在内存中写入机器指令