_单片机-汇编语言程序设计例题 2
第三章 80C51单片机汇编语言程序设计(本科)

ORG START: CLR MOV MOVX MOV INC MOVX SUBB JNC XCH SJMP BIG1: MOVX BIGO: INC MOVX END
8000H C;进位清0 DPTR, #ST1; 设数据指针 A, @DPTR; A←((ST1)),取N1 R2, A; 暂存N1 DPTR; DPTR← ST2(指向N2单元) A, @DPTR; 取N2存于A中 A, R2;N1,N2比较(N2-N1,差在A中) BIG1;N2≥N1,转BIG1,N2<N1,顺序执行 A, R2;N1,N2互换,A ←N1 BIG0 A, @DPTR;A ←N2 DPTR; DPTR← ST3(指向N3单元) @DPTR, A;ST3 ←大数 返回
等、不相等等各种条件判断。
例:两个8位无符号二进制数比较大小。假设在外部RAM中有 ST1、ST2和ST3共3个连续单元(单元地址从小到大),其中ST1
、ST2单元中存放着两个8位无符号二进制数N1,N2,要求找出其
中的大数并存入ST3单元中。
解:(1)分析任务:比较两个数的大小
(2)算法:算术运算、控制转移 (3)程序结构:单分支 (4)数据类型:单字节、二进制、无符号数 (5)数据结构:单元地址升序排列
思考题
3) ORG MOV MOV MOVX ADD MOVX DEC DEC MOVX ADDC 1000H RO, R1, A, A, @R1, R0; R1; A, A, #52H;加数N1的低字节地址送地址指针R0 #55H;加数N2的低字节地址送地址指针R1 @R1; 取N2的低字节 @R0; N1、N2低字节相加 A; 保存N1、N2低字节和 修改加数N1的地址指针内容 修改加数N2的地址指针内容 @R1; 取N2的中间字节 @R0; N1、N2中间字节带低字节和进位相加
单片机汇编语言举例

