单片机汇编语言程序设计.ppt_第1页
单片机汇编语言程序设计.ppt_第2页
单片机汇编语言程序设计.ppt_第3页
单片机汇编语言程序设计.ppt_第4页
单片机汇编语言程序设计.ppt_第5页
已阅读5页,还剩114页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章 汇编语言程序设计,4.1 基本概念,4.1.1 高级语言、汇编语言、机器语言 4.1.2 程序的编译、汇编和调试 4.1.3 程序设计的基本过程 4.1.4 汇编语言的基本格式 4.1.5 伪指令的作用和使用方法 4.1.6 KeilC集成编译环境介绍,4.1.1 高级语言、汇编语言、机器语言,高级语言:接近于人的常用语言形式,是一种面向过程而独立于机器的通用语言。如C 语言。 void main() char a=1; char b=2; char c; c=a+b; ,4.1.1 高级语言、汇编语言、机器语言,汇编语言:它是一种符号语言,是一种面向机器的语言。 ORG 0000H MOV A,01H ADD A,02H MOV R0,A SJMP $ END,4.1.1 高级语言、汇编语言、机器语言,机器语言:是用二进制0,1 表示指令和数据的最原始的程序设计语言。 RAW DATA: E5 01 25 02 F8 80 FE Disassembled DATA: 0000 E501 MOV A,01H 0002 2502 ADD A,02H 0004 F8 MOV R0,A 0005 80FE SJMP $,4.1.1 高级语言、汇编语言、机器语言,选择程序设计语言类型的原则是什么?,4.1.1 高级语言、汇编语言、机器语言 4.1.2 程序的编译、汇编和调试 4.1.3 程序设计的基本过程 4.1.4 汇编语言的基本格式 4.1.5 伪指令的作用和使用方法 4.1.6 KeilC 集成编译环境介绍,4.1.2 程序的编译、汇编和调试,4.1 基本概念,4.1.1 高级语言、汇编语言、机器语言 4.1.2 程序的编译、汇编和调试 4.1.3 程序设计的基本过程 4.1.4 汇编语言的基本格式 4.1.5 伪指令的作用和使用方法 4.1.6 KeilC 集成编译环境介绍,4.1.3 程序设计的基本过程,分析问题 确定算法 设计流程 分配资源 编写源程序 调试、修改,4.1 基本概念,4.1.1 高级语言、汇编语言、机器语言 4.1.2 程序的编译、汇编和调试 4.1.3 程序设计的基本过程 4.1.4 汇编语言的基本格式 4.1.5 伪指令的作用和使用方法 4.1.6 KeilC集成编译环境介绍,4.1.4汇编语言的基本格式,标号:操作码 第一操作数/第二操作数 ;注释 例1: 计算1+2 ORG 0200H START: MOV A, #1 ; A 1(1 Cycle) ADD A, #2 ; A A2(1 Cycle) MOV R1, A ; R1 A(1 Cycle) SJMP START END,4.1.4汇编语言的基本格式,优化 上例如何提高运行效率? ORG 2000H START: MOV R1,#3 ;1 Cycle SJMP START END,4.1.4汇编语言的基本格式,标号的作用: 用于配合转移指令的执行和子程序的调用。 标号的命名方法: 1)由18 个字母或数字组成。标号必须以字母开头。 2)不可使用关键字,如助记符、寄存器名。 3)建议使用具有描述性的符号。,操作数段 数字必须以09开头,便于区分数字和字符串 16进制数非09开头的数字前要加数字0,例如: MOV A, #0A4H,4.1 基本概念,4.1.1 高级语言、汇编语言、机器语言 4.1.2 程序的编译、汇编和调试 4.1.3 程序设计的基本过程 4.1.4 汇编语言的基本格式 4.1.5 伪指令的作用和使用方法 4.1.6 KeilC集成编译环境介绍,4.1.5 伪指令的作用和使用方法,伪指令 写在源文件中,用于控制汇编过程的命令。如设置程序或数据存储区的地址、定义符号、判断程序是否结束等。 没有对应的机器码,它是不可执行的指令。,4.1.5 伪指令的作用和使用方法,1、ORG (Origin) 是起点,指定语句行装载的起始地址。 其格式为:ORG 16位地址 例如, ORG 2000H START:MOV A, #40H 上例说明程序的起始地址是2000H,第一条指令就从2000H开始存放。,4.1.5 伪指令的作用和使用方法,在一个源程序中,可以多次使用ORG指令,以规定不同程序段的起始位置,但所规定的地址应是从小到大,不允许有重叠,即不同的程序段之间不能有重叠。 若ORG指令不带操作数,则汇编后目标程序的起始地址为0000H。,4.1.5 伪指令的作用和使用方法,2、END 是汇编语言源程序结束的伪指令,表示源程序结束。在END以后所写的指令,编程序都不予处理。 一个源程序只能有一个END指令,放在程序的末尾。,4.1.5 伪指令的作用和使用方法,3、DB(Define Byte) 定义字节数据。它的作用是,从指定的地址单元开始,定义数据或ASCII码字符,常用于定义数据常数表。 格式如下: 标号; DB 字节常数表 其中方括号的内容是任选项。 例如: ORG 2000H TAB:DB 14H,26,A DB 0AFH,BC 汇编结果: (2000H)14H (2001H)1AH (2002H)41H (2003H)= AFH (2004H)42H (2005H)43H,4.1.5 伪指令的作用和使用方法,4、DW: 定义字数据。从指定的地址单元开始,定义若干个字常数,常用于定义地址表。 格式如下:标号: DW 字常数表 一个字占两个存储单元,其中高字节数存入低位地址,低字节数存入高位地址,即顺序存放。 例如, ORG 2000H TAB: DW 7423H,00ABH,20 汇编结果: (2000H)74H (2001H)23H (2002H)00H (2003H)=ABH (2004H)00H (2005H)14H,4.1.5 伪指令的作用和使用方法,5、DS(Define Store) 定义存储区。从指定的地址开始,保留一定数量的内存单元,以备程序使用。其区域的大小由指令的操作数确定。 格式如下: 标号: DS 表达式 表达式一般是数值,即要保留的内存单元个数。 例如: ORG 1000H DS 5 DB 23H 汇编结果:从地址1000H开始,保留5个字节 的内存单元,而(1005H)=23,4.1.5 伪指令的作用和使用方法,6、BIT, 位地址符号指令。 把位地址赋予绘所规定的字符名称,常用于定义位符号地址。 格式如下: 字符名称 BIT 位地址 例如, AA BIT P1.0 BB BIT P2.0,4.1.5 伪指令的作用和使用方法,7、EQU(Equate) 赋值(或等值)指令。 把操作数段中的地址或数据赋值给标号。 赋值后的标号,其值在整个程序中不改变,可多次使用。 格式如下: 标号(字符名称) EQU 数或汇编符号 注意,标号与EQU之间不能用“:”来作分隔符。 例如: COUNT EQU 16H ;COUNT=16H ADDR EQU 3000H ;ADDR=3000H MOV A, COUNT ;A=16H 用EQU指令时,必须先赋值,后使用,而不能先使用,后赋值。,4.1.5 伪指令的作用和使用方法,8、DATA 数据地址赋值指令。 将数据地址或代码地址赋予给所规定的标号。 格式如下: 字符名称 DATA 表达式 例如,MN DATA 1000H 汇编后,MN的值为1000H。 DATA指令在程序中常用来定义数据地址,4.1.5 伪指令的作用和使用方法,伪指令DATA与EQU的主要区别在于: 用DATA定义的标识符在汇编时作为标号登记在符号表中,所以可以先使用后定义; 而EQU定义的标识符在汇编时不登记在符号表中,因此必须先定义后使用。 例: MOV A, SOME SOME EQU 01H SOME DATA 01H MOV A, SOME,bit 是在内部数据存储空间中 20H 2FH 区域中一个位的地址,或者 8051 位可寻址 SFR 的一个位地址。 code 是在 0000H 0FFFFH 之间的一个代码地址。 data 是在 0 到 127 之间的一个数据存储器地址,或者在 128 255 范围内的一个特殊功能寄存器(SFR)地址。 idata 是 0 to 255 范围内的一个 idata 存储器地址。 xdata 是 0 to 65535 范围内的一个 xdata 存储器地址。 指针类型和存储区的关系详解 一、存储类型与存储区关系 data - 可寻址片内ram bdata - 可位寻址的片内ram idata - 可寻址片内ram,允许访问全部内部ram pdata - 分页寻址片外ram (MOVX R0) (256 BYTE/页) xdata - 可寻址片外ram (64k 地址范围) code - 程序存储区 (64k 地址范围),对应MOVC DPTR,4.1 基本概念,4.1.1 高级语言、汇编语言、机器语言 4.1.2 程序的编译、汇编和调试 4.1.3 程序设计的基本过程 4.1.4 汇编语言的基本格式 4.1.5 伪指令的作用和使用方法 4.1.6 KeilC 集成编译环境介绍,程序的基本结构,程序的基本结构 顺序 分支 循环 子程序,4.2 顺序结构,顺序结构 例4.2.1:将一字节的压缩BCD 码转换为两字节的ASCII 码 解: 1、基本原理分析,4.2 顺序结构,2、资源使用情况 30H:存放待转换的BCD 码 31H、32H:存放转换的结果 执行以前: 执行以后: 30H:49 30H:49 31H:XX 31H:34 32H:XX 32H:39,4.2 顺序结构,3. 流程图设计 4. 源程序设计 MOV R0, #32H MOV R0, #0 MOV A, 30H XCHD A, R0 ORL 32H, #30H SWAP A ORL A, #30H MOV 31H, A,A低4位32H 高4位保留,4.3 分支结构程序设计,一、分支结构形式 二分支 if then else ,4.3 分支结构程序设计,switch ( ),4.3 分支结构程序设计,二、转移指令 1. 无条件转移 SJMP : 短跳转,转移范围128 127 AJMP : 绝对跳转,转移范围2KB LJMP : 长跳转 ,转移范围64KB JMP : 散转指令,实现多分支,4.3 分支结构程序设计,2 条件转移 JZ /JNZ ;测试A JC/JNC ;测试Cy JB/JBC/JNB ;测试某一比特位 CJNE ;比较两数的大小 ;可用于形成三分支结构,影响CY标志 DJNZ ;循环转移,4.3 分支结构程序设计,三、典型程序设计 1. 二分支结构 例:求取|x|(x 为8bits 符号数) 解: 基本思想 -1补 -0000 0001B 补 1111 1111B=FFH FFH 补1111 1111B 补0000 0001B= 01H x0: 若 x 补y, 则 有 y 补|x|,AbsNum: MOV R0, #50 MOV A,R0 JB ACC.7 NEG ; 测试D7符号位, ;为负数,转NEG RET NEG: CPL A INC A MOV R0,A RET,4.3 分支结构程序设计,程序测试用例的完备性 所使用的程序测试用例要测试到程序的每个分支,确保程序的正确性。 注意: CPL R0 为非法指令! CLR R0 为非法指令! CPL,CLR 指令只适用于A 或 位变量!,4.3 分支结构程序设计,例4.2.6 设数a在30H单元中, 数b在31H单元中, 试编写计算下式的程 序: 结果存放在32H中。,ORG 1000H MOV A,31H CJNE A, #10,SUBAB ; B!=10,转SUBAB ADDAB:ADD A,30H ; B=10,计算A+B MOV 32H,A SJMP DONE SUBAB:JNC ADDAB ;Cy=0则B10,转ADDAB CLR C ;Cy=1则B10,计算A-B MOV A,30H SUBB A,31H MOV 32H,A DONE: SJMP $,4.3 分支结构程序设计,注意: 1. 测试数据的完备性。 2. CJNE、JNC 指令的用法。 3. 标号应具有表述性。 4. “$” 代表指令所处单元地址。 HERE: SJMP HERE等同于SJMP $,4.3 分支结构程序设计,思考: 如何改为三分支结构?,CLR C MOV A,31H SUBB A,#10 JZ ADDAB JNB ACC.7, ADDAB CLR C ;0 计算A-B MOV A,30H SUBB A,31H MOV 32H,A SJMP DONE ADDAB:MOV A,30H ADD A,31H MOV 32H,A SJMP DONE DONE: SJMP $,4.3 分支结构程序设计,2 散转结构 按键处理方式: switch (R3) case 0: break; case 1: break; ,CJNE R3, #00H, NOT0 ; 0 号键处理模块 CJNE R3, #01H, NOT1 ; 1 号键处理模块 CJNE R3, #02H, NOT2 .,4.3 分支结构程序设计,散转结构程序的作用:按键响应 特点:效率高 实现方法: 1)散转指令表 转移指令组成分支表 2)散转地址表 分支程序的首地址组成分支表 3)散转偏移量表 分支程序的首地址与分支表的标号之差组成分支表,4.3 分支结构程序设计,例: 根据R3 的值,转向3 个分支。 R30, 转向R_KEY0 R31, 转向R_KEY1 R32, 转向R_KEY2 解: 调试例程 a. 构造转移指令表 JMP A+DPTR ENTRY: LJMP R_KEY0 ;转移指令表:3 字节 LJMP R_KEY1 LJMP R_KEY2 b根据R3,计算偏移量 偏移量R3 3,散转指令表,4.3 分支结构程序设计,;button1.asm ORG 0400H START: MOV DPTR, #ENTRY ;赋指令表入口地址 MOV A, R3 ;计算偏移量 MOV B, #3 MUL AB JMP A+DPTR ;散转 ENTRY: LJMP R_KEY0 ; 转移指令表: 3 字节 LJMP R_KEY1 LJMP R_KEY2 R_KEY0: CLR P1.0 SJMP START R_KEY1: SETB P1.0 SJMP START R_KEY2: MOV P1, #0AAH SJMP START END,4.3 分支结构程序设计,思考: 1. 若改用AJMP 指令,应如何修改程序?(button2.asm) 2. 若按键数目达到100 个,应如何修改程序?(button3.asm),;button2.asm ORG 0400H START: MOV DPTR, #ENTRY ;赋指令表入口地址 MOV A, R3 ;计算偏移量 ADD A, R3 ;MUL AB JMP A+DPTR ;散转 ENTRY: AJMP R_KEY0 ; 转移指令表: 2 字节 AJMP R_KEY1 AJMP R_KEY2 R_KEY0: CLR P1.0 SJMP START R_KEY1: SETB P1.0 SJMP START R_KEY2: MOV P1, #0AAH SJMP START END,;button3.asm ORG 0400H START: MOV DPTR, #ENTRY ;赋指令表入口地址 MOV A, R3 ;计算偏移量 ADD A, R3 JMP A+DPTR ;散转 ENTRY: AJMP R_KEY0 ; 转移指令表: 2 字节 AJMP R_KEY1 AJMP R_KEY99 R_KEY0: CLR P1.0 SJMP START R_KEY1: SETB P1.0 SJMP START R_KEY2: MOV P1, #0AAH SJMP START R_KEY99: MOV P1, #0AAH SJMP START END,4.3 分支结构程序设计,散转地址表方式 在数据表中存放的不是散转指令,而是散转指令要跳转到的各个功能模块的入口地址; 通过MOVC指令得到这些地址,然后通过JMP指令,跳转到相应的地址处; button4.asm,构造分支地址表 ENTRY: DW R_KEY0 ;分支地址令表:2 字节 DW R_KEY1 DW R_KEY2,MOV DPTR, #ENTRY MOV A,R3 ADD A,R3 ;2字节地址,R3X2 MOV R4,A ;暂存A MOVC A,A+DPTR ;取分支高8位地址 XCH A,R4 ;高8位地址存于R4 INC A MOVC A, A+DPTR ;取分支低8位地址 MOV DPL,A MOV DPH,R4 CLR A JMP A+DPTR ENTRY: DW R_KEY0 ;分支地址令表:2 字节 DW R_KEY1 DW R_KEY2 R_KEY0: CLR P1.0 R_KEY1: SETB P1.0 R_KEY2: MOV P1, #0AAH,4.3 分支结构程序设计,散转偏移量表方式 数据表中存放的不是入口地址的绝对值,而是入口地址相对于数据表首地址的相对值; 该方法只适用于简单散转结构,分支不多,且都集中于数据表首地址后256字节范围内。 button5.asm,构造分支地址偏移量表 ENTRY: DB R_KEY0-ENTRY ;偏移量地址令表:1 字节 DB R_KEY1-ENTRY DB R_KEY2-ENTRY,;button5.asm ORG 0400H START: MOV DPTR, #ENTRY ;赋指令表入口地址 MOV A, R3 ;计算偏移量 MOVC A, A+DPTR JMP A+DPTR ;散转 ENTRY: DB R_KEY0-ENTRY DB R_KEY1-ENTRY DB R_KEY2-ENTRY R_KEY0: CLR P1.0 SJMP START R_KEY1: SETB P1.0 SJMP START R_KEY2: MOV P1, #0AAH SJMP START END,4.3 分支结构程序设计,三种散转方式的比较 散转指令表方式:简单易行,适合大量分支散转程序设计; 散转地址表方式:结构复杂,容易出错; 散转偏移量表方式:散转空间仅限256字节,只适合少量分支程序设计;,4.4 循环结构,一、基本知识 应用背景:常常某一段代码需要执行多次 常见C 语言形式 1) for (i=0;i10;i+) ,4.4 循环结构,2) do while (i!=10) while (i!=10); 3) for(;) if (x=q) break; ,4.4 循环结构,基本要素: 循环变量,循环体,循环条件 典型汇编语言循环结构,4.4 循环结构,Mode1:已知循环次数 MOV R6, #8 LOOP: CPL P1.0 DJNZ R6, LOOP SJMP $,MOV R6, #8 MOV R0, #30H LOOP: MOV R0, #0 INC R0 DJNZ R6, Loop SJMP $,4.4 循环结构,Mode2:未知循环次数 TEST: JB P3.0, QUIT ; If P3.0=1, then quit! INC A SJMP TEST QUIT: SJMP $,4.4 循环结构,二、典型程序设计 例1:延时程序设计 应用背景,4.4 循环结构,START: MOV P1, #11111110B ;2cycle MOV P1, #11111101B ;2cycle SJMP START ;2cycle 全速执行时能够观察到LED 闪烁现象吗? 信号频率1/6=167 kHz(12MHz的晶振) 人眼对24Hz 的信号已不敏感。,4.4 循环结构,P1.0与P1.1的输出时序图,4.4 循环结构,延长信号周期、改变占空比的方法: START: MOV P1, #11111110B NOP NOP MOV P1, #11111101B SJMP START 若间隔1s 需要插入多少个NOP 指令? N=112 1/(12MHz)=1106 所需指令空间为1M字节,4.4 循环结构,试分析如下代码段的执行时间(晶振频率8MHz) MOV R2, #255 ;1cycles LOOP2: NOP ;1cycle NOP NOP DJNZ R2,LOOP2 ; 2cycles 循环体执行时间 (1112)2551275cycles 整体时间: 112751276cycles1.914ms 1cycle12/8=1.5us,4.4 循环结构,若想延时20ms 怎么办? MOV R3, #10 LOOP1: MOV R2, #255 ;1cycles LOOP2: NOP ; 1cycle NOP NOP DJNZ R2,LOOP2 ;2cycles DJNZ R3,LOOP1 ;2cycles,4.4 循环结构,如何精确计算代码的运行时间? 内循环体执行时间T 内:52551275cycles 外循环体执行时间T 外:(1T 内2)10 (112752)10 12780 cycles 整体执行时间:1T 外12781cycles 19.172ms 如何粗略估算运行时间? (1112)2551012750cycles19.125ms,4.4 循环结构,思考: 1. 若延时1s,应如何修改程序? 2. 若晶振频率改为6MHz, 则R3 的初值为多少? 3. 如何形成多重循环?,4.4 循环结构,例2:数据块求和(4_2_9.asm) R0:数据指针 R1:计数器 A: 累加和 应用领域: 内存测试 通讯数据测试(校验和测试法),ORG 1000H BLOCK DATA 11H ;定义首地址 RESULT DATA 10H MOV A #0 ;累加器A清零 MOV R0, #BLOCK ;置地址指针 MOV R1, #100 ;置循环次数 LOOP: ADD A, R0 INC R0 ;修改指针 DJNZ R1, LOOP MOV RESULT, A ;存放结果 SJMP $,4.4 循环结构,例3 均值滤波 (4_2_12.asm) y(X1+X2+X3+X8)8 如何实现双字节除8 运算? 资源分配: R0、R1: 累加和,前者存放高位 R2: 计数器 改正: LP1: MOV P1, #0FFH; 读预备指令 ;保证P1 能够正确输入外部信息 LP3:CLR C,4.4 循环结构,测试用例: 当求和结束后:R0=10001001B R1=01000011B,4.4 循环结构,例4:排序问题(sort.asm) 应用背景:中值滤波 解: 1. 基本原理:冒泡法,4.4 循环结构,需要几层循环? 外层循环次数:4=(N1) 内层循环次数:4321 内循环的任务: 相邻两数比较,若逆序则交换位置。,4.4 循环结构,核心代码: 如何判断大小?(R0)50H MOV A, R0 ; INC R0 CLR C SUBB A, R0 ;(50H)-(51H) JC LESS ; (50H)(51H), 不交换 如何交换(50H),(51H)?A(50H)=04H,R051H, (51H)=02H XCH A, R0 ; A=02H, (51H)=04H DEC R0 ; R050H MOV R0, A ; 50H02H,4.4 循环结构,2. 资源分配: R2:大循环计数器 R3:小循环计数器 50H:数据队列的首地址 R0:数据指针,4.4 循环结构,3. 流程图 思考: 1. 若按从大到小的次序排列,如何修改程序?,4.4 循环结构,2. 交换次数与什么有关?如何统计交换次数? 3. 若队列已就绪,能否及时退出?,4.4 循环结构,例5 并行口的基本应用(输出、输入) 1. 计数器 2. 彩灯控制,4.4 循环结构,输入方式:开关量输入 按键开启:输入“1” (要求内部MOS 管为截止状态) 按键闭合:输入“0”,4.4 循环结构,保证P1 端口正确输入的预备指令: MOV P1, 0FFH 读引脚指令:(P1 工作于输入模式) MOV A,P1 ; P1 为第二操作数 MOV C,P1.1 ; P1.1 为第二操作数,4.4 循环结构,读锁存器指令(或称读修改写指令,P1 工作于输出模式) INC P1 DEC P1 DJNZ P1, LOOP ANL P1, A ORL P2, A XPL P3, A CLR P1.0 SETB P1.0 CPL P1.0 MOV P1.0, C 共性:第一操作数为端口(P0P3),3.24,ORG 1000H CLR C MOV 20H,#80H MOV 21H,#90H MOV 22H,#0A0H MOV 25H,#0A0H MOV 26H,#6FH MOV 27H,#76H MOV R0,#20H MOV R1,#25H MOV R2,#3H LOOP: MOV A,R0 ADDC A,R1 MOV R0,A INC R0 INC R1 DJNZ R2,LOOP JNC NEXT MOV R0,#01H SJMP $ NEXT: DEC R0 SJMP $ END,4.5 查表程序设计,一、表格的用途 例:求sin(x)=? sin(x)=x-x3/3!+x5/5!-+(-1)nx2n+1/(2n+1)!+ 求函数值、传感器非线性校正、码制转换、LED 字模转换 二、表格的定义方法 使用DB、DW 伪指令存放于代码段中。,4.5 查表程序设计,三、表格的结构和表项地址求取方法 表项地址表首地址表项序号表项大小 四、查表指令 MOVC A, A+DPTR MOVC A, A+PC,4.5 查表程序设计,五、典型程序设计 1. DPTR 查表方式 2. PC 查表方式 例7:利用查表法求取字符0F 的ASCII 码 (lkup1.asm)p5051,4.5 查表程序设计,掌握指令长度估算方法 指令基本长度为1 字节; 逢立即数(8bits)长度加1; 逢直接寻址方式加1。,4.5 查表程序设计,小结: Button4.asm,4.5 查表程序设计,3. 顺序查表 顺序查表法的特点: 依次查找 可用于搜索无序表格 需要较长时间,一般步骤: 1)表的起始地址送入PC或DPTR 2)表格的长度放在某一个寄存器中 3)要查找的关键字放在某一内存单元中 4)用MOVC A,A+PC或MOVC A, A+DPTR指令取数 5)用CJNE A,direct,rel指令查找,4.5 查表程序设计,4.5 查表程序设计,例4.2.15 P.94 程序设计步骤:,4.5 查表程序设计,分析以下指令的作用: MOV A, #15H MOVC A, A+PC CJNE A, CHECK, A1 INC A INC DPTR TABLE: DB 30H, 45H, 67H, 41H, 00H, 36H,4.5 查表程序设计,TABLE 的作用是什么? TABLE:符号地址,表示表首地址具有浮动性。 表首地址固定: ORG 4000H TABLE:DB 30H, 45H, 67H, 41H, 00H, 36H,4.5 查表程序设计,关于伪指令的使用:EQU,DATA,DB,DW EQU 指令可以先使用后定义 DATA EQU 30H ;错 X: DATA 30H ;错 格式规范性: TABLE: DB 00,01 DB 00,02 TABLE: DB 0,1 DB 00H,02H 或 TABLE: DW 1 DW 0002H,ORG 1000H CHECK EQU 20H KEY EQU 21H MOV CHECK,KEY MOV R4,#100 MOV A,#15 MOV DPTR,#TABLE LOOP: PUSH ACC ;PUSH direct MOVC A,A+PC CJNE A,CHECK,A1 MOV R2,DPH MOV R3,DPL DONE: SJMP DONE A1: POP ACC ;POP direct INC A INC DPTR ;记录表的地址 DJNZ R4,LOOP MOV R2,#0 MOV R3,#0 AJMP DONE TABLE: DB 01H DB 02H,ORG 1000H CHECK EQU 20H KEY EQU 21H MOV CHECK,KEY MOV R4,#100 MOV DPTR,#TABLE LOOP: CLR A ;A不起作用 MOVC A,A+DPTR CJNE A,CHECK,A1 MOV R2,DPH MOV R3,DPL DONE: SJMP DONE A1: INC DPTR ;修改地址指针 DJNZ R4,LOOP MOV R2,#0 MOV R3,#0 AJMP DONE TABLE: DB 01H DB 02H,4.5 查表程序设计,思考: 1. 采用A+PC 方式查表时需要注意哪些问题? 2. 顺序查表方法的特点是什么? 3. 固定表格首地址和浮动表格首地址指的是什么?,4.6 子程序设计,子程序的作用:提高程序的模块性,压缩代码长度。,1)子程序应取名。子程序的第一条指令应加标号,以便调用 2)要正确传送参数。 3)注意保护和恢复现场 4)子程序的末尾必须是RET指令。,4.6 子程序设计,一、调用和返回指令 调用指令:LCALL,ACALL 返回指令:RET ,RETI(用于中断返回) ACALL : 绝对调用 LCALL: 长调用 RET: 子程序返回,4.6 子程序设计,二、子程定义和调用方法 ORG 0030H START: MOV SP, # 40H AGAIN: SETB P1.0 LCALL DELAY CLR P1.0 ACALL DELAY SJMP AGAIN ;- DELAY: MOV R6, #40 DLOOP: NOP DJNZ R6, DLOOP RET END,4.6 子程序设计,三、参数传递方法 入口参数: 子程序执行中所必须的寄存器值或存储单元内容(或地址) 。 出口参数: 子程序执行完毕后,结果存放的寄存器或存储单元。,4.6 子程序设计,MOV A, #4 LCALL SQR SQR: MOV B, A MUL AB RET 入口参数: A 出口参数: A, B,4.6 子程序设计,入口参数、出口参数传递方法: 1. 利用A 2. 利用寄存器,或存储单元 3. 利用堆栈 MOV R6,40H LCALL DELAY ;- DELAY: NOP DLOOP: NOP DJNZ R6, DLOOP RET,4.6 子程序设计,例4.2.23 多字节加法 入口参数:R0,R1 出口参数:R0 关键语句: LOOP: . INC R0 INC R1 DJNZ R2,LOOP JNC DONE MOV R0,#1,4.6 子程序设计,四、现场保护 何谓“现场”?,如何保护? ORG 0100H MOV R0, #30H MOV R2, #0AH CLR A LOOP: MOV R0,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论