资源预览内容
第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
第9页 / 共17页
第10页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,第四章 汇编语言与 简单程序设计,2,汇编语言程序设计中的数,计算机只能识别二进制数机器指令,它原本是不认识常用的十六进制数和十进制数的。,机器指令/目标代码: 由0/1代码组成的操作码与操作数。,十六进制数:便于读写记忆的二进制数的简写形式。 (09,AF 后缀:H/h),BCD码:用二进制数表达的十进制数。 (09表示为:00001001B 后缀:B/b,H/h),二进制数 :由0/1组成、“逢2进1”的数制。 如:01011110B (01 后缀:B/b),3,汇编语言编程基本规则,汇编语言:用助记符描述的指令的集合。,指令中以 AF 开头的十六进制数前必须添一个 “0”。,二进制数必须带后缀“B”或“b”;十六进制数必须带后缀“H”或“h”;十进制数的后缀是“D”或“d”或无.,标号:操作码 目的操作数,源操作数;注释,汇编程序:汇编语言编写的程序借助编译工具 编译成为目标代码,计算机才能识别。这个编译工具称为汇编程序。,4,汇编程序的伪指令,汇编程序 软件 工具工具软件: 将程序员用汇编语言编写的程序翻译成机器码,(真)指令:告诉计算机如何操作以及做何种操作,用汇编语言编写的程序在此被称为应用程序,伪指令:告诉汇编程序在翻译应用程序时有何具体约定。伪指令不进行具体的操作,那是真指令的事。 比如:从何处开始,何处结束,某些编程者自己规定的表述代表什么意思,5,汇编程序的常用伪指令,ORG addr16ASM51程序中一定要写! 规定编译后的机器代码存放的起始位置。,END ASM51程序中一定要写! 表示翻译到此结束,其后的任何内容不予理睬。,符号名称 EQU 表达式 将表达式的值赋予符号名称。程序中凡出现该符号名称就等同于该表达式。,$ “当前PC值”也叫位置计数器 代表正在执行的指令所在位置。,6,符号名称 BIT 位地址 将位地址的值赋予符号名称。程序中凡出现该符号名称就代表该位地址。,DW 双字节数据或双字节数据组 将双字节数据或双字节数据组顺序存放在此后的存储单元中。占据相应存储空间。,DB 8位数据或8位数据组 将8位数据或8位数据组顺序存放在此后的存储单元中。占相应数量的存储空间。,7,程序的顺序/分支/循环三种基本结构,ORG 2000H BCD2B:MOV A, R2 ;取入口数据 ANL A, #0F0H ;取出十位 SWAP A ;高4位 低4位 MOV B, #0AH MUL AB ;十位乘10 MOV R3,A ;积暂存进R3 MOV A, R2;再取入口数据 ANL A, #0FH ;取出个位 ADD A, R3 MOV R2,A ;结果 R2 RET ;若不是子程序可用END,例: 将R2中BCD码数转为二进制数存进R2 (此子程序在下一例中还要用到),8,编程要点: 两字节 BCD码数范围为: 0000H9999H 相应2进制/16进制数为: 0000H270FH 调用 BCD2B子程序实现“千位,百位”转为二进制, 并乘100; 再调 BCD2B子程序实现“十位,个位”转为二进制; 最后,对位相加。,例:将R5R4中的双字节BCD码数转为 二进制数存于R5R4中。,9,例: 将R5R4中的两字节BCD码数转为二进制数存于R5R4中,X 100,千 百,十 个,二进制,+,Cy,+,(R5),(R4),(R5),(R4),(R6),(A),(R5),(A),二进制,二进制,二进制,二进制,二进制,调 BCD2B,调 BCD2B,10,ORG 2000H VAR EQU 30H ;定义缓存单元 FUNC EQU 31H BR1: MOV A,VAR ;取出变量“X” JZ COMP ;若=0,就赋 0 JNB ACC.7,POS1 ;判断 = 正? MOV A,#0FFH ;(-1 = +1取反加1) SJMP COMP ;输出 -1 POS1:MOV A,#01H ;输出 +1 COMP:MOV FUNC,A ;赋给函数“Y” HERE:AJMP HERE END,例3:,1 (X0) 0 (X=0) 1(X0),Y=,11,任务一:控制一盏灯点亮 任务二:红灯周期性亮/灭 任务三:红外防盗报警,0RG 0000H AJMP MAIN ORG 0003H RL A ACALL DELAY RETI MAIN:MOV A,#80H SETB EX0 SETB EA WAIT:JB ACC.0,JOB1 JB ACC.1,JOB2 JB ACC.2,JOB3 AJMP WAIT,JOB1: CLR P1.0 ;亮红灯 HERE: AJMP HERE,JOB2: CPL P1.0 ;亮/灭 ACALL DELAY ;延时1秒 AJMP JOB2 ;重复,JOB3: CLR P1.1 ;亮绿灯 REDO: SETB P1.3 CHECK:JNB P1.3,CHECK LOOP: ;报警! AJMP REDO ;再检测,12,ORG 1000H DELAY:MOV R6,#200 ; 1Tm LOOP1:MOV R7,#248 ; 1Tm NOP ; 1Tm LOOP2:DJNZ R7,LOOP2 ; 2Tm DJNZ R6,LOOP1 ; 2Tm RET ; 1Tm,例:软件循环延时100mS(晶振12MHz), 1Tm =1uS 100mS = 100000 uS MOV Rn #data 和 NOP 是单机器周期指令 DJNZ Rn,rel 是双机器周期指令 200 = 0C8H ; 248 = 0F8H,1+1+ 248x2 =498,(498+2)x200,13,ORG 1000H DL1S:MOV R7,#10 DL1: MOV R6,#200 DL2: MOV R5, #250 DL3: DJNZ R5, DL3 DJNZ R6,DL2 DJNZ R7,DL1 RET,例:软件循环延时1S(晶振12MHz), 1Tm =1uS 1S = 1000000 uS MOV Rn #data 是单机器周期指令 DJNZ Rn,rel 是双机器周期指令,1+ 250 x2,1+ (1+250 x2) +2)x200,1+ (1+250 x2+2) x200+2x10,14,ORG 2000H H2ASC: MOV A,R2 ;取待转换的数据(入口) ADD A,#0F6H ;判此数是否10 ? 若10,则C=1;10,则C=0 MOV A,R2 ;重取待转换的数据 JNC AD30H ;小于10就跳去加30H ADD A,#07H ;10就先加7 再去加30H AD30H: ADD A,#30H MOV R2,A ;存结果(出口) RET,例:16进制数(00H0FH)转ASCII码子程序,算法:凡10的十六进制数加37H;凡10的 十六进制数加 30H。(ASCII码表09 30H39H, AF 41H46H,15,TABL: DW 050FH,0E89H,0A695H,1EAAH,0D9BH,7F93H DW 0373H,26D7H, 2710H,9E3FH,1A66H,22E3H DW 1174H,16EFH, 33E4H,6CA0H,例:根据16个双字节数的序号查表找出对应数据,编程思路:以表格首地址(TABL)为基址,以序号(的2倍)为偏移量,查找对应的数据,16,ORG 2000H STA1: MOV A,R2 ;取待查数据的序号 X (入口) RL A ;每数占2个单元,序号要乘2 MOV R4,A ;R4 序号 x2 (即偏移量) MOV DPTR,#TABL ;DPTR 表格首地址 MOVC A,A+DPTR ;(A) 查到数据高8位 XCH A,R4 ;数据高8位存进R4(出口) ;同时取出偏移量到A INC DPTR ;DPTR指向下一个单元 MOVC A,A+DPTR ;再查到数据低8位 MOV R3,A ;将数据低8位存进R3(出口) RET TABL: DW ;表格数据见前页 END,17,OVER !,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号