动态显示字符"8051AF";============================== ;定义显示缓冲区DISP1 EQU 40HDISP2 EQU 41HDISP3 EQU 42HDISP4 EQU 43HDISP5 EQU 44HDISP6 EQU 45H;============================== ORG 0000HLJMP START;============================== ORG 0050HSTART:MOV SP,#060H ;初始化堆栈指针;初始化显示缓冲区MOV DISP1,#0FhMOV DISP2,#0AhMOV DISP3,#01hMOV DISP4,#05hMOV DISP5,#00h;MOV A,#80H ;8255方式控制字MOV DPTR,#0FF23H ;8255控制口地址MOVX @DPTR,A ;初始化8255 MAIN:ACALL DISPLAYSJMP MAIN;============================== DISPLAY:MOV R0,#DISP1MOV R2,#0FEH ;字控制MOV R3,#06HDLOOP:MOV A,@R0MOV DPTR,#LEDMAP ;取七段码表首地址MOVC A,@A+DPTRCPL AMOV DPTR,#0FF21H ;8255 PB口地址MOVX @DPTR,AMOV A,R2MOV DPTR,#0FF20H ;8255 PA口地址RL A ;显示位左移MOV R2,AINC R0ACALL DLYDJNZ R3,DLOOPRET;==============================DLY: ;延时子程序MOV R7,#02HDLY1: MOV R6,#0F0HDJNZ R6,$DJNZ R7,DLY1RET;==============================LEDMAP: ; 数码管七段显示码表(共阴)db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h db 00H;==============================END1到100数码管显示ORG 0000HABIT EQU 20H ;个位数存放处BBIT EQU 21H ;十位数存放处TEMP EQU 22H ;计数器寄存器START:MOV P2,#0FFHMOV TEMP,#0 ;初始化计数器STLOP:ACALL DISPLAYINC TEMPMOV A,TEMPCJNE A,#100,NEXT ;=100重来MOV TEMP,#0NEXT:LJMP STLOP;显示子程序DISPLAY: mov p0,0ffhMOV A,TEMP ;将temp中的十六进制数转换成10进制 MOV B,#10 ;10进制/10=10进制DIV ABMOV BBIT,A ;十位在aMOV ABIT,B ;个位在b;p0口接段码a,b,c,d,e,f,g, p2口接位码,选哪个数码管显示 MOV DPTR,#TAB ;指定查表启始地址MOV R0,#4DPL1:MOV R1,#250 ;显示1000次DPLOP:MOV A,ABIT ;取个位数MOVC A,@A+DPTR ;查个位数的7段代码MOV P1,A ;送出个位的7段代码CLR P2.0 ;开个位显示ACALL D1MS ;显示1msSETB P2.0MOV A,BBIT ;取十位数MOVC A,@A+DPTR ;查十位数的7段代码MOV P1,A ;送出十位的7段代码CLR P2.1 ;开十位显示ACALL D1MS ;显示1msSETB P2.1DJNZ R1,DPLOP ;100次没完循环DJNZ R0,DPL1 ;4个100次没完循环RET;1MS延时(按12MHZ算);====================================================D1MS:MOV R7,#80DJNZ R7,$RET;7段数码管各划的数字排列表TAB:DB 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0F8h,80h,90h ;不带小数点0 1 2 3 4 5 6 7 8 9END步进电机驱动,按键改变转动方向;==============================; 1 2 3 4 5 6 7 8;P1.0: H H H L L L L L;P1.1: L L H H H L L L;P1.2: L L L L H H H L;P1.3: H L L L L L H H; 9 1 3 2 6 4 C 8KEYIN BIT P3.4 ;定义按键输入FLAG BIT 00H;==============================ORG 0000HLJMP START;==============================ORG 0050HSTART:MOV SP,#060H ;初始化堆栈指针MOV P1,#08HMOV R2,#00HCLR FLAGMOV DPTR,#MOV_TABLEMAIN:ACALL KEYPROCJB FLAG,MAIN1INC R2ACALL MOVESJMP MAINMAIN1:DEC R2ACALL MOVESJMP MAIN;============================== MOVE: ;运转控制MOV A,R2ANL A,#07HMOVC A,@A+DPTRMOV P1,AACALL DLYRET;===========MOV_TABLE:DB 09H,01H,03H,02H,06H,04H,0CH,08H ;============================== KEYPROC:JB KEYIN,KEY_DONEACALL DLYACALL DLYJB KEYIN,KEY_DONECPL FLAGJNB KEYIN,$KEY_DONE:RET;============================== DLY: ;延时子程序MOV R7,#0AHDLY1: MOV R6,#0F0HDJNZ R6,$DJNZ R7,DLY1RET;==============================END左右循环点亮ORG 0000HLJMP STARTORG 0030HSTART: MOV R1,#00HDJNZ R1,$MOV SP,#60HLOOP: MOV A,#0FEHLOOP_1: MOV P1,ACALL DELAYRL ACJNE A,#7FH,LOOP_1 ;0111 1111 LOOP_2: MOV P1,ACALL DELAYRR ACJNE A,#0FEH,LOOP_2 ; 1111 1110 SJMP LOOPDELAY: MOV R0,#00HL1: MOV R1,#00H L2: DJNZ R1,L2 DJNZ R0,L1 RETEND所有灯循环点亮ORG 0000HLJMP MAINORG 0100HMAIN:MOV P1,#0FFHLCALL DELAYMOV P1,#00HLCALL DELAYLJMP MAINDELAY:MOV R7,#0D1:MOV R6,#0D2:DJNZ R6,D2DJNZ R7,D1RETEND产生方波/*用定时器T0产生50HZ的方波。
MCS-51单片机指令系统与汇编语言程序设计

docin/sundae_meng
P73 例2.58
ORG 0100H
MOV DPTR,#DATA LOOP2: MOV R1,A
MOV R0,#30H
INC R1
MOV R1,#40H LOOP: MOVX A,DPTR
START:
ORG 1000H MOV DPTR,#TABLE MOV A,20H ANL A,#0FH MOVC A,@A+DPTR MOV 21H,A
docin/sundae_meng
TABLE:
MOV A,20H ANL A,#0F0H
SWAP A MOVC A,@A+DPTR MOV 22H, A SJMP $ DB 30H,31H,32H,33H,34H
docin/sundae_meng
ORG 1000H
START: MOV A, 40H
; 将X送入A中
JZ COMP
; 若A为0,转至COMP处
JNB ACC.7, POST ; 若A第7位不为1(X为正数),则程序转到
POST处,否则(X为负数)程序往下执行
MOV A, #0FFH ; 将1(补码)送入A中
docin/sundae_meng
2.4.1 汇编语言程序设计的步骤
汇编语言程序设计:根据任务要求,采用汇编语言编制程序的过程称为汇编 语言程序设计。 汇编语言程序设计的步骤: (1)拟订设计任务书 (2)建立数学模型 (3)确定算法 (4)分配内存单元,编制程序流程图 (5)编制源程序
进一步合理分配存储器单元和了解I/O接口地址;按功能设计程序,明确 各程序之间的相互关系;用注释行说明程序,便于阅读和修改调试和修改。 (6)上机调试 (7)程序优化
汇编语言单片机考试试题和答案

