微机原理及应用汇编语言程序设计基础_第1页
微机原理及应用汇编语言程序设计基础_第2页
微机原理及应用汇编语言程序设计基础_第3页
微机原理及应用汇编语言程序设计基础_第4页
微机原理及应用汇编语言程序设计基础_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

第四章汇编语言程序设计基础4-1汇编语言程序设计方法4-2汇编语言程序结构4-3汇编语言的编辑与汇编4-1汇编语言程序设计方法2程序设计步骤1程序及程序设计1

程序及程序设计例如:计算63+56+36+14=?MOVA,#63 ;数63送入寄存器AADDA,#56 ;数56与A中的数63相加,其结果119送AADDA,#36 ;数36与A中的数119相加,其结果155送AADDA,#14 ;数155与A中的数14相加,其结果169保存在A中程序是一系列指令的有序集合程序设计则是编制程序的过程程序设计:就是人们用计算机能接受的语言,把欲解决问题的算法和步骤描述出来的过程。编程语言机器语言→汇编语言→高级语言(字符型→图形化)2、

程序设计步骤分析课题→确定算法和数据结构→确定操作步骤→画流程图→编制源程序→调试程序分析课题:对具体问题具体分析,并抽象出数学模型确定算法:解决同一问题有多种方法,从中选择一种最佳的方法确定数据结构:合理安排数据结构,合理选择和分配内存空间、工作寄存器以及I/O接口地址

程序模块:把整个问题分成若干个功能模块,画出层次图及通信画流程图:以图示形式表示解决具体问题的思路和方法编制源程序:精心挑选合适的指令和操作数的寻址方式 用注释行说明程序,便于阅读、调试和修改。调试程序:源程序--→机器程序--→分析结果正确--→调试程序完成

N

修改汇编执行Y流程图图例起止框处理框判断框连线开始结束X

X+1Y

Y-1F>5?YN开始1YN?

4-2汇编语言程序结构程序设计方法结构化设计三种基本控制结构,顺序结构选择结构循环结构一个子程序结构子程序中断服务子程序程序开发方法自顶向下方法→先顶层开发先写主程序,后写子程序自底向上方法→先底层开发先写子程序,后写主程序混合方法

程序设计:就是人们用计算机能接受的语言,把欲解决问题的算法和步骤描述出来的过程。编程语言机器语言→汇编语言→高级语言(字符型→图形化)

4-2汇编语言程序结构4-2-1顺序结构程序设计4-2-2分支结构程序设计4-2-3循环结构程序设计4-2-4子程序结构程序设计4-2-1顺序结构程序设计顺序结构是按照指令在存储器中存放的先后顺序,从某一条指令开始逐条顺序执行,直至某一条指令为止。特点:程序中无转移、调用、分支、循环指令;程序按编写的先后顺序执行,程序流向不变PC自动加1在实际编程中应注意如何正确选择指令、寻址方式和合理使用工作寄存器,包括数据存储器。数据传送和交换程序、简单运算程序、查表程序【例4-1】拆字、拼字程序

将片内RAM50H单元的低4位取出当作高4位,与51H单元的低4位合成一个字节后存入52H单元。STR EQU 50H ;头文件

ORG 0000H MOV R1,#STR MOV A,@R1 ;取50H单元中的数据

ANL A,#0FH ;拆字,屏蔽高4位

SWAPA ;高、低4位互换

INC R1 ;指向51H单元

XCH A,@R1 ;51H单元内容与累加器内容互换

ANL A,#0FH ;拆字,取原51H单元的低4位

ORL A,@R1 ;拼字

INC R1 MOV @R1,A ;存结果

RET END【例4-1】拆字、拼字程序

将片内RAM50H单元的低4位取出当作高4位,与51H单元的低4位合成一个字节后存入52H单元。STR EQU 50H ;头文件

ORG 0000H MOV R1,#STR ;指向50H单元

MOV A,@R1 ;取50H单元中的数据

