汇编语言(ASM)编程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附加工作3-设置中断向量表
• 固定中断向量表
Vvector
.section .org .lword
.equ 0FFFDCH
inter,romdata Vvector+(8*4) reset
;复位中断向量
附加工作4- RAM区清零
• RAM区清零
VramTOP VramEND
mov.w mov.w mov.w sstr.w
2. 需要指定基址寻址方式的首地址和堆栈 的首地址; 3. 需要设置中断向量表;
4. 需要在使用RAM区之前清零;
5. 其他设置:根据使用的外设,设定相关 的寄存器和I/O控制寄存器。
附加工作1 - Section起始地址
• 需要定义每个Section的起始地址
VramTOP .equ 000400H VprogTOP .equ 0F0000H Vintbase .equ 0FA000H Vvector .equ 0FFFDCH .section memory, data .org VramTOP ……
cons_var, romdata ; ROM 数据区 MyAge: .BYTE 26 inter, romdata Vvector+ (8*4) reset
.section .org .lword .end
M30624FGFP
Memory Map
汇编程序需要多做一些工作
1. 需要定义每个Section的起始地址;
附加工作3-设置中断向量表
• 可变中断向量表
Vintbase LDINTB .equ 0FA000H #USER_vector_table ;设置寄存器 INTB .section val_vect,romdata .org Vintbase ; 指定中断向量 表起始位置 USER_vector_table: .lword dummy ; No0 Break Interrupt .lword dummy ; No1 Break Interrupt
附加工作2 -堆栈设置
两种堆栈:堆栈指针ISP和USP
用何种堆栈,由堆栈指针选择标志位(U标志)选取。 U = 0 选取中断堆栈指针 ISP U = 1 选取用户堆栈指针 USP SP指针位置如何设定: 栈顶指针 Push : SP = SP – 1 Pop : SP = SP + 1 相关设定代码: VIstack .equ 2C00H ldc #VIstack, ISP ;赋值
;---------- KEEP OF RAM AREA ------------------; .section memory,data .org VramTOP result: .blkb 2 ; 运算结果数据 ; .section prog,code .org VprogTOP .sb SB_base ; 分配SB寄存器 .sbsym result ; 设置寻址方式
• 更多 时钟,A/D等外围电路的设置
一个求 8 位 BCD 码相减的例程
;---------- INCLUDE OF SFR FILE ---------------.list off ; 程序不列表 .include sfr62s.inc ; sfr 包含文件 .list on ; 程序列表 ;---------- DEFINE OF SYMBOLS -----------------VramTOP .equ 000400H ; 内部 RAM起始地址 VramEND .equ 002BFFH ; 内部 RAM终了地址 VIstack .equ 002C00H ; 堆栈指针 VprogTOP .equ 0F0000H ; 程序区起始地址 Vintbase .equ 0FA000H ; 可变矢量表起始地址 Vvector .equ 0FFFDCH ; 固定矢量表起始地址 SB_base .equ 000380H ; SB 基址 ;
《单片机与嵌入式系统》
汇编语言(ASM)编程
清华大学电子工程系 2004年3月
内容提要
• 汇编程序的一般结构 – 与C程序比较 • 开发工具的安装和使用 – TM, PD30SIM, KD30
• 本次实验
参考文档
– Document • 6020e_ASM program 汇编编程手册 • 6020e_software manual 指令手册 • 各开发软件的Help中的Manual – 教材第三章 指令系统
汇编程序的一般结构
• C程序结构的一个简单例子
#include “stdio.h” void main() { int a, b, i; a=3; b=0; for (i=0; i<5; i++) b + = a; …… }
汇编程序的一般结构
• 汇编程序结构(1) - Section
.include sfr62s.inc
• 在实际设计中,这些值根据所选的MCU片 子来定
附加工作2 - 基址寻址设置
wk.baidu.com• 基址寻址方式
SB_base .section result: .equ 380H ;基址 memory, data .blkb 1
.section prog,code .org VprogTOP .sb SB_base ;寄存器地址声明 .sbsym result ;变量声明其寻址方式 ldc #SB_base, SB ;对基址寄存器赋值 ……
.section memory, data ;数据段 result: .blkb 1 temp: .blkb 1 .section prog, code ;代码段 reset: mov.b MyAge, temp mov.b temp, result ……
汇编程序的一般结构
• 汇编程序结构(2)
…… .section
.equ .equ
400H 2BFFH
#0, r0 #(VramEND+1-VramTOP)/2, r3 #VramTOP, a1
r0 为内容; r3 为次数;a1 为首地址。
附加工作5- 设置其他寄存器
• 如果使用了 I/O 需设置
mov.b #0, pd8 mov.b #1, pur2 ;方向寄存器 ; 上拉电阻寄存器