一.单项选择题(30分)在中断服务程序中至少应有一条()A.传送指令B.转移指令C.加法指令D.中断返回指令2.当MCS-51复位时,下面说法准确の是()A.PC=0000HB.SP=00HC.SBUF=00HD.(30H)=00H3.要用传送指令访问MCS-51片外RAM,它の指令操作码助记符是()A.MOVB.MOVXC.MOVCD.以上都行4.ORG2000H LACLL3000H ORG 3000H RET 上边程序执行完RET指令后,PC=()A.2000HB.3000HC.2003HD.3003H5.要使MCS-51能响应定时器T1中断,串行接口中断,它の中断允许寄存器IEの内容应是()A.98HB.84HC.42HD.22H6.JNZREL指令の寻址方式是()A.立即寻址B.寄存器寻址C.相对寻址D.位寻址7.执行LACLL4000H指令时, MCS-51所完成の操作是( )A保护PCB.4000HPC C.保护现场 D.PC+3入栈, 4000HPC8.下面哪条指令产生信号()A.MOVX A,@DPTRB.MOVC A,@A+PCC.MOVC A,@A+DPTRD.MOVX @DPTR,A9.若某存储器芯片地址线为12根,那么它の存储容量为()A. 1KBB. 2KBC.4KBD.8KB10.要想测量引脚上の一个正脉冲宽度,则TMODの内容应为()A.09HB.87HC.00HD.80H11.PSW=18H时,则当前工作寄存器是()A.0组B. 1组C. 2组D. 3组12.MOVX A,@DPTR指令中源操作数の寻址方式是()A. 寄存器寻址B. 寄存器间接寻址C.直接寻址D. 立即寻址13. MCS-51有中断源()A.5B. 2C. 3D. 614. MCS-51上电复位后,SPの内容应为( )A.00HB.07HC.60HD.70H0003H LJMP2000H ORG000BH LJMP3000H 当CPU响应外部中断0后,PCの值是()A.0003HB.2000HC.000BHD.3000H16.控制串行口工作方式の寄存器是()A.TCONB.PCONC.SCOND.TMOD17.执行PUSHACC指令, MCS-51完成の操作是()A.SP+1SP, ACCSPB. ACCSP, SP-1SPC. SP-1SP, ACCSPD. ACCSP, SP+1SP18.P1口の每一位能驱动()A.2个TTL低电平负载B. 4个TTL低电平负载C.8个TTL低电平负载D.10个TTL低电平负载19.PC中存放の是()A.下一条指令の地址B. 当前正在执行の指令C.当前正在执行指令の地址D.下一条要执行の指令20.8031是()A.CPU B.微处理器 C.单片微机 D.控制器21.要把P0口高4位变0,低4位不变,应使用指令( )A.ORL P0,#0FHB.ORL P0,#0F0HC.ANL P0,#0F0HD.ANL P0,#0FH22.下面哪种外设是输出设备()A.打印机B.纸带读出机C.键盘D.A/D转换器23.所谓CPU是指( )A.运算器和控制器B.运算器和存储器C.输入输出设备D. 控制器和存储器24.LCALL指令操作码地址是2000H,执行完响应子程序返回指令后,PC=( )A.2000HB.2001HC.2002HD.2003H25. MCS-51执行完MOVA,#08H后,PSWの哪一位被置位( )A.CB. F0C.OVD.P26.计算机在使用中断方式与外界交换信息时,保护现场の工作应该是()A.由CPU自动完成B.在中断响应中完成C.应由中断服务程序完成D.在主程序中完成27.关于MCS-51の堆栈操作,正确の说法是()A.先入栈,再修改栈指针B.先修改栈指针,再出栈C. 先修改栈指针,在入栈D.以上都不对28.某种存储器芯片是8KB*4/片,那么它の地址线根数是()A.11根B.12根C. 13根D. 14根29.若MCS-51中断源都编程为同级,当他们同时申请中断时CPU首先响应()A.B. C.T1 D.T030. MCS-51の相对转移指令の最大负跳变距离()A.2KBB. 128BC. 127BD. 256B二.判断题(10分)1.我们所说の计算机实质上是计算机の硬件系统和软件系统の总称。
汇编语言程序设计(第四版)第2章【课后答案】讲解