SWAP A ;高、低4位互换

INC R1 ;指向51H单元

XCHD A,@R1;拆字,拼字;51H单元的低4位

;与A的低4位内容互换

INC R1 ;指向52H单元

MOV @R1,A ;存结果

RET END【例4-2】数制转换

将片内RAM30H单元的无符号二进制数转换成BCD码数,结果按高低顺序依次存放到33H、32H、31H单元。 ORG 0000HHEX_D: MOV A,30H ;取原数据数

MOV B,#10

DIV AB ;二进制数除10

MOV 31H,B ;将余数(BCD码的个位)送31H

MOV B,#10

DIV AB ;商再继续除10

MOV 32H,B ;将余数(BCD码的十位)送32H

MOV 33H,A ;将商(BCD码的百位)送33H

RET【例4-3】查表程序

关键在:组织具有规律性的表格

求R1中数(0~15)的平方,结果仍放回到R1中。

ORG0000HTAB1:MOVA,R1ADDA,#02H;加上地址偏移量

MOVCA,@A+PC;查表MOVR1,ARETDB00H,01H,04H,09H;平方表DB10H,19H,24H,31H;续表DB40H,51H;续表【例4-3】查表程序

求R1中数(0~15)的平方,结果仍放回到R1中。 ORG 0000HTAB2: PUSH DPH ;保存DPTR的原值 PUSH DPL MOV DPTR,#TAB ;取平方表首地址 MOV A,R1 MOVC A,@A+DPTR ;查平方表 MOV R1,A POP DPL ;恢复DPTR的原值 POP DPH RETTAB: DB 00H,01H,04H,09H ;平方表 DB 10H,19H,24H,31H DB 40H,51H以PC为指针查表程序

输入参数:R2输出参数:R3R4TB1:movA,R2addA,R2;?

movR3,AaddA,#08H;?

movcA,@A+PCxchA,R3addA,#03H;?

IncA

;?

movcA,@A+PCmovR4,Asjmp$TAB1: DW1520,3721,4264DW7850,3483,32657DW883,9943,1000DW4051,6785,8931DW4468,5871DW13284,27808END以DPTR为指针查表程序

输入参数:R2R3输出参数:R2R3LTB2:movDPTR,#TAB2movA,R3clrCrlcAmovR3,AxchA,R2rlcAxchA,R2addA,DPLmovDPL,AmovA,DPHaddcA,R2movDPH,A

clrAmovcA,@A+DPTRmovR2,AclrAincDPTRmovcA,@A+DPTRmovR3,AretTAB2:DW520H,3721H,4264HDW7850H,3483H,3265HDW883H,9943H,1000H4-2-2分支结构程序设计特点:程序中含有转移类指令关键:正确选用转移指令无条件分支程序程序设计者事先设计好的流向LJMP、AJMP、SJMP、JMP、LCALL、ACALL、RET(I)有条件分支程序根据程序执行过程中对标志位、A、内部RAM的某些单元或位的影响结果决定程序的流向。使cpu具有判断决策能力JZ/JNZ、CJNE、DJNZ、位控制转移类指令的有机配合注意

使用条件转移指令形成分之前一定安排可供条件转移指令进行判别的条件。JCLOOP

正确选定所用的转移条件、转移目标地址(标号)及转移范围一、单重分支程序一个判断决策框,程序有两条出路,二选一。由一个条件转移指令实现有三种典型单分支结构:条件满足?N影响条件Y分支处理1分支处理2顺序程序1顺序程序2开始结束条件满足?N影响条件Y分支处理段1顺序程序1开始顺序程序2结束顺序程序3条件满足?N影响条件Y分支处理段1顺序程序1开始顺序程序2结束顺序程序3补码绝对值条件满足?N影响条件Y处理段例求R2中补码绝对值,正数不变,负数变补。

MOVA,R2

JNBACC.7,NEXT;为正数?

