• 1. 汇编语言(ASM)编程清华大学电子工程系 2004年3月《单片机与嵌入式系统》
  • 2. 内容提要汇编程序的一般结构 与C程序比较 开发工具的安装和使用 TM, PD30SIM, KD30 本次实验
  • 3. 参考文档Document 6020e_ASM program 汇编编程手册 6020e_software manual 指令手册 各开发软件的Help中的Manual 教材第三章 指令系统
  • 4. 汇编程序的一般结构C程序结构的一个简单例子 #include “stdio.h” void main() { int a, b, i; a=3; b=0; for (i=0; i<5; i++) b + = a; …… }
  • 5. 汇编程序的一般结构汇编程序结构(1) - Section .include sfr62s.inc .section memory, data ;数据段 result: .blkb 1 temp: .blkb 1 .section prog, code ;代码段 reset: mov.b MyAge, temp mov.b temp, result ……
  • 6. 汇编程序的一般结构汇编程序结构(2) …… .section cons_var, romdata ; ROM 数据区 MyAge: .BYTE 26 .section inter, romdata .org Vvector+ (8*4) .lword reset .end
  • 7. M30624FGFP Memory Map
  • 8. 汇编程序需要多做一些工作需要定义每个Section的起始地址; 需要指定基址寻址方式的首地址和堆栈的首地址; 需要设置中断向量表; 需要在使用RAM区之前清零; 其他设置:根据使用的外设,设定相关的寄存器和I/O控制寄存器。
  • 9. 附加工作1 - Section起始地址需要定义每个Section的起始地址 VramTOP .equ 000400H VprogTOP .equ 0F0000H Vintbase .equ 0FA000H Vvector .equ 0FFFDCH .section memory, data .org VramTOP …… 在实际设计中,这些值根据所选的MCU片子来定
  • 10. 附加工作2 - 基址寻址设置基址寻址方式 SB_base .equ 380H ;基址 .section memory, data result: .blkb 1 .section prog,code .org VprogTOP .sb SB_base ;寄存器地址声明 .sbsym result ;变量声明其寻址方式 ldc #SB_base, SB ;对基址寄存器赋值 ……
  • 11. 附加工作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 ;赋值
  • 12. 附加工作3-设置中断向量表可变中断向量表 Vintbase .equ 0FA000H LDINTB #USER_vector_table ;设置寄存器 INTB .section val_vect,romdata .org Vintbase ; 指定中断向量 表起始位置 USER_vector_table: .lword dummy ; No0 Break Interrupt .lword dummy ; No1 Break Interrupt
  • 13. 附加工作3-设置中断向量表固定中断向量表 Vvector .equ 0FFFDCH .section inter,romdata .org Vvector+(8*4) .lword reset ;复位中断向量
  • 14. 附加工作4- RAM区清零RAM区清零 VramTOP .equ 400H VramEND .equ 2BFFH mov.w #0, r0 mov.w #(VramEND+1-VramTOP)/2, r3 mov.w #VramTOP, a1 sstr.w r0 为内容; r3 为次数;a1 为首地址。
  • 15. 附加工作5- 设置其他寄存器如果使用了 I/O 需设置 mov.b #0, pd8 ;方向寄存器 mov.b #1, pur2 ; 上拉电阻寄存器 更多 时钟,A/D等外围电路的设置
  • 16. 一个求 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 基址 ;
  • 17. ;---------- KEEP OF RAM AREA ------------------- ; .section memory,data .org VramTOP result: .blkb 2 ; 运算结果数据 ; .section prog,code .org VprogTOP .sb SB_base ; 分配SB寄存器 .sbsym result ; 设置寻址方式
  • 18. ;---------- CLEAR OF RAM ----------------------- ; reset: ldc #VIstack,ISP ; 设中断指针的值 ldc #SB_base,SB ; 设 SB 的值 ; ldintb #Vintbase ; mov.w #0,r0 ; 淸0 mov.w #(VramEND+1-VramTOP)/2, r3 ; 循环次数 mov.w #VramTOP, a1 ; 起始地址 sstr.w
  • 19. ;---------- INITIALLIZE ------------------------ LDINTB #USER_vector_table ;设置可变矢量表格地址 mov.b #00000110B, int0ic ; 设置INT0中断控制器 mov.b #0,pd8 ; p8 口为输入 mov.b #1,pur2 ; p8.1 口设置上拉 ;---------- MAIN PROGRAM ----------------------- main: mov.w #0055H,r0 ; 55H => r0 mov.w #0066H,r1 ; 66H => r1 mov.w #0055H,r2 ; 55H => r2 mov.w #0044H,r3 ; 44H => r3
  • 20. dsub.w r1,r0 ; 低位字减 xchg.w r2,r0 ; 保存低位字 xchg.w r3,r1 ; dsub.w r1,r0 ; 高位字减 xchg.w r2,r0 ; 保存高位字 xchg.w r3,r1 ; mov.w #VramTOP,a0 mov.w r0,[a0] inc.w a0 inc.w a0 mov.w r2,[a0] jmp main
  • 21. ;---------- START---------------------- sw_int0: reit ;----- DUMMY UART0 INTERRUPT PROGRAM ------ dummy: reit; ;---------- VARIABLE VECTOR TABLE SET ---------- .section val_vect,romdata .org Vintbase USER_vector_table: .lword dummy ; No0 Break 中断 .lword dummy ; No1 Break 中断 .lword dummy ; No2 Break 中断
  • 22. … … … … .lword dummy ; No27 TimerB1中断 .lword dummy ; No28 TimerB2中断 .lword sw_int0 ; No29 INT0 (低有效)中断 … … … … ;---------- VECTOR TABLE ---------- .section inter,romdata .org Vvector+(8*4) .lword reset ;---------- PROGRAM END ---------- .end
  • 23. 关于指令系统请参考教材 更加详细的可以看文档; software_manual.pdf; 详细列出每个指令使用的注意事项。
  • 24. 开发工具的安装和使用通过TM提供了集成化的开发环境 软件安装文件位于: E:\mcusetup TMV320_E.EXE TM集成环境 nc30wav500r2_e.exe 编译器pd30simv500r1_e.exe PDSIM仿真软件 安装 双击直接安装即可,安装目录均为 E:\MTOOL
  • 25. 演示:整个开发过程 启动TM软件 建立一个新的Project 添加汇编源程序(A30文件)到Project里面 编辑和修改A30文件 设置编译参数 编译Build和检查错误 单步仿真: 如何观察当前执行情况:各种显示窗口 如何修改变量和寄存器的值
  • 26. 源文件有两个 Sampa.A30 SFR62S.INC Project保存路径 在E盘根目录上自建工作目录: 比如:E:\ lu 然后在该目录下面建Project目录: E: \lu \test1 然后将两个源文件拷贝到该目录下面
  • 27. 本次实验内容1.把AD转换所得的8位二进制数0到255,转换 为0.0到5.0的十进制数。已知AD转换的基 准电压为5.0V。若用LED显示,小数点后取 几位比较合适?对10位的AD转换又该如何 考虑。输入字节可放R0L中;转换结果保 存在变量result中; 2.课外作业:已知一个偶对称函数的取样数 列(8位256点),求其频谱(16位256点)。 算法自选。