汇编语言程序设计第四版【课后习题答案】--囮裑為檤第2章8086的指令系统〔习题2.1〕已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12 34 56 78H,[21200H]~[21203H]依次存放2A 4C B7 65H,说明下列每条指令执行完后AX寄存器的内容。
(1)mov ax,1200h(2)mov ax,bx(3)mov ax,[1200h](4)mov ax,[bx](5)mov ax,[bx+1100h](6)mov ax,[bx+si](7)mov ax,[bx][si+1100h]〔解答〕(1)AX=1200H(2)AX=0100H(3)AX=4C2AH ;偏移地址=bx=0100h(4)AX=3412H ;偏移地址=bx=0100h(5)AX=4C2AH ;偏移地址=bx+1100h=1200h(6)AX=7856H ;偏移地址=bx+si=0100h+0002h=0102h(7)AX=65B7H ;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h〔习题2.2〕指出下列指令的错误(1)mov cx,dl(2)mov ip,ax(3)mov es,1234h(4)mov es,ds(5)mov al,300(6)mov [sp],ax(7)mov ax,bx+di(8)mov 20h,ah〔解答〕(1)两操作数类型不匹配(2)IP指令指针禁止用户访问(3)立即数不允许传给段寄存器(4)段寄存器之间不允许传送(5)两操作数类型不匹配(6)目的操作数应为[ SI ](7)源操作数应为[BX+DI](8)立即数不能作目的操作数〔习题2.3〕已知数字0 ~ 9对应的格雷码依次为:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H,它存在于以table为首地址(设为200H)的连续区域中。
第3章_MCS-51单片机指令系统及汇编语言程序设计2

3. 汇编语言的语句格式是什么?使用标号有什么限制?注释段起什么作用? 答案: MCS-51汇编语言的语句格式应符合下列结构: 【标号:】 操作码 【操作数】【;注释】 标号位于语句的开始,由以字母开头的字母和数字组成,它代表该语句的地址。 标号与操作码之间要用“:”隔开,标号与“:”之间不能有空格,“:”与操 作码之间可以有空格。 注释在语句的最后,以“;”开始,是说明性的文字,与语句的具体功能无关。 4. MCS-51汇编语言有哪几条常用伪指令?各起什么作用? 答案: ORG:汇编程序起始地址,用来说明其后程序段在存储器中存放的起始地址; EQU:赋值指令,用来给变量标号赋予一个确定的数值; DB:定义数据字节,指令按字节数的形式把数据存放在存储单元中; DW:定义数据字,按字(双字节)的形式把数据存放在存储单元中; DS:定义存储区,从指定的地址单元开始,保留一定数量的存储单元; BIT:位定义,其功能是把位地址赋给字符名称; END:汇编结束,表明汇编语言程序结束。
2.顺序程序
顺序程序是指程序中没有使用转移类指令的程序段,机器执行这 类程序时也只需按照先后顺序依次执行,中间不会有任何分支、循环, 也不需要调用子程序。 例:将一个单字节十六进制数转换成BCD码。 解:算法分析。单字节十六进制数在0~255之间,将其除以100后, 商为百位数;余数除以10,商为十位数,余数为个位数。 设单字节数存放在40H,转换后,百位数存放在R0中,十位数存 放在R1中,个位数存放在R2中,具体程序如下: ORG 0030H MOV A, 40H ;将单字节十六进制数送入A中 MOV B,#64H ;将100送入B中, #64H可直接写成#100 DIV AB MOV R0,A ;百位数送R0,余数在B中 XCH A,B ;余数送入A中 MOV B,#0AH ;将10送入B中, #0AH可直接写成#10 DIV AB ;商为十位数,余数为个位数 MOV R1,A MOV R2,B SJMP $
单片机汇编语言入门实例