CPLA ;负数变补

INCA MOVR2,ANEXT:SJMPNEXT;结束JNB【例4-4】无符号数的比较

比较外部RAMData1和Data2单元的两个无符号数,并将大数存入Data3单元中,Data1、Data2和Data3为连续的单元

ORG

0000HCOM1:MOV A,40H

CJNE A,41H,L1;两数比较L1: JC J2

;C=1,则A小转BIG2BIG1MOV 42H,A

;大数送42H RETBIG2: XCH A,41H

;大数送A SJMP BIG1 END 先看数据放在内部RAM的情况data1equ 1000hcom1:mov dptr,#data1 movx a,@DPTR movb,a inc

DPTR movxa,@DPTR cjnea,b,l1l1:

jc

big2;c=1,则a小big1:

inc

dptr movx@dptr,a retbig2:xcha,b sjmpbig1 end【例4-5】代码转换程序设计1

一位十六进制数与ASCII码之间的转换

1、一位十六进制数转换为ASCII码

2、ASCII码转换为一位十六进制数0~9的ASCII码:30~39H,A~F的ASCII码:41~46H。‘0’~‘9’与0~9之间的差值30h‘A’~‘F’与A~F之间的差值37h;1、十六进制转换成ASCII码输入:R2中存放一位十六进制;出口:R2返回ASCII值

ORG 0000HHEXASC:MOV A,R2 ;将该十六进制数暂存于A中

CJNEA,#0AH,$+3 JNC ADD_37;若大于等于0AH,则加37HADD_30:ADD A,#30H;若小于0AH,则加30H MOV R2,A ;保存结果

RET ;子程序返回ADD_37:ADD A,#37H;大于或等于0AH,则加37H MOV R2,A ;保存结果

RET ;子程序返回

2、ASCII码转换成十六进制输入:R2中存放ASCII码输出:R2中返回十六进制ASCHEX:mov A,R2 clrcsubbA,#30hcjneA,#10,$+3 jcA,HEXASC1

;A<10转移

subbA,#07hASCHEX1:ret二、多重分支程序程序有两条以上的出路,多选一。选择参数送A开始分支程序0分支程序1分支程序nA=0A=1A=nA=?条件1成立?Y送条件参数N分支程序1分支程序3开始分支程序2条件2成立?NY顺序程序2结束顺序程序12、按分支号转移,使用散转指令JMP@A+DPTR(1)转向地址表法:DW(2)转向地址偏移量表法:DB(3)查表与RET指令结合MOVC和RET(4)转移指令表法:LJMP或AJMP1、多次使用条件转移指令,形成两个以上判断框。CJNE指令和JC、JNC有机配合JB、JNB、JBCJZ、JNZ1、多次使用条件转移指令,形成两个以上判断框。例求符号函数Y=SGN(X)

输入X存入40H,输出Y存入41H中

+1当X>0Y= SGN(X)=0当X=0 -1当X<0X=0?Y取XNA=0A=+1开始A=-1X<0?NY保存Y←A结束求符号函数流程图SYMB:MOVA,40H ;取X JZ STOR ;X=0,Y=X JB ACC.7,MINUS;X<0 MOVA,#1 ;X>0,Y=+1STOR:MOV41H,A ;保存Y RETMINUS:MOVA,#0FFH ;X<0,Y=-1 SJMPSTOR要点:将流程图按条件NO优先方式拉直在流程图汇合处和转移目的地址处加标号比较内部RAMData1和Data2单元内以补码形式表示的带符号数,并将大数存入BIG单元,小数存入SMALL单元,若相等,则建立起标志位F0Data1 EQU 40hData2 EQU 41hBIG EQU 30HSMALL EQU 31H ORG 0000HCOM2: MOV A,Data1 XRL A,Data2 JNZ STEP1 ;两数不等,转STEP1 SETB F0 ;两数相等,F0置位

