汇编语言程序设计方法_第1页
汇编语言程序设计方法_第2页
汇编语言程序设计方法_第3页
汇编语言程序设计方法_第4页
汇编语言程序设计方法_第5页
已阅读5页,还剩42页未读, 继续免费阅读

下载本文档

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

文档简介

3.4汇编语言程序设计方法3.4.1汇编程序约定3.4.2汇编程序设计步骤3.4.3顺序程序3.4.4

分支程序3.4.5循环程序3.4.6

算术运算程序2023/1/151

3.4.1汇编程序约定汇编语言程序:用汇编语言编写的、完成特定功能的指令序列。汇编程序:

能将汇编语言源程序转换成机器语言目标程序的系统软件。

汇编语言程序到机器语言程序的转换过程称为汇编。1、手工汇编:人工查指令表汇编。用于设计短小程序或调试程序的场合。2、机器汇编:用汇编程序进行汇编。2023/1/152源程序使用机器汇编要考虑汇编程序的约定:1)按指令格式和语法规则编写程序。常数的表示: 十进制数:20 十六进制数:87H,0F0H

二进制数:01011001B

字符: ‘H’

字符串: “Hello”。

2)使用伪指令提供汇编信息。2023/1/153汇编的主要任务:1)确定程序中每条汇编语言指令的指令机器码。2)确定每条指令在存储器中的存放地址。3)提供错误信息。 4)提供目标执行文件(*.OBJ/*.HEX)和列表文件(*.LST)。一、汇编语言指令类型:

1.机器指令:

指令系统中的全部指令,每条指令有对应的机器代码。2.伪指令:

汇编控制指令,仅提供汇编信息,没有指令代码。2023/1/1543.4.2汇编语言程序设计步骤一、确定方案和计算方法;二、了解应用系统的硬件配置、性能指标;三、建立系统数学模型,确定控制算法和操作步骤;四、画程序流程图;表示程序结构和程序功能。五、编制源程序。1.合理分配存储器单元和了解I/O接口地址。2.按功能设计程序,明确各程序之间的相互关系。3.用注释行说明程序,便于阅读、修改和调试。六、程序的调试2023/1/155流程图符号和说明:

将CPU要执行的操作写在一个个框内,并以一定的次序,用带方向箭头的直线把这些框连接起来,指示出CPU的操作过程。此方框图结构称程序框图或程序流程图。

2023/1/156常用程序结构:3.4.3顺序程序顺序程序按顺序依次执行的程序,又称简单程序。程序走向只有一条路径,是复杂程序结构的基础。例:双字节变补程序(设数据在R4R5中): MOV A,R5

;取低字节 CPL A ADD A,#01H ;低字节变补 MOV R5,A MOV A,R4

;取高字节 CPL A ADDCA,#80H ;高字节变补 MOV R4,A

顺序程序、分支程序、循环程序、公用子程序。

2023/1/157举例(顺序)[例3.4.1]

三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、54H和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。低字节低字节中字节中字节高字节高字节高字节高字节低字节低字节R0→R1→2023/1/158MOV R0,#52HMOV R1,#55HMOV A,@R0ADD A,@R1MOV @R0,ADEC R0DEC R1MOV A,@R0ADDC A,@R1MOV @R0,ADEC R0DEC R1MOV A,@R0ADDC A,@R1MOV @R0,ACLR AADDC A,#00HMOV 00H,C;被加数的低字节地址;加数的低字节地址;低字节相加;存低字节相加结果;中间字节带进位相加;存中间字节相加结果;高字节带进位相加;存高字节相加结果;存放进位的单元地址;进位送00H位保存程序:MOV C,ACC.0MOV 00H,CMOV R0,#20HMOV @R0,A2023/1/159例3.4.2将R2中BCD码数转为二进制数存进R2。

ORG2000HBCD2B:MOVA,R2;取入口数据

ANLA,#0F0H;取出十位

SWAPA;高4位低4位

MOVB,#0AHMULAB;十位乘10MOVR3,A;积暂存进R3MOVA,R2;再取入口数据

ANLA,#0FH;取出个位

ADDA,R3MOVR2,A;结果R2RET;若不是子程序可用END2023/1/1510[例3.4.3]

压缩式BCD码分解成为单字节BCD码。MOV R0,#40H ;设指针MOV A,@R0

;取一个字节MOV R2,A ;暂存ANL A,#0FH ;高半字节清0INC R0MOV @R0,A ;保存数据个位MOV A,R2SWAPA ;十位换到低半字节ANL A,#0FHINC R0MOV @R0,A ;保存数据十位十个2023/1/15113.4.4 分支程序

根据不同条件转向不同的处理程序,这种结构的程序称为分支程序。

80C51指令系统中的条件转移指令、比较转移指令和位转移指令,可以实现分支程序。由条件转移指令构成程序判断框部分,形成程序分支结构。2023/1/1512

3.4.4.1单重分支程序一个判断决策框,程序有两条出路。两种分支结构:

[例3.4.4]

求R2中补码绝对值:正数不变,负数变补。

MOVA,R2 JNBACC.7,NEXT;为正数?为0跳

CPLA ;负数变补

INCA MOVR2,ANEXT:SJMPNEXT;结束2023/1/1513[例3.4.5]

假定在外部RAM中有ST1、ST2和ST3共3个连续单元,其中ST1和ST2单元中分别存放着一个8位无符号二进制数,要求找出其中的大数并存入ST3单元中。START:CLRC MOVDPTR,#ST1MOVXA,@DPTRMOVR2,AINCDPTR MOVXA,@DPTRSUBBA,R2JNCBIG1XCHA,R2BIG0:INCDPTRMOVX@DPTR,ARETBIG1:MOVXA,@DPTRSJMPBIG0;进位位清“0”;设置数据指针,指向ST1;取第一个数;第一个数存R2;数据指针加1,指向ST2;取第二个数;两数比较(第二个数-第一个数);第二个数大转BIG1(C=0无借位跳);第一个数大整字节交换继续;指向ST3单元;存大数2023/1/1514[例3.4.6]

将ASCII码转换为十六进制数。设ASCII码放在累加器A中,转换结果放到B中。解:由ASCII码表(表1-4)可知,30H~39H为0~9的ASCII码,41H~46H为A~F的ASCII码。将ASCII码减30H(0~9)或37H(A~F)就可获得对应的十六进制数。程序如下:2023/1/1515[例3.4.7]FRT:MOVA,40H ;取行李重量计价单位G MOVR3,A MOVB,#03H ;M=G×3 MULAB MOVR2,A ;暂存3G MOVA,R3

;取回G CJNEA,#05H,L1;G=5?G≠5跳L1 SJMPWETC L1:JCWETC ;是,转至WETC(C=1即G<5跳) SUBBA,#05H ;否则M=3G+2(G-5)

RLCA ADDA,R2

SJMPL2WETC:MOVA,R2L2:MOV41H,A ;存结果M RETG=5?=:跳WETC

≠:G<5:跳WETC

G>5:顺序执行行李计价:当G≤5,M=G×3;

当G>5,M=G×3+(G-5)×(5-3)。2023/1/15163.4.4.2多重分支程序[例3.4.8]:求符号函数Y=SGN(X)+1(当X>0)SGN(X)=0(当X=0)-1(当X<0)SYMB:MOVA,40H ;取X JZ STOR ;X=0跳,Y=X JB ACC.7,MINUS;X<0(A.7=1跳)MOVA,#01H ;X>0,Y=+1SJMPSTORMINUS:MOVA,#0FFH

;X<0,Y=-1STOR:MOV41H,A ;保存YRET一、多次使用条件转移指令,形成两个以上判断框。2023/1/1517温控系统结构框图电热箱采用电热丝加热,由双向可控硅控制加热量的大小;温度传感器检测电热箱内的温度,经放大与A/D转换后进入单片机;单片机将设定的温度值与检测到的电热箱中的实际温度进行比较,并调节运算后,发出控制信号经光电隔离器去驱动双向可控硅以调节加在电热丝的电压,从而控制电热箱的温度。电热箱单片机温控系统结构框图2023/1/1518举例(多分支)[例3.4.9]

某温度控制系统,采集的温度值(Ta)放在累加器A中。此外,在内部RAM54H单元存放控制温度下限值(T54),在55H单元存放控制温度上限值(T55)。若Ta>T55,程序转向JW(降温处理子程序);

若Ta<T54,则程序转向SW(升温处理子程序);

若T55≥Ta≥T54,则程序转向FH(返回主程序)。

=:去FH思路:Ta=T55?≠:Ta>T55:去JW

Ta<T55:Ta=T54?=:去FH

≠:Ta<T54:去SW

Ta>T54:去FH算法:(1)Ta>T55:去JW(2)Ta<T54:去SW(3)T55≥Ta≥T54:去FH2023/1/1519程序:

CJNEA,55H,LOOP1 AJMPFHLOOP1:JNCJWCJNEA,54H,LOOP2AJMPFHLOOP2:JCSWFH:RET;Ta

≠T55:转向LOOP1;Ta=T55:返回;若CY=0,表明Ta>T55,转降温处理程序;Ta

≠T54:转向LOOP2;Ta=T54:返回;若CY=1,表明Ta<T54,转升温处理程序;T55≥Ta≥T54,返回主程序若Ta>T55,程序转向JW(降温处理子程序);若Ta<T54,则程序转向SW(升温处理子程序);若T55≥Ta≥T54,则程序转向FH(返回主程序)。2023/1/1520①S0单独按下,红灯亮,其余灯灭;②S1单独按下,绿灯亮,其余灯灭;③其余情况,黄灯亮。[例3.4.10]已知电路如图4-5所示,要求实现:2023/1/1521解:程序如下SGNL:ANLP1,#11100011B;

ORLP1,#00000011B;

SL0:JNBP1.0,SL1 ;JNBP1.1,RED ;YELW:SETBP1.4 ;

CLRP1.2 ;

CLRP1.3 ;

SJMPSL0 ;SL1:JNBP1.1,YELW;GREN:SETBP1.3 ;

CLRP1.2 ;

CLRP1.4 ;

SJMPSL0 ;

RED:SETBP1.2 ;

CLRP1.3 ;绿灯灭

CLRP1.4 ;黄灯灭

SJMPSL0 ;转循环

2023/1/1522解:程序如下SGNL:ANLP1,#11100011B;红绿黄灯灭

ORLP1,#00000011B;置P1.0、P1.1输入态,P1.5~P1.7状态不变SL0:JNBP1.0,SL1 ;P1.0=0,S0未按下,转判S1JNBP1.1,RED ;P1.0=1,S0按下;且P1.1=0,S1未按下,转红灯亮YELW:SETBP1.4 ;黄灯亮

CLRP1.2 ;红灯灭

CLRP1.3 ;绿灯灭

SJMPSL0 ;转循环SL1:JNBP1.1,YELW;P1.0=0,S0未按下;P1.1=0,S1未按下,转黄灯亮GREN:SETBP1.3 ;绿灯亮

CLRP1.2 ;红灯灭

CLRP1.4 ;黄灯灭

SJMPSL0 ;转循环RED:SETBP1.2 ;红灯亮

CLRP1.3 ;绿灯灭

CLRP1.4 ;黄灯灭

SJMPSL0 ;转循环

2023/1/1523二、按分支号转移如:当分支号=0,程序转移到ADDR0处;当分支号=1,程序转移到ADDR1处;…。[例3.4.11]有BR0、BR1、BR2和BR3共4个分支程序段,各分支程序段的功能依次是从内部RAM256B范围取数、从外部RAM低256B范围取数、从外部RAM4KB范围取数和从外部RAM64KB范围取数。并假定R0

中存放取数地址低8位地址,R1中存放高8位地址,R3中存放分支序号值。假定以BRTAB作差值表首地址,BR0_BRTAB~BR3_BRTAB为差值。

分析:差值=分支入口地址-该表首址1、利用查地址表法:2023/1/1524

MOV A,R3 MOV DPTR,#BRTAB MOVC A,@A+DPTR JMP @A+DPTRBRTAB: DB BR0_BRTAB DB BR1_BRTAB DB BR2_BRTAB DB BR3_BRTABBR0: MOV A,@R0 SJMP BREBR1: MOVX A,@R0 SJMP BREBR2: MOV A,R1 ANL A,#0FH ANL P2,#0F0H ORL P2,A MOVX A,@R0

SJMP BREBR3: MOV DPL,R0 MOV DPH,R1 MOVX A,@DPTRBRE:SJMP $;分支转移值送A(如R3=2);差值表首址(BRTAB=3000H);查表[A+DPTR=3002H,(A)=40H];转移(A+DPTR=3040H);差值表(=10H)(=20H)(=40H)(=60H);从内部RAM取数;从外部RAM256B取数;从外部RAM4KB取数;高位地址取低4位;清P2口低4位;发高位地址;从外部RAM64KB取数程序:入口地址:3010H3020H3040H3060H差值=分支入口地址-该表首址2023/1/1525例题(查转移指令表)[例3.4.12]假定键盘上有3个操作键,功能说明如下表: … MOV DPTR,#3000H CLR C RLC A JMP @A+DPTR AJMP DS AJMP XS AJMP CR …

3000H3001H3002H3003H3004H3005H3006H;3000H为基址;进位位CY清“0”;A带进位位循环左移;转操作键处理程序;转读数据程序;转写数据程序;转插入程序2、使用转移指令表法。用分支转移指令AJMP…对AJMP指令应将分支序号乘以2,转移范围为2KB;

对LJMP指令应将分支序号乘以3,转移范围为64KB。2023/1/1526

设分支号已存入A。把分支程序入口地址存放在表中。MTJS:MOVSP,#30H MOVDPTR,#TAB;取分支入口地址表首地址

CLRC ;分支号×2

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

PUSHA ;入栈保存

MOVA,R2 INCA MOVCA,@A+DPTR;取分支地址高位

PUSHA ;入栈保存RET ;分支地址→PC,转移TAB:DWADDR0

;分支程序入口地址表

DWADDR1

… ADDR0:… ;程序段0…ADDR1:… ;程序段1…ADDR2:… ;程序段2…3、利用堆栈操作法:如:DPTR=3000H

A=3※※★★★★※※★★※※※※★★PC2023/1/15273.4.5 循环程序3.4.5.1循环程序的构成各个环节任务:一、初始化部分:循环准备工作。如:清结果单元、设指针、设循环控制变量初值等。二、循环体:循环工作部分:需多次重复处理的工作。循环控制部分:

1.修改指针和循环控制变量。2.检测循环条件:满足循环条件,继续循环,否则退出循环。三、结束部分:

处理和保存循环结果。允许0次循环的循环结构:在循环工作之前检测循环条件。包含多次重复执行的程序段,循环结构使程序紧凑。2023/1/15283.4.5.2单重循环简单循环结构:循环体中不套循环。循环控制方法: 计数控制; 特征标志控制。一、计数控制设循环计数器,控制循环次数。正计数和倒计数两种方式。2023/1/1529例:求n个单字节数据的累加,设数据串已在43H起始单元,数据串长度在42H单元,累加和不超过2个字节。SUM: MOV R0,#42H ;设指针 MOV A,@R0 MOV R2,A ;循环计数器←n CLR A ;结果单元清0

MOV R3,AADD1:INC R0

;修改指针 ADD A,@R0

;累加

JNCNEXT ;处理进位(C=0跳)

INC R3

;有进位,高字节加1NEXT:DJNZ R2,ADD1 ;循环控制:数据是否加完?

MOV 40H,A ;循环结束,保存结果

MOV 41H,R3 RETR0→2023/1/1530

例:为一串7位ASCII码数据的D7位加上奇校验,设数据存放在片外RAM的2101H起始单元,数据长度在2100H单元。MOVDPTR,#2100HMOVXA,@DPTRMOVR2,ANEXT:INCDPTRMOVXA,@DPTRORLA,#80HJNBP,PASS;P=0:1的个数为偶数,跳MOVX@DPTR,APASS:DJNZR2,NEXTDONE:SJMPDONE2023/1/1531

二、特征控制例:找正数表中最小值。正数表存在片外RAM中以LIST为起始单元,用-1作为结束标志。START:MOVDPTR,#LIST ;数表首地址

MOVB,#127 ;预置最小值NEXT:MOVXA,@DPTR ;取数INCDPTR ;修改指针

CJNEA,#-1,NEXT1 ;是否为数表结尾?(A≠-1跳)

SJMPDONE ;循环结束NEXT1:CJNEA,B,NEXT2 ;比较(A≠B跳)NEXT2:JNCNEXT ;C=0跳MOVB,A ;保存较小值

SJMPNEXTDONE:SJMPDONE习题:统计一个班考试为100分和不及格人数,成绩单在41H起始单元。设定循环结束标志实现循环控制。2023/1/15323.4.5.3多重循环例:将内存连续单元中无符号数按升序排序。步骤:每次取相邻单元的两个数比较,决定是否需要交换数据位置。第一次循环,比较N-1次,取到数据表中最大值。第二次循环,比较N-2次,取到次大值。…第N-1次循环:比较一次,排序结束。1循环体中套循环结构。以双重循环使用较多。2023/1/1533SORT:MOV A,#N-1 ;N个数据排序

MOV R4,A ;外循环次数LOOP1:MOV A,R4 MOV R3,A ;内循环次数

MOV R0,#TAB ;设数据指针LOOP2:MOV A,@R0

;取二数

MOV B,A INC R0 MOV A,@R0 CJNEA,B,L1 ;比较(A≠B跳)L1:JNC UNEX ;A≥B,不交换

DEC R0

;否则交换数据

XCH A,@R0 INC R0 MOV @R0,AUNEX:DJNZR3,LOOP2 ;内循环结束?

DJNZR4,LOOP1 ;外循环结束?

RET2023/1/1534(1)、单循环定时程序:

MOV

R5,#TIME LOOP:NOP

NOP

DJNZR5,LOOP2软件延时程序:1T1T1T2T设:fOSC=6MHz,则T=12/6MHz=2s

t=(1+4×TIME)×T=2+8×TIME=18(s)用循环程序将指令重复执行多次,实现软件延时。2023/1/1535试计算延时程序的执行时间。

源程序 指令周期(M)指令执行次数习题:DELAY:MOVR6,#100 1D1:MOVR7,#10 1D2:NOP 1

DJNZR7,D2 2t=6.606ms

DJNZR6,D1 2 RET 2计算延时程序的执行时间(设时钟fOSC=6MHz,T=2s

。DELAY:MOVR6,#64H(=100) 1 I1:MOVR7,#0FFH(=255) 1 I2:DJNZR7,I2 2 DJNZR6,I1 2 RET 2延时时间计算:(设时钟fOSC=12MHz)T=1st=(1×1+1×100+2×100×255+2×100+2×1)×T=51.303ms1100100×2551001(2)、多重循环定时:用循环程序将指令重复执行多次,实现较长时间的延时。2023/1/15363.4.6算术运算程序

3.4.6.1 多字节加减运算程序多字节加法子程序,Z=X+Y。ADDS:CLR CMOVR2,#23H

LOOP:MOV A,@R0 ADDC A,@R1

;加一字节

MOV @R0,A ;存和一字节

INC R0

;修改指针

INC R1 DJNZ R2,LOOP ;全部字节加完?

RET习题1:编写十进制多字节加法子程序,Z=X+Y。习题2:编写多字节减法子程序,Z=X-Y。思考题:修改程序使运算结果保存到其他存储单元。2023/1/15373.4.6.2 多字节无符号数乘除运算相加计算多字节乘法程序。步骤:1.部分积清零;2.从最低位开始检测乘数各位, 为1则部分积对位加被乘数,否则加0;3.对位方法:被乘数左移或部分积右移。

初值:

00~0

CyR4R5

→右移R6R7并检测Cy+R2R3

当Cy=1CyR4R5

得部分积并右移对位

乘积最后右移一次

110

×101

110 000 +110

11110

例:双字节相乘R2R3×R6R7®R4R5R6R7(参考P221四)解:部分积清零,右移检测乘数,决定部分积是否加被乘数,部分积右移对位。循环16次2023/1/1538无符号双字节快速乘法步骤:R2R3×R6R71.R3*R7;2.(R2*R7+R3*R6)*28(R2×R6)×216上述三项求和程序参考P223例6.62023/1/1539(参看P225[六无符号二进制除法程序])例:R2R3R4R5÷R6R7®R4R5(余数®R2R3)解:1.判断R2R3<R6R7?使商不大于16位。

2.被除数左移1位,试减除数。 3.若够减,商加1并保留余数。

101110101/01110100

0101 1001

01011000

0101

0110

0101 1

Cy←R2R3←R4R5←0 -R6R7+1够减116÷5=23…1

R2R3

不够减恢复余数循环16次相减计算多字节除法程序。步骤:1.对齐高位被除数试减除数。2.若够减商上1,不够减商上0且恢复余数。3.余数左移或除数右移对位。4.循环重复前3步,直至取够相应位数的商。

“四舍五入”:得到余数后,判断余数乘2后

是否大于除数,若大于除数则商再加“1”;否则不加。2023/1/15403.4.6.3码制数制转换程序(一)十六进制数转换为ASCII码;(二)ASCII码转换为十六进制数。0~9的ASCII码:30~39H;(一)十六进制数转换为ASCII码:HASC:CJNEA,#0AH,N

N:JNC N1(C=0跳N1)

ADD A,#30H SJMP SEN1:ADD A,#37HSE: RET

A~F的ASCII码:41~46H。2023/1/1541(三)BCD码与二进制数之间的转换

1.BCD码转换为二进制数:

D=dn-1×10n-1+dn-2×10n-2+…+d1×101+d0×100

=(((dn-1×10+dn-2)×10+dn-3)×10+…d1)×10+d0“整数十翻二”:从最高位开始,按二进制运算法则循环。“乘十加次低位”:B=B×10+bi

。R3←0R4←010×R3R4+(R0)R3R4R0←R0+1介绍乘法转换方式。2023/1/1542“整数二翻十”:从最高位开始,按十进制运算法则循环。“乘二加次低位”:D=D×2+di

。流程和程序见P235例6.152.二进制数转换为BCD码:

B=bn-1×2n-1+bn-2×2n-2+…+b1×21+b0×20

=(((bn-1×2+bn-2)×2+bn-3)×2+…b1)+b0补充参数传递:2023/1/1543[例4.11]在内部RAM的hex单元中存有2位十六进制数,试将其转换为ASCII码,并存放于asc和asc+1两个单元中。设(hex)=7BH

MOV SP,#3FHMAIN:PUSH hex ACALL HASC POP asc(SP=40H)

MOV A,hex SWAP A PUSH ACC ACALL HASC POP asc+1 子程序(HASC):HASC:DEC SP DEC SP POP ACC ANL A,#0FH

ADD A,#7(A=12H) MOVC A,@A+PC

PUSH ACC INC SP INC SP7个字节 RET(SP=40H)ASCTAB:DB “0,1,2,3,4,5,6,7” DB “8,9,A,B,C,D,E,F”;十六进制数进栈(SP=40H);调用转换子程序(SP=41H→42H);第一位转换结果送asc单元(SP=3FH);再取原十六进制数;高低半字节交换;交换后的十六进制数进栈(SP=40H);调用转换子程序(SP=4

温馨提示

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

评论

0/150

提交评论