第4章--汇编语言程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(3) 程序说明
① 判断两个有符号数符号异同的方法
本例中使用逻辑异或指令,将(X)与(Y)进行异或操作,那么,(X)的符号位 (X)7与(Y)的符号位(Y)7异或的结果如下: 若 (X)7 与 (Y)7 相同,则 (X)7(Y)7 = 0;若 (X)7 与 (Y)7 不相同,则 (X)7(Y)7 = 1。 本例中,(X)与(Y)的异或结果存放在累加器A中,因此判断ACC.7是否为零 即可知道两个数的符号相同与否。 ② 比较两个有符号数的其它方法。 除了本例中使用的比较两个有符号数的方法之外,我们还可以利用溢出标志 OV的状态来判断两个有符号数的大小。具体算法如下: 若X-Y为正数,则 OV=0 时 X>Y;OV=1 时X<Y。 若X-Y为负数,则 OV=0 时 X<Y;OV=1 时X>Y。
第4章 汇编语言程序设计
教学目的
(1) 了解汇编语言编程的基础知识。
(2) 了解汇编语言程序设计的基本步骤和方法。
(3) 了解汇编语言目标程序效率高、占存储空间少、运 行速度快、实时性强等特点。 (4) 掌握MCS-51汇编语言的顺序、分支、循环及子程 序的结构、设计。
本章重点与难点
分支程序、循环程序的设计 子程序的编写与应用
.
K1
+5V
多重单分支结构举例(散转程序)
开始 读P3口的引脚 状态→A 屏蔽掉A中无关位,并 将相应位移到最低位
修正A的值,A*2→A 转移指令表基地址 →DPTR 散转指令
显示方式1
显示方式2
显示方式3
显示方式4
结束
结束
结束
结束
多重单分支结构举例(散转程序)
多重单分支结构举例(散转程序)
程序说明
练习 编程将内部RAM的20H单元和30H单 元的内容互换. 程序如下: ORG 4000H START: MOV R0, #20H MOV A, @R0 MOV R1, #30H XCH A, @R1 MOV @R0, A SJMP $ END
练习
设变量放在片内RAM的60H单元,取值范围为 00H~09H,要求查出变量的平方值,并放入片内RAM的 61H单元. ORG 4000H START:MOV DPTR,#TAB MOV A,60H MOVC A,@A+DPTR MOV 61H,A SJMP $ TAB: DB 00,01,04,09,16 DB 25,26,49,64,81 END
多重单分支结构举例(散转程序)
例11 使用单片机的并行口P1的输出功能来控制8个LED的显 示。当开关K0接通2时,P3.4管脚接地,P3.4=0;当K0接通1 时,P3.4接+5V,P3.4=1。同样,当开关K1接通2时,P3.5管 脚接地,P3.5=0;当K1接通1时,P3.5接+5V,P3.5=1。 假设要求P3口的开关状态对应的P1口的8个LED的显示方式如 下: +5V P3.5 P3.4 显示方式 P1.0 0 0 全亮 89C51 8031 . 4.7K 1 K0 0 1 交叉亮 P3.4 . 1 0 低四位亮,高四位灭 2 +5V . . P3.5 2 1 1 低四位灭,高四位亮 4.7K 1 P1.7
(1)MCS-51的四个I/O端口共有三种操作方式:输出数据方 式,读端口数据方式和读端口引脚方式。 输出数据方式举例: MOV P1,#00H ;输出数据00H→P1端口锁存器→P1引脚 读端口数据方式举例: MOV A,P3 ;A←P3端口锁存器 读端口引脚方式举例: MOV P3,#0FFH ;P3口端口锁存器各位置1 MOV A,P3 ;A←P3端口引脚状态 注意:读引脚方式必须连续使用两条指令,首先必须使欲读的 端口引脚所对应的锁存器置位,然后再读引脚状态。
例4 字节加法程序 被加数在内部RAM的50H、51H、52H单元中;加数 在内部RAM 的53H、54H、55H单元中;相加之和存 放在50H、51H、52H单元中,进位位存放在位寻址区 的20H单元中。
MOV R0, #50H MOV R1, #53H MOV A, @R0 ADD A, @R1 MOV @R0, A INC R0 INC R1 MOV A, @R0 ADDC A, @R1 MOV @R0, A INC R0 INC R1 MOV A, @R0 ADDC A, @R1 MOV @R0, A CLR A ADDC A, #00H MOV R0, #20H MOV @R0, A END
SIGNFUC: MOV CJNE SJMP NZERO: JB MOV SJMP NEGT: MOV ZERO: MOV SJMP A, 40H A, #00H, NZERO ZERO ACC.7, NEGT A, #01H ZERO A, #0FFH 41H, A $
三分支程序分支结构举例
例10 两个有符号数比较 内部RAM的20H单元和30H单元各存放了一个8位有 符号数,请比较这两个数的大小,比较结果显示在实训实验板上。结果如下: 若(20H)=(30H),则P1.0管脚连接的LED发光; 若(20H)>(30H),则P1.1管脚连接的LED发光; 若(20H)<(30H),则P1.2管脚连接的LED发光。
单分支结构举例
例8 假定在外部RAM中有ST1、ST2和ST3共3个连续单元,其 中ST1和ST2单元中存放着两个无符号二进制数,要求找出其 中的大数并存入ST3单元中。程序如下: START:CLR C ;进位位清0 MOV DPTR, #ST1 ;设置数据指针 MOVX A, @DPTR ;取第1个数 MOV R2, A ;第1个数存于R2 INC DPTR ;数据指针加1 MOVX A, @DPTR ;取第2个数 SUBB A, R2 ;两数比较 JC BIG1 ;若第2个数大,则转向BIG1 MOVX A, @DPTR SJMP BIG0 BIG1: XCH A, R2 ;若第1个数大,则整字节交换 BIG0: INC DPTR MOVX @DPTR, A ;存大数 RET
(1) 题意分析
有符号数在计算机中的表示方式与无符号数是不相同的:正数以 原码形式表示,负数以补码形式表示,8位二进制数的补码所能表示的 数值范围为+127~-128。 计算机本身无法区分一串二进制码组成的数字是有符号数或无符号 数,也无法区分它是程序指令还是一个数据。编程员必须对程序中出 现的每一个数据的含义非常清楚,并按此选择相应的操作。例如,数 据FEH看作无符号数其值为254,看作有符号数为-2。
2000H A,30H A,#0FH A,#30H 31H,A A,30H A A,#0FH A,#30H 32H,A $
;取值 ;取低4位 ;转换成ASCII码 ;保存结果 ;取值 ;高4位与低4位互换 ;取低4位(原高4位) ;转换成ASCII码 ;保存结果
例2
设X、Y两个小于10的整数分别存于片内30H、31H 单元,试求两数的平方和并将结果存于32H单元。 ORG MOV MOV MUL MOV MOV MOV MUL ADD MOV SJMP END 2000H A,30H B,A AB R1,A A,31H B,A AB A,R1 32H,A $
例1
将30H单元内的两位BCD码拆开并转换成ASCII 码,存入RAM两个单元31H和32H中,高字节存32H。
开始
取数据低4位 转换成ASCII码 存ASCII码 取数据高4位 转换成ASCII码
存ASCII码
结束
ORG MOV ANL ADD MOV MOV SWAP ANL ADD MOV SJMP END
CY=1 Y
X<Y 点 P1.2 连 接的灯
X>Y 点 P1.1 连 接的灯
X=Y 点 P1.0 连 接的灯
X>Y 点 P1.1 连 接的灯
X<Y 点 P1.2 连 接的灯
结束
(2) 汇编语言源程序
X Y DATA 20H DATA 30H
ORG 0000H
MOV A,X XRL JB CJNE A,Y ;(X)与(Y)进行异或操作 ACC.7,NEXT1;累加器A的第7位为1,两数符号不同,转NEXT1 A,Y,NEQUAL;(X)≠(Y),转移到NEQUAL ;(X)=(Y),点亮P1.0连接的LED ;(X)<(Y),转移到XXY ;否则,(X)>(Y),转移到XDY
例5 乘法运算
设被乘数为16位无符号数,低8位存放在地址为K的单元,高8 位存放在地址为K+1的单元。乘数为8位无符号数,存放在M单 元。编程求出二者乘积,并将乘积的0~7位存放在R1,8~15 位存放在R2,16~23位存放在R3中。 16位无符号数与8位无符号数相 乘的步骤示意如下: MOV R0, #K ;设置被乘数地址指针 MOV A, @R0 ;被乘数送A中 MOV B, M ;乘数送B中 MOV R2, A ;乘 MUL AB ;(K)×(M) MOV R1, A ;乘积的0~7位存入R1 ;积的8~15位存入R2 MOV A, B MOV R2, B ;暂存积的8~15位 INC R0 ;指向被乘数高8位地址 ADDC A, #00H ;求 ;得乘积的16~23位 MOV A, @R0 ;取被乘数高8位 MOV R3, A ;乘; MOV B, M ;乘数送B中 积的16~23位存入R3 MUL AB ;(K+1)×(M) ADD A, R2 ;求得乘积的8~15位
三分支程序分支结构举例
比较两个有符号数X和Y大小要比无符号数麻烦得多。这里提供一种
比较思路:先判别两个有符号数X和Y的符号,如果X、Y两数符号相反,
则非负数大;如果X、Y两数符号相同,将两数相减,然后根据借位标志 CY进行判断。这一比较过程如图所示。
开始 X、Y 符号相同 Y X-Y Y N X=Y N Y X>=0 N N
开始 取数据X 求X 2 暂存X2 取数据Y 求Y2 求X2+Y2 保存平方和 结束
;取30H单元数据 ;将X送入B寄存器 ;求X2,结果在累加器中 ;将结果暂存于R1寄存器中 ;取31H单元数据 ;将Y送入B寄存器 ;求Y2,结果在累加器中 ;求X2+ Y2 ;保存数据 ;暂停
例3 将地址为2000H、 2001H、2002H 的片外数据存储 器单元的内容分 别传送到2002H、 2003H、2004H 存储单元中去。
MOV MOVX MOV MOVX MOV MOVX MOV MOVX MOV MOVX MOV MOVX SJMP $
DPTR, #2002H A, @DPTR DPTR, #2004H @DPTR, A DPTR, #2001H A, @DPTR DPTR, #2003H @DPTR, A DPTR, #2000H A, @DPTR DPTR, #2002H @DPTR, A
单分支转移结构举例
仅有两个出口,两者选一。 例6 求单字节有符号数的二进制补码 参考程序:
CMPT:JNB Acc.7,RETURN ;(A)>0,不需转换
MOV C,Acc.7 ;符号位保存
Hale Waihona Puke Baidu
CPL
ADD MOV
A
A,#1 Acc.7,C
;(A)求反,加1
;符号位存A的最高位
RETURN:RET
思考:该程序能否改进?
MOV A,X CLR P1.0 SJMP FINISH NEQUAL: JC XXY SJMP XDY NEXT1: MOV A,X
JNB ACC.7,XDY ;判断(X)的最高位D7,以确定其正负 XXY: CLR P1.2 ;(X)<(Y),点亮P1.2连接的LED SJMP FINISH XDY: CLR P1.1 ;(X)>(Y),点亮P1.1连接的LED FINISH: SJMP $ END
多重单分支结构举例
多重单分支结构,程序的判别部分有两个以上的 出口流向。 例9 求符号函数的值。 符号函数定义如下:
Y 1 0 1 当X 0 当X 0 当X 0
假定X存放在40H单元,Y存 放在41H单元。
多重单分支结构举例 假定X存放在40H单元,Y存放在41H单元。 程序如下:
单分支转移结构举例
仅有两个出口,两者选一。
例7 片内RAM ONE和TWO两个单元中存有两个无符号数 ,将两个数中的小者存入30H单元,大者存40H单元。
程序如下:
MOV A,ONE CJNE A,TWO,NEQ SJMP STORE NEQ: JC STORE MOV A,TWO MOV 40H, A STORE: MOV 30H,A SJMP $ END
相关文档
最新文档