RETSTEP1: JB ACC.7,TEST;两数异号,转TEST XRL A,Data2 ;两数同号,恢复Data1 SUBB A,Data2 ;比较

JC STEP3;Data1小,转STEP3STEP2: MOV BIG,Data1;Data1大

MOV SMALL,Data2 RETTEST: XRL A,Data2 ;恢复Data1 JNB ACC.7,STEP2;Data1为正,大,转STEP2STEP3: MOV SMALL,Data1 MOV BIG,41H RET【例4-6】带符号数的比较:

XRL指令和JNZ、JB、JNC有机配合不相等?Y取Data1和Data2N设置标志F0开始异号?NY结束带符号数的比较流程图Data1存入SMALLData2存入BIG结束结束Data1小?NYData1存入BIGData2存入SMALLData1正?NY分支号R2=0,程序转移到PROG0处;当分支号R2=1,程序转移到PROG1处;…当分支号R2=n,程序转移到PROGn处。【例4-7】散转程序:使用JMP实现多分支程序转移

ORG 0000H MOV DPTR,#TAB ;取转移地址表首地址

MOV A,R2 ;取变量值

ADD A,R2 ;对变量乘2修正

JMP @A+DPTRTAB: AJMP PROG0 AJMP PROG1 … AJMP PROGn-1 AJMP PROGn行李计价: 当G≤5,M=G×3;

当G>5,M=G×3+(G-5)×(5-3)FRT:MOVA,40H ;取行李重量计价单位kg MOVR3,A MOVB,#03H ;M=G×3 MULAB MOVR2,A ;暂存3G MOVA,R3 ;取回G CJNEA,#05H,L1;G≤5?WETC:MOV41H,R2 ;存结果M RET L1:JC WETC ;是,转至WETC SUBBA,#05H ;否则M=3G+2(G-5) RLC A ADDA,R2 MOVR2,A SJMPWETC例:某车站托运行李,规定重量不超过5kg,每公斤按3元计价,若超过5kg,其超重部分每公斤加收2元。试编制程序,当行李重量为G时,计算托运费MG≠5?NM=G×3Y存MG≤5?NYM=3G+2(G-5)CJNE指令和JC、JNC有机配合2、按分支号转移如:分支号A=0,程序转移到ADDR0处;当分支号A=1,程序转移到ADDR1处;…当分支号A=n,程序转移到ADDRn处。(1)、(3)用转向地址表法。由PUSH同RET指令配合;

设分支号已存入A。MTJS:MOVDPTR,#TAB;取表首地址

CLRC ;分支号×2

RLCA JNCLOW ;若A≤127,则转移

INCDPH ;若A>127,则DPTR加256LOW:MOVR2,A ;修正值送R2保存

MOVCA,@A+DPTR;取分支地址高8位

XCHA,R2 ;A<—>R2 INCA

MOVCA,@A+DPTR;取分支地址低八位

PUSHACC ;分支地址低八位入栈保存

MOVA,R2

PUSHACC ;分支地址高8位入栈保存

RET

;分支地址→PC,转移TAB:DW ADDR0 ;分支转移地址表

DW ADDR1 ;高字节地址,低字节地址

… ADDR0: … ;程序段0…A=?0处理一处理二处理…1n2、按分支号转移JMP4:movR2,#1movDPTR,#TBL4movA,R2addA,R2jncNADDincDPHNADD:movR3,AmovcA,@A+DPTRxchA,R3incAmovcA,@A+DPTRmovDPL,AmovDPH,R3clrA

jmp@A+DPTR(1)用转向地址表法。设分支号已存入R2,使用movcA,@A+DPTR和jmp@A+DPTR散转指令配合。TBL4:DWPRG0DWPRG1DWPRG2DWPRG3PRG0:movR0,#0sjmpHaltPRG1:movR0,#1sjmpHaltPRG2:movR0,#2sjmpHaltPRG3:movR0,#3Halt:sjmp$(2)用地址偏移量表法。