一、用单片机控制发光二极管图1为单片机控制发光二极管的实验电路图。
图中用P1口作为输出端,P1口的P1.0~P1.7引脚分别接了8个LED。
实例1:用单片机控制LED闪烁发光源程序如下:MAIN:SETB P1.0LCALL DELAYCLR P1.0LCALL DELAYLJMP MAINDELAY:MOV R7,#250D1:MOV R6,#250D2:DJNZ R6,D2DJNZ R7,D1RETEND程序说明:1、SETB P1.0:将P1.0口置“1”,既让P1.0输出高电平,让LED 熄灭。
2、LCALL DELAY:LCALL称为子程序调用指令,指令后面的参数DELAY是一个标号,用于标识第6行程序,执行LCALL指令时,程序转到LCALL后面的标号所指示的程序行处执行,如果执行指令过程中遇到RET指令,则程序就返回到LCALL指令下面的一条指令继续执行。
3、CLR P1.0:将P1.0口置“0”,既让P1.0输出低电平,让LED 亮。
4、LCALL DELAY:调用延时子程序DELAY。
5、LJMP MAIN:跳转到第1条指令处执行第1条指令。
6、第6~10条指令是一段延时子程序,子程序只能在被调用时运行,并有固定的结束指令RET。
7、END:不是S51单片机的指令,不会产生单片机可执行的代码,而是用于告诉汇编软件“程序到此结束”,这类用于汇编软件控制的指令称为“伪指令”。
延时程序说明:1、程序中的R6、R7代表工作寄存器的单元,用来暂时存放一些数据。
2、MOV指令的含义是传递数据。
指令“MOV R7,#250”的含义是:将数据250送到R7中。
250前面的“#”号表示250是一个数,而不是一个地址,“#”号后面的数称为立即数。
3、DJNZ指令后面有两个符号,一个是R6,一个是D2。
R6是寄存器,D2是标号。
DJNZ指令的执行过程是:将其后面第一个参数中的值减1,然后看这个值是否等于0,如果等于0,往下执行,如果不等于0,则转移到第二个参数所指定的位置去执行,这里是转移到由D2所标识的这条语句去执行。
单片机原理与运用-第三章答案

