汇编语言程序设计1)编译后,系统提示:目标越界,改为AJMP后编译通过,将ORG 07FFH 改为0800H, 系统提示:目标越界,这说明AJMP可以在2KB 范围内无条件转移。
2.改为LJMP编译通过,这说明LJMP可以在64KB 范围内无条件转移。
3.将LJMP LP1改为SJMP LP0,机器码为80FC,其中FC为偏移量,它是一个补码,01H~7FH说明向PC(增大√、减小)方向跳,80H~FFH说明向PC(增大、减小√)方向跳,这说明SJMP可以在当前PC值-128B~+127B范围内无条件转移。
1、X、Y以补码的形式存放在20H、21H中,编写程序实现如下函数:实验程序:MOV A,20HJZ ZREOJB ACC.7,NEGMOV 21H,#01HSJMP PENDZREO:MOV 21H,ASJMP PENDNEG:MOV 21H,#0FFHPEND:SJMP$END结果记录:1.将数89H存放于20H中,运行程序,观察到21H单元中的内容为FF;2.将数05H存放于20H中,运行程序,观察到21H单元中的内容为01;3.将数00H存放于20H中,运行程序,观察到21H单元中的内容为00;2、将20H~27H中的压缩BCD码拆为两个单字节BCD码,存放在以2000H为首地址的外部RAM 中。
实验程序:MOV R0,#20HMOV R7,#08HMOV DPTR,#2000HLOOP:ACALL CZINC R0INC DPTRDJNZ R7,LOOPSJMP $CZ:MOV A,@R0SWAP AANL A,#0FHMOVX @DPTR,AINC DPTRMOV A,@R0ANL A,#0FHMOVX @DPTR,ARETEND结果记录:20H 21H 22H 23H 24H 25H 26H 27H87H 54H 36H 23 19H 43H 77H 69H 2000H 2002H2004H2006H2008H200AH200CH200EH07H 04H 06H 03H 09H 03H 07H 09H 2001H 2003H2005H2007H2009H200BH200DH200FH08H 05H 03H 02H 01H 04H 07H 06H1、数在计算机中是以补码形式存放的,因此,判断数据的正负,往往采用判断第7 位,是0 则为正数,是1 则为正数2、实验内容2中JZ ZREO 的机器码为600DH ,其中0DH 为偏移量,当前PC值0004 加上这个偏移量等于0011H ,这正是即将执行的程序的首地址,即标号为ZREO 语句。
程序计算器PC的功能是指向下一条指令,因此,跳转语句是依靠偏移量来改变程序计数器PC的值,从而改变程序的流向。
3、分支程序一定要注意分支的语句标号的正确性,每一分支之间必须用跳转(如SJMP)指令分隔,并跳转到相应标号。
4、子程序往往用间址寄存器传递数据,内部RAM用@Ri ,外部RAM用@DPTR ,绝对不能用直接地址。
最后以RET 结尾。
5、循环程序往往用寄存器传递数据,用R7控制循环次数,用调用作为循环体,用指令INC 修改地址指针,用指令DJNZ 判断循环结束。
6、执行ACALL前(SP)= 07H ,执行ACALL时,(SP)= 09H ,(08H)= 09H ,(09H)= 00H ,(PC)= 000FH ,PC的值正是子程序的入口地址,而堆栈中这两个单元存放的是断点处PC的值;执行到RET后,(SP)= 07H , 原08H的值弹给(PC)7~0 ,原09H的值弹给(PC)15~8 ,因此,返回断点继续执行主程序。
结论:掌握顺序结构程序设计。
掌握分支结构程序设计。
掌握控制转移类指令。
掌握子程序设计。
基本指令实验程序执行结果MOV R0, #30H (R0)=30HMOV A , @R0 (A)=07HMOV A , R0 (A)=30HMOV 31H, 30H (31H)=07HMOV 32H, #30H (32H)=30HINC @R0 (30H)=08HMOV 31H, @R0 (31H)=08HMOV DPTR, #0010H (DPTR)=0010HMOVX A, @DPTR (A)=01HMOVC A, @A+DPTR (A)=93HSWAP A (A)=39HXCHD A, @R0 (A)=38H(30H)=09HPUSH ACC (SP)=08H ((SP))=38HPUSH 07H (SP)=09H ((SP))=15HPOP ACC (A)=15H (SP)=08HPOP 07H (R7)=38H (SP)=07HMOV A,R7 (A)=15HEND内部RAM之间数据传送用指令MOV ,内部RAM与外部RAM之间数据传送只能使用MOVX指令,且必须通过累加器A传送;内部RAM与外部ROM之间数据传送只能使用指令MOVC ,且必须通过累加器A传送;但只能由外部ROM向内部RAM单向传送。
PUSH 和POP 是 堆栈 操作指令,若SP=07H ,执行PUSH ACC 指令时,操作顺序是先 先将SP 内容+1 ,然后 将A 内容送给SP 所指向单元中 ,执行POP ACC 指令时,操作顺序是先 将SP 所指向单元中的内容送给A ,然后 将SP 内容-1 。
2.算术运算类指令及PSW 状态的变化规律程序 ABCY AC OV P ORG 0000H 00H 00H 0 0 0 0 SETB C 00H 00H 1 0 0 0 MOV A,#49H49H 00H1 0 0 1 ADDC A,#27H 71H 00H 0 1 0 0 DA A77H 00H0 1 0 0 SUBB A,#0A5H D2H 00H 1 0 1 0 ADD A,#2DH FFH 00H0 0 0 0 INC A00H 00H0 0 0 0 ADDC A,#95H 95H 00H 0 0 0 0 DIV AB95H 00H0 0 1 0 MOV B,#08H 95H 08H 0 0 1 0 MUL AB A8H 04H 011END3.设计程序:查表求0~9的平方。
(以6为例)1)用指令MOVC A,@A+DPTR 查表ORG 0000H反汇编代码LJMP 1FFFH 0000:02 1F FF TAB:DB 00H,01H,04H 0003:00 01 04 DB 09H,10H,19H,24H 0006:09 10 19 24 DB 31H,40H,51H 000A:31 40 51 ORG 1FFFHMOV A,#06H 1FFFH:74 06 MOV DPTR,#TAB2001:900003 MOVC A,@A+DPTR 2004:93 SJMP $ 2005:80 FE ENDORG 0000H 反汇编代码 MOV A,#06HADD A,#02H MOVC A,@A+PC SJMP $ TAB:DB 00H,01H,04H DB 09H,10H,19H,24H DB 31H,40H,51H END3.拆字程序,设(20H)=35H,要求拆为03H、05H存放在外部RAM0020H、0021H 单元中。
ORG 0000H 反汇编代码执行结果MOV R0, #20HMOV DPTR, #0020HMOV A,@R0ANL A, #0FHMOVX @DPTR, AINC DPTRMOV A,@R0SWAP AANL A, #0F0HMOVX @DPTR, ASJMP $END结论:1.掌握Medwin(万利)软件运用方法。
2.熟悉基本指令及寻址方式。
3.掌握PSW标志位的变化规律。
4.掌握拆字程序与查表程序的设计。
实验三外部中断方式控制L E D1、当中断没发生时,8个LED按间隔依次发光。
当P3.2 (INT1)为负跳变时,8个LED 依次左移循环点亮。
实验程序:O R G0000HS J M P S T A R TO R G0013HA J M P Z D1O R G0030HS T A R T:S E T B E X1S E T B E AS E T B I T1M O V A,#55HL O O P:M O V P1,AS J M P L O O PO R G0060HZ D1:C L R E AP U S H A C CS E T B E AM O V A,#0F E HM O V R7,#08HL O O P1:M O V P1,AA C A L L D E L A YA C A L L D E L A YR L AD J N Z R7,L O O P1C L R E AP O P A C CS E T B E AR E T ID E L A Y:M O V R6,#00HD E L Y1:M O V R5,#00HD J N Z R5,$D J N Z R6,DE L Y1R E TE N D结果记录:2. 在P3.2 (INT1)发生中断后,8个LED依次循环点亮;P3.3(INT0)中断,8个LED 全部熄灭。
实验程序:实验四定时器/计数器中断五、程序1、用定时器T0用工作方式1实现P1.0所控制的LED每秒钟闪烁1次。
实验程序:1.确定工作方式字(T0方式1):TMOD=0000 0001B=01H2.计算初值:Fosc=6MHzTcy=12/6=2us假定定时时间为10ms,中断100次就得到1s。
X=216-10000/2=60536TH0=60=3ECTL0=176=078H3.程序设计ORG 0000HSJMP STARTORG 000BHAJMP ZDT0ORG 0030HSTART: MOV TH0,#3ECMOV TL0,#078HMOV TMOD,#01HSETB ET0SETB EAMOV R7,#0AHSETB TR0SJMP $ORG 0100HZDT0: MOV TH0,#3ECMOV TL0,#078HDJNZ R7,ZDT0_1CPL P1.0MOV R7,#64HZDT0_1:RETIEND实验结果:P1.0所控制的LED每秒钟闪烁1次。
2、当P3.5接收5个单脉冲,P1.0所控制的LED亮;当P3.5接收5个单脉冲,P1.0所控制的LED灭;如此循环。
实验程序:1.确定工作方式字(T1方式2):TMOD=0110 0000B=60H2.计算初值:X=28-5=251TH1=251=0FBHTL1=251=0FBH3.程序设计ORG 0000HSJMP STARTORG 001BHCPL P1.0RETIORG 0030HSTART: MOV TH1,#0FBHMOV TL1,# 0FB HMOV TMOD,#60HSETB ET1SETB EASETB TR1SJMP $END六、实验结果当P3.5接收5个单脉冲,P1.0所控制的LED亮;当P3.5再接收5个单脉冲,P1.0所控制的LED灭;如此循环。