巧妙利用JMP@A+DPTR和MOVCA,@A+DPTR两条指令配合;

设R7=分支号MTJS:MOVDPTR,#TAB;指向表首地址

MOVA,R7;分支号送AMOVCA,@A+DPTR;查表内容送A

JMP@A+DPTR;实现多分支转移TAB:DBADDR0-TAB;地址偏移量表

DBADDR1-TAB … DBADDRn-TABADDR0: … ;程序段0…ADDR1: … ;程序段1……ADDR n: … ;程序段n…A=?0处理一处理二处理…1nPC=DPTR+A=TAB+ADDRn-TAB=ADDRn(4)转移指令表法。用分支转移指令JMP@A+DPTR。设R7R6=分支号MTJS:MOVDPTR,#TAB;指向表首地址

MOVA,R7;分支号高字节×3 MOVB,#03H MULAB ;乘积不超过1字节

ADDA,DPH MOVDPH,A MOVA,R6;分支号低字节×3

MOVB,#03H MULAB XCHA,B

ADDA,DPH;DPH←DPH+((R7、R6)×3)高字节

MOVDPH,A XCHA,B ;A←((R7、R6)×3)低字节

JMP@A+DPTR;实现多分支转移TAB:LJMPADDR0;转移指令表

LJMPADDR1 … LJMPADDRNADDR0: … ;程序段0…

…ADDR1: … ;程序段1…A+DPTR←TAB+R7R6×3DPTR←TABJMP@A+DPTRLJMPROUT0LJMPROUT1LJMPROUTnR6R73×DPLDPHA+A0ABTABLTABH4-2-3循环结构程序设计主要特点:大大缩短程序,减少占用程序空间;程序结构优化,清晰易读,循环结构使程序紧凑;可以实现多重循环控制,循环嵌套;循环程序主要由循环常数初始化部分、循环体、结束部分三部分组成一、循环程序的构成二、单重循环程序三、多重循环程序一、循环程序的构成

循环控制?循环执行循环结束循环初始化YN一.初始化部分循环准备工作。如:清结果单元、设指针、设循环控制变量初值等。二.循环体循环执行部分:需多次重复处理的工作。循环控制部分:

1.修改指针和循环控制变量。

2.检测循环条件:满足循环条件,继续循环,否则退出循环。三.结束部分分析、处理和保存循环结果。至少1次循环的循环结构:选用先执行后判断的循环结构。允许0次循环的循环结构:选用先判断后执行的循环结构。二、单重循环程序

简单循环结构:循环体中不套循环。【例4-8】

:计算1+2+…+10的和并保存在内RAM的Y单元Y

EQU 20H

ORG 0000H

CLR A ;清部分和

MOV R0,#01 ;置累计初值LOOP:CJNE R0,#11,AD ;判断是否完成

MOV Y,A ;保存结果

RET ;结束AD: ADD A,R0 ;计算部分和

INC R0 ;修改循环计数器

SJMP LOOP ;循环设有一组数存放在内RAM从DATA开始的连续单元中,数据长度放在DATA1单元中,使编写程序找出其中的最大数,并存入DATA2单元Data2 EQU 40HData1 EQU 41HData EQU 42H

ORG

0000H

MOV R0,#Data

;设置地址指针,并指向存放数据的起始单元

MOV Data2,@R0 ;将第一个数当作当前最大数

DEC

Data1 ;修改剩余的数据个数NEXT: INC R0 ;指向下一个数据单元

MOV A,@R0 ;取当前数据

CJNE A,Data2,COMP;比较当前数与当前最大数COMP: JC CON ;若当前数小于当前最大数,则继续。

MOV Data2,A ;否则,把当前数当作最大数CON: DJNZ Data1,NEXT ;判断数据是否比较完毕 RET ;比较结束【例4-9】

:求最大数

三、多重循环程序