第三章单片机的汇编语言与程序设计习题1.设内部RAM中59H单元的内容为50H,写出当执行下列程序段后寄存器A,R0和内部RAM中50H,51H单元的内容为何值?MOV A,59HMOV R0,AMOV A,#00HMOV @R0,AMOV A,#25HMOV 51H,AMOV 52H,#70H解:MOV A,59H ;A=50HMOV R0,A ;RO=50HMOV A,#00H ;A=00HMOV @R0,A ;50H=00HMOV A,#25H ;A=25HMOV 51H,A ;51H=25HMOV 52H,#70H ;52H=70H所以:A=25H R0=50H ;50H=00H 51H=25H2.请选用合适的指令对P0口内容做修改(例如使P0.0~P0.3不变,P0.4~P0.7为0)。
解:MOV A,P0ANL A,0fhMov P0,A3.试问外部数据存储器和程序存储器可以用哪些指令来实现?举例说明。
解:访问外部数据存储器指令有:MOVX @DPTR,A MOVX DPTR,#0100H MOV @DPTR,AMOVX A,@DPTR MOVX DPTR,#0200H MOV A,@DPTRMOVX A,@Ri MOVX A,@R0MOVX @Ri,A MOVX @RI,A访问程序存储器指令有:MOVX A,@A+PCMOVX A,@A+DPTR4.设堆栈指针SP中的内容为60H,内部RAM中30H和31H单元的内容分别为24H和10H,执行下列程序段后,61H,62H,30H,31H,DPTR及SP中的内容将有何变化?PUSH 30HPUSH 31HPOP DPLPOP DPHMOV 30H,#00HMOV 31H,#0FFH解:PUSH 30H ;61H=24HPUSH 31H ;62=10H SP=62HPOP DPL ;DPL=10HPOP DPH ;DPH=24H SP=60HMOV 30H,#00H ;30H=00HMOV 31H,#0FFH ;31H=0FFH5.设(A)=40H,(R1)=23H,(40H)=05H。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
果存入 R2R3 中。
一个十进制数可表示为:
Dn×10n +Dn-1×10n-1 +… + D0×100
=(…((Dn×10+Dn-1)×10+Dn-2)×10+…)+D0
当n=3时, 上式可表示为:
((D3×10+D2)×10+D1)×10+D0
BCDHEX: MOV R0, #40H
; R0指向最高位地址
所谓查表法, 就是预先将满足一定精度要求的表示变量与 函数值之间关系的一张表求出, 然后把这张表存于单片机的程 序存储器中, 这时自变量值为单元地址, 相应的函数值为该地 址单元中的内容。查表, 就是根据变量 X在表格中查找对应的 函数值 Y, 使 Y=f(X)。
MCS - 51指令系统中, 有两条查表指令:
START: CLR C
MOV DPTR, #ST1 ; 第一个数的指针
MOVX A, @DPTR
MOV R2, A MOVX A, @DPTR CLR C
; 取第一个数
; 保存 ; 取第二个数
MOV DPTR, #ST2 ; 第二个数的指针
SUBB A, R2; 两数比较 JNC BIG2 ; 若第二个数大, 则转 XCH A, R2; 第一个数大 BIG1: MOV DPTR, #ST3
MOV21H, A
MOVA, 20H RLCA
MOV20H, A
MOVA, 21H ; 表首地址+偏移量 ADDC A, DPL MOVDPL, A
MOVA, 20H ADDC A, DPH MOVDPH, A CLR A MOVC A, @A+DPTR; 查表得温度值高位字节 MOV22H, A CLRA INCDPTR
DB 46H
在这个程序中, 查表指令MOVC A, @A+PC到表格首 地址有两条指令, 占用 3 个字节地址空间, 故修改指针应加 3。
例 10 设有一个巡回检测报警装置, 需对 96 路输入进行 控制, 每路有一个额定的最大值, 是双字节数。当检测量大于 该路对应的最大值时, 就越限报警。假设R2 为保存检测路数
例 15 在一个温度检测系统中, 温度模拟信号由 10 位A/D 输入。将A/D结果转换为对应温度值, 可采用查表方法实现。 先由实验测试出整个温度量程范围内的A/D转换结果, 把A/D 转换结果 000H~ 3FFH所对应的温度值组织为一个表存储在
程序存储器中, 那么就可以根据检测到的模拟量的 A/D转换
值查找出相应的温度值。 设测得的A/D转换结果已存入 20H#, 21H单元中(高位 字节在20H中, 低位字节在21H中), 查表得到的温度值存放 在22H#,23H单元(高位字节在 22H中, 低位字节在23H中)。
程序如下: FTMP: MOV DPTR, #TAB CLRC RLCA ; DPTR←表首地址 MOVA, 21H ; (20H)(21H)×2
MOVC A, @A+DPTR; 查表得温度值低位字节
MOV23H, A RET
TAB: DW …
7 数制转换
例 16 将一个字节二进制数转换成 3 位非压缩型BCD码。 设一个字节二进制数在内部RAM 40H单元, 转换结果放入内 部 RAM 50H#, 51H, 52H单元中(高位在前), 程序如下:
MOV R0, #4FH ; 数据指针R0置初值
LOOP: INC R0 INC R2 CJNE @R0, #0DH, LOOP RET
6 查表程序设计
查表程序是一种常用程序, 它广来自使用于 LED显示控制、 打印机打印控制、数据补偿、数值计算、转换等功能程序中,
这类程序具有简单、执行速度快等特点。
(2) 外循环可以一层层向内循环进入, 结束时由里往外一
层层退出。
(3) 内循环可以直接转入外循环, 实现一个循环由多个条
件控制的循环结构方式。
例8 在内部 RAM中从 50H单元开始的连续单元
依次存放了一串字符, 该字符串以回车符为结束标志, 要求测试该字符串的长度。
程序如下: START: MOV R2, #0FFH
DELAY: MOV R5, #100
DEL0:
DEL1: DEL2:
MOV R6, #200
MOV R7, #248 DJNZ R7, DEL2 DJNZ R6, DEL1 DJNZ R5, DEL0
RET
上例程序中采用了多重循环程序 , 即在一个循环体中又包 含了其它的循环程序, 这种方式是实现延时程序的常用方法。 使用多重循环时, 必须注意: (1) 循环嵌套, 必须层次分明, 不允许产生内外层循环交叉。
其工作单元清零程序如下:
CLEAR: CLR A MOV DPTR, #8000H ; 工作单元首址送指针 MOV R2, #50 ; 置循环次数 CLEAR1: MOVX @DPTR, A INC DPTR ; 修改指针
DJNZ R2, CLEAR1; 控制循环
RET
例 6
设在内部 RAM的BLOCK单元开始处有长度为
MUL AB
ADD A, R2 MOV R2, A ; R2×10+( R3×10)高 8 位送R2
HEXBCD: MOV A, 40H
MOV B, #100
DIV AB MOV 50H, A MOV A, #10 XCH A, B DIV AB MOV 51H, A
MOV 52H, B
RET
例 17 设 4 位BCD码依次存放在内存 RAM中 40H~43H 单元的低4 位, 高 4 位都为 0, 要求将其转换为二进制数, 结
ORG 1000H
HEXASC: MOV A, HEX
ANL A, # 0FH
ADD A, # 3; 修改指针
MOVC A, @A+PC
MOV HEX, A
RET
ASCTAB: DB 30H, 31H, 32H, 33H, 34H DB 35H, 36H, 37H, 38H, 39H DB 41H, 42H, 43H, 44H, 45H
ORL A, @R1 MOV 50H, A RET
; 拼字 ; 存放结果
例 3 x, y均为8位二进制数, 设 x存入R0, y存入R1, 求解: y=syn(x)
例 3 x, y均为8位二进制数, 设 x存入R0, y存入R1, 求解: y=syn(x)
程序如下: START: CJNE R0, #00H, SUL1 ; R0中的数与00比较不等转移 MOV R1, #00H; 相等, R1← 0 SJMP SUL2 SUL1: JC NEG ; 两数不等, 若(R0)<0, 转向NEG MOV R1, #01H ; (R0)>0, 则 R1←01H
MOVX @DPTR, A ; 存大数
RET
BIG2: MOVX A, @DPTR; 第二个数大
SJMP BIG1 RET
例 5 工作单元清零。 在应用系统程序设计时 , 有时经常需要将存储器中各部 分地址单元作为工作单元 , 存放程序执行的中间值或执行结 果, 工作单元清零工作常常放在程序的初始化部分中。 设有50个工作单元, 其首址为外部存储器8000H单元, 则
LEN个的无符号数据块, 试编一个求和程序, 并将和存入内
部 RAM的 SUM单元(设和不超过 8 位)。 BLOCK EQU 20H LEN EQU 10H SUM EQU 40H START: CLR A ; 清累加器A MOV R2, #LEN; 数据块长度送R2 MOV R1, #BLOCK ; 数据块首址送R1 LOOP: ADD A, @R1 ; 循环加法 INC R1; 修改地址指针 DJNZ R2, LOOP ; 修改计数器并判断 MOV SUM, A; 存和 RET
汇编语言程序设计例题
例 1 两个无符号双字节数相加。
设被加数存放于内部RAM的40H(高位字节), 41H (低位字节) , 加数存放于 50H (高位字节) , 51H(低位字节), 和数存入 40H和41H单元中。
程序如下:
START: CLR C ; 将Cy清零
MOV R0, #41H ; 将被加数地址送数据指针R0 MOV R1, #51H ; 将加数地址送数据指针R1 AD1: MOV A, @R0 ADD A,@R1 MOV @R0, A DEC R0 DEC R1 MOV A, @R0 ADDC A, @R1 MOV @R0, A RET ; 被加数低字节的内容送入A ; 两个低字节相加 ; 低字节的和存入被加数低字节中 ; 指向被加数高位字节 ; 指向加数高位字节 ; 被加数高位字节送入A ; 两个高位字节带Cy相加 ; 高位字节的和送被加数高位字节
SJMP SUL2
NEG : MOV R1, #0FFH ; (R0)<0, 则 R1←0FFH SUL2 : RET
程序如下:
SUBF : MOV A,R0 JZ ZERO JB ACC.7 , NEG MOV R1, #1
SJMP ENDF
ZERO : MOV R1 , #0 SJMP ENDF NEG : MOV R1 , #0FFH ENDF : RET
例 4 比较两个无符号数的大小。
设外部 RAM 的存储单元 ST1和 ST2
中存放两个不带符号的二进制数 , 找出其中 的大数存入外部 RAM 中的 ST3单元中。
例 4 比较两个无符号数的大小。
程序如下: ORG ST1 ST2 ST3 EQU EQU EQU 1000H 2000H 2100H 2200H ; 清零Cy
二、 多重循环
例 7 10 秒延时程序。
延时程序与 MCS - 51 执行指令的时间有关, 如果 使用 6 MHz晶振, 一个机器周期为 2 μs, 计算出一条 指令以至一个循环所需要的执行时间 , 给出相应的循 环次数, 便能达到延时的目的。编写10 秒延时程序