内循环控制?循环工作循环结束外循环控制?内循环初始化开始外循环初始化注意循环嵌套允许外重循环嵌套内重循环循环体不能交叉不能从循环程序外部跳入循环程序内部【例4-10】软件延时程序

1s延时程序(设时钟f=12MHz,T=1μs)DEL1s: MOV R3,#10 ;单周期,1TDEL1: MOV R4,#200 ;单周期,1TDEL2: MOV R5,#248 ;单周期,1TDEL3: DJNZ R5,DEL3 ;双周期,2T NOP ;单周期,1T DJNZ R4,DEL2 ;双周期,2T DJNZ R3,DEL1 ;双周期,2T RET ;双周期,2Tt=((((2T×248)+4T)×200+3T)×10+3T)×1μs=1000033μs≈1s1、什么叫程序设计?程序设计:就是人们把欲解决问题的算法和步骤用计算机能接受的语言描述出来的过程复习提问问题分析算法确定步骤写出流程图画出源程序编制目标程序汇编程序存储器编程人解决问题计算机解决问题复习提问2、汇编语言程序的四种基本结构是什么?顺序结构:按编写的先后顺序执行、PC自动加1分支结构:含有转移类指令、具有判断决策能力循环结构:重复执行某段程序子程序结构:具有特定功能的独立程序段

4-2-4子程序结构程序设计子程序:能完成某项特定功能的独立程序段,可被反复调用。

具有通用性、完整性和独立性.一、子程序结构三、子程序参数传递二、子程序的调用与返回…CALLS…CALLS…调用程序或主程序RET………被调用程序或子程序S1.提供足够的调用信息:如:子程序名、子程序功能、入口参数和出口参数、子程序占用的硬件资源、子程序中调用的其他子程序名。2.子程序第一条指令必须为标号标号作为子程序入口地址作为子程序名供主程序调用3.子程序最后一条指令必须为RET(I)恢复断点,返回主程序,一、子程序结构

标准子程序的格式:

;子程序名 ;子程序功能: ;入口参数: ;出口参数: ;占用资源:;调用的其他子程序名子程序名:. ;

..RET(I)入口参数:调用子程序之前,需要主程序传给子程序的参数。出口参数:子程序送回给主调程序的结果参数。1、调用子程序之前:设置好堆栈,配好入口参数。2、主程序通过调用指令:ACALL、LCALL进入子程序注意现场的保护

PUSHPSW、A、B、改变R组执行子程序操作——嵌套:注意嵌套深度与堆栈区大小的问题注意现场的恢复

POPB、A、PSW3、子程序用返回指令RET(I)结束子程序并保证堆栈栈顶为调用程序的返回地址。二、子程序的调用与返回注意防止自然进入子程序和自然退出子程序CPU正在执行子程序SubACPU正在执行子程序SubB正在执行主程序入口参数传递无参数传递:主程序和子程序之间不需要参数传递通过寄存器传递主程序将参数存入A、Rn、DPTR子程序从A、Rn、DPTR中取参数通过地址传递主程序将参数存入RAM的单元中子程序从RAM的单元中取参数通常用R0、R1、DPTR的间接寻址通过堆栈传递主程序用PUSH将参数压入堆栈;子程序按堆栈指针来间接访问参数三、子程序参数传递

主程序

子程序出口参数传递无参数传递:通过寄存器传递通过地址传递通过堆栈传递通过寄存器和地址传递方法简单、通用性强例:

ORG0000HMain:MOVSP,#30HMOVR0,#40hMOVR7,#10HLCALLZeroSJMP$;子程序名:Zero;功能:对内部数据区清零;入口参数:R0

内部数据区首地址;R7

内部数据区长度;出口参数:无;占用资源:R0,R7;调用的其他子程序名:无Zero:pushA;现场的保护

clrALoop:mov@R0,AincR0djnz,R7,Loop POPA;现场的恢复

ret【例4-11】通过寄存器传递试编程计算y=a12+a22+……+a102;ai存放在内RAM20H单元中且小于10,结果按高低顺序存放在R2、R3中。循环控制?循环执行循环结束循环初始化YN开始建立栈底SP←#60H设置数据指针R0←#20H设置循环计数器R7←#10结果单元清零R2、R3←#0A←取ai=@R0A←调用子程序SQRT计算ai2R3←A+部分和低字节R3R2←C+部分和高字节R2修改数据指针指向下一数据单元R0←

R0+1计数器R7-1≠0?YN结束开始堆栈初始化循环初始化取ai调用子程序计算ai2计算∑ai2存入结果单元循环控制?YN结束【例4-11】通过寄存器传递 ORG 0000HMAIN: MOV SP,#60H;堆栈初始化

MOV R0,#20H;设置数据指针

MOV R7,#10 ;设置循环计数器

MOV R3,#00H;清结果低字节单元

MOV R2,#00H;清结果高字节单元NEXT: MOV A,@R0 ;取数据

ACALL SQRT ;调用求平方数子程序

ADD A,R3 ;平方部分和

MOV R3,A ;保存低字节

CLR A ;部分和高字节加

ADDC A,R2 ;部分和低字节产生的进位

MOV R2,A;保存高字节

INC R0 ;指向下一个数据单元

DJNZ R7,NEXT;未完,继续

SJMP $试编程计算y=a12+a22+……+a102;ai存放在内RAM20H单元中且小于10,结果按高低顺序存放在R2、R3中。开始建立栈底SP←#60H设置数据指针R0←#20H设置循环计数器R7←#10结果单元清零R2、R3←#0A←取ai=@R0A←调用子程序SQRT计算ai2R3←A+部分和低字节R3R2←C+部分和高字节R2修改数据指针指向下一数据单元R0←

R0+1计数器R7-1≠0?YN结束【例4-11】通过寄存器传递试编程计算y=a12+a22+……+a102;ai存放在内RAM20H单元中且小于10,结果按高低顺序存放在R2、R3中。;子程序名:SQRT;功能:求A平方的子程序;入口参数:A;出口参数:A;占用资源:DPTR;调用的其他子程序名:无SQRT:MOV DPTR,#TAB ;取平方表首地址

MOVC A,@A+DPTR ;查平方表

RET ;子程序返回TAB: DB0,1,4,9,16,25,36,49,64,81,100 END【例4-10】通过堆栈传递参数码制转换2:将内RAM20H单元中十六进制数转换为两位ASCII,结果高低顺序存入21H与22H单元。54PCLPCHSP→34SP→SP→34 ORG 0000HMAIN: MOV SP,#60H;设置堆栈初值

MOV A,20H ;取被转换的16进制数

SWAP A ;交换位置,以便对高位进行转换

PUSH ACC ;压入堆栈

ACALL HEXASC;调用转换子程序,对高位进行转换

POP 21H ;从堆栈中取出转换结果

PUSH 20H ;将将原数据压入堆栈

ACALL HEXASC;调用转换子程序,对低位进行转换

POP 22H ;从堆栈中取出转换结果

SJMP $ ;转换结束,等待HEXASC: MOV R1,SP ;转移堆栈指针,因SP不可修改

DEC R1 ;下移指针,以便指向被转换数据单元

DEC R1 MOV A,@R1 ;从栈区中取出被转换数据

ANL A,#0FH ;屏蔽高半字节,只对低半字节转换

ADD A,#02H ;修正查表指针

MOVC A,@A+PC;查ASCII表

MOV @R1,A ;保存转换结果到栈区

RET ;转换子程序返回TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H END4.3汇编语言的编辑与汇编4.3.1、汇编语言源程序的编辑4.3.2、源程序的汇编4.3.1、汇编语言源程序的编辑源程序的编写要依据8051汇编语言的基本规则(指令系统),特别要用好常用的汇编命令(即伪指令),例如下面的程

温馨提示

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

评论

0/150

提交评论