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

因此, 因此,对例子中的存储器地址作如下运 算: SUM+2 CYCLE-5 NOT_DONE-GO 是有效的表达式。 是有效的表达式。而 SUM-CYCLE
(2)逻辑运算符 逻辑运算符是按位操作的AND、OR、 、 逻辑运算符是按位操作的 、 XOR和NOT。 和 。 1010 1010 1010 1010B AND 1100 1100 1100 1100B=1000 1000 1000 1000B 1100 1100 1100 1100B OR 1111 0000 1111 0000B=1111 1100 1111 1100B NOT 1111 1111 1111 1111B=0000 0000 0000 0000B
ASSUME CS:MY_CODE, ;规定 和DS 规定CS和 : 的内容 DS:MY_DATA : PORT_VA1 EQU 3 ;端口的符号名 GO: MOV AX, MY_DATA ;DS : 初始化为MY_DATA 初始化为 MOV DS, AX MOV SUM, 0 ;清SUM单元 单元
变量可以具有以下几种寻址方式: 变量可以具有以下几种寻址方式: ① 直接寻址 ② 基址寻址 变址(索引) ③ 变址(索引)寻址 ④ 基址变址寻址
2.运算符(Operators) .运算符( ) 算术运算符( Operators) ① 算术运算符(Arithmetic Operators) 逻辑运算符( Operators) ② 逻辑运算符(Logical Operators) 关系运算符( Operators) ③ 关系运算符(Relational Operators) 分析运算符( Operators) ④ 分析运算符(Analytic Operators) 合成运算符( Operators) ⑤ 合成运算符(Synthetic Operators)
第四章-汇编语言程序的设计

第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
第4章 汇编 语言程序设计

DJNZ R1,LOOP ;R1减1不为零,则跳LOOP处 NOP
HERE:SJMP
HERE
上述4个字段应该遵守的基本语法规则如下。
10
1.标号字段
语句所在地址的标志符号,才能被访问。如标号 “START”和“LOOP”等。有关标号规定如下: (1)标号后必须跟冒号“:”。 (2)标号由1~8个ASCII码字符组成,第一个字符必须是
8
汇编语言语句是符合典型的汇编语言的四分段格式:
标号字段 (LABLE) 操作码字段 (OPCODE) 操作数字段 (OPRAND) 注释字段 (COMMENT)
标号字段和操作码字段之间要有冒号“:”分隔; 操作码字段和操作数字段间的分界符是空格; 双操作数之间用逗号相隔;
操作数字段和注释字段之间的分界符用分号“;”。
表示的机器语言程序,才能识别和执行。
完成“翻译”的程序称为汇编程序。经汇编程序“汇编”得 到的以“0”、“1”代码形式表示的机器语言程序称为目标 程序。
5
优点:用汇编语言编写程序效率高,占用存储空间小,运行 速度快,能编写出最优化的程序, 缺点:可读性差,离不开具体的硬件,是面向“硬件”的语 言通用性差。 2.高级语言
功能是把P1.6的位地址赋给变量QA。
4.2
汇编语言源程序的汇编
“汇编”?汇编可分为手工汇编和机器汇编两类。
22
4.2.1
手工汇编
通过查指令的机器代码表(表3-2),逐个把助记符指令 “翻译”成机器代码,再进行调试和运行。 手工汇编遇到相对转移偏移量的计算时,较麻烦,易出 错,只有小程序或受条件限制时才使用。实际中,多采用“ 汇 编程序”来自动完成汇编。
16
重叠。例如:
ORG …… ORG …… ORG …… 2000H 2500H 3000H
单片机第4章汇编语言程序设计

4.2 伪指令
伪指令是在机器汇编中告诉汇编程序 如何汇编、对汇编过程进行控制的命令。 伪指令与汇编语言指令不同,只在源程序 中出现,不产生任何机器代码,在程序的 运行过程中不起作用,故称为“伪指令”。
处理 判断 连接
2.绘制程序流程图 简单的问题可由文字说明, 当问题复杂时,将文字说明的步骤以图形符号表示, 称流程图。
3.编写源程序 用汇编语言把流程图所表明的 步骤描述出来,实现流程图中每一框内的要求,从 而编制出一个有序的指令流,即汇编语言源程序。
4.汇编、调试 汇编语言是用指令助记符代替机 器码的编程语言,所编写的程序是不能在计算机上 直接执行的,因此利用它所编写的汇编语言程序必 须转换为单片机能执行的机器码形式的目标程序才 能运行,我们把这一过程称为汇编,进行汇编的程 序称为汇编程序。
4. 定义字伪指令DW
[标号:] DW 16位字数据表
该指令的功能与DB相似, 区别仅在于从指定地
址开始存放的是指令中的16位数据, 而不是字节串。
每个16位数据要占两个存储单元, 高8 位先存(低位
地址), 低 8 位后存(高位地址)。
1403H 3CH
ORG 1400H DATA1:DW 324AH,3CH
散转程序是分支程序的一种, 它可根据运算结果或输入数 据将程序转入不同的分支。MCS - 51 指令系统中有一条跳转指 令JMP@A+DPTR,用它可以很容易地实现散转功能。该指令 把累加器的8位无符号数与16位数据指针的内容相加, 并把相加 的结果装入程序计数器PC,控制程序转向目标地址去执行。
汇编程序设计

汇编程序设计汇编程序设计是一种底层的编程语言,它直接操作计算机的硬件资源,可以实现高效的程序运行。
汇编程序设计需要掌握计算机的底层结构和指令集,以及编程的基本思想和技巧。
在实际应用中,汇编程序设计常用于嵌入式系统、驱动程序、操作系统等领域。
汇编程序设计的基本思想是将高级语言编写的程序转换为机器语言,实现对计算机硬件资源的直接控制。
汇编程序设计需要掌握计算机的底层结构和指令集,以及编程的基本思想和技巧。
在实际应用中,汇编程序设计常用于嵌入式系统、驱动程序、操作系统等领域。
汇编程序设计的基本技巧包括寄存器的使用、内存的访问、指令的编写等。
寄存器是计算机中用于存储数据和指令的高速存储器,汇编程序设计中常用的寄存器包括通用寄存器、段寄存器、标志寄存器等。
内存是计算机中用于存储数据和程序的主要存储器,汇编程序设计中需要掌握内存的地址计算、数据的读写等操作。
指令是汇编程序设计的基本单位,汇编程序设计中需要掌握指令的格式、操作码、寻址方式等内容。
汇编程序设计的开发工具包括汇编器、调试器等。
汇编器是将汇编语言转换为机器语言的工具,常用的汇编器有MASM、NASM等。
调试器是用于调试程序的工具,常用的调试器有OllyDbg、GDB等。
在开发汇编程序时,需要使用这些工具进行编译、调试等操作。
汇编程序设计需要掌握计算机的底层结构和指令集,以及编程的基本思想和技巧。
在实际应用中,汇编程序设计常用于嵌入式系统、驱动程序、操作系统等领域。
汇编程序设计的基本思想是将高级语言编写的程序转换为机器语言,实现对计算机硬件资源的直接控制。
汇编程序设计的基本技巧包括寄存器的使用、内存的访问、指令的编写等。
汇编程序设计的开发工具包括汇编器、调试器等。
总之,汇编程序设计是一种底层的编程语言,需要掌握计算机的底层结构和指令集,以及编程的基本思想和技巧。
在实际应用中,汇编程序设计常用于嵌入式系统、驱动程序、操作系统等领域。
汇编程序设计的基本思想是将高级语言编写的程序转换为机器语言,实现对计算机硬件资源的直接控制。
汇编语言程序设计(第四版)第4章【课后答案】【精选】

汇编语言程序设计 第四版【课后习题答案】--囮裑為檤第4章 基本汇编语言程序设计〔习题4.1〕例题4.2如果要求算术右移8位,如何修改程序。
〔解答〕思路: 首先由最高位字节向次低位字节传送……次低位字节向最低位字节传送(共7次);再判最高位字节符号位,如为0,送00h 到最高位字节;如为1,送ffh 到最高位字节。
传送可参考例题4.2,不过应从第一号字节送第零号字节,……最高位字节向次低位字节传送;也可以用循环来完成: .model small .stack 256 .dataqvar dq 1234567887654321h .code .startup mov cx,7 mov si,1again: mov al, byte ptr qvar[si] mov byte ptr qvar[si-1],al inc siloop again test al,80h jz ezzmov bl,0ffh jmp done ezz: mov bl,0done: mov byte ptr qvar[7],bl .exit 0 end〔习题4.2〕例题4.2如果要求算术左移7位,如何用移位指令实现。
〔解答〕思路:可设计外循环体为8个字节左移一次,方法是:最低位字节算术左移一次, 次低位字节至最高位字节依次带 CF 位循环左移一次(内循环共8次),外循环体控制执行7次即可。
.model small .stack 256 .dataqvar dq 1234567887654321h4 11 201628.code.startupmov dx, 7 ;外循环次数mov ax, byte ptr qvar[0] ;最低位字节送axlpp: shl ax, 1 ;最低位字节左移一次,其d7移入CF 位 mov si, 1mov cx, 7 ;内循环次数again: rcl byte ptr qvar[si], 1 ;高位字节依次左移 P50 inc siloop again dec dx jnz lpp .exit 0 .end〔习题4.3〕将AX 寄存器中的16位数连续4位分成一组,共4组,然后把这4组数分别放在AL 、BL 、CL 和DL 寄存器中。
4-汇编程序设计

B+30HB B(21H)
A+30HA A(22H)
结束
A:高4位BCD码 B:低4位BCD码
周期数 源程序
ORG 2000H
1
MOV A,20H
2
MOV B,#10H ;除以10H
4
DIV AB
; 商->A,余数->B
2
ORL B,#30H ;高4位BCD码转换位ASCII码
2
MOV 21H,B
例3:排序程序设计。 若以30H为首地址的内部RAM中有7个连续存放的数
据,按由小到大的次序排好后存入这7个单元。
冒泡法排序基本思想: 是一种相邻数互换的排序方法。执行时从前向后依次 将相邻两单元的数进行比较,即第一个数与第二个数、 第二个数与第三个数……进行比较,如果符合从小到 大的顺序则不变动,否则将它们交换位置。如此反复 比较和交换,使小数向前移、大数向后移,直到数列 排好为止。
例2:将20H单元的压缩BCD码 低四位和高四位,分别拆成 两个ACSII码存入21H、22H单 元。
(BCD ASCII 码对照表)
20H
BCD
ASCII
21H
0
30H
22H
1
31H
2
32H
3
33H
…
…
9
39H
内部RAM
高
低
四
四
位
位
69 39 36
方法 1
开始
(20H)A
A取高四位,B取低四位
常用的伪指令
DW(Define Word) 从指定单元开始定义(存储)若干个字的数据 或ASCII码字符。
格式:DW 字常数或ASCII字符
第04章 汇编语言程序设计 39页 0.2M PPT版

MOV AL,10100000B OR 00000101B ;(AL)←10100101B
例4-4 关系运算符的应用
MOV AX,5 EQ 101B ;(AX)←0FFFFH
MOV BH,10H GT 16 ;(BH)←0
例4-5 数值返回运算符的应用
K1 DB 30H,31H,32H
K2 DW 4041H,4043H
(4)STACK
(5)MEMORY
(6)AT表达式
4. 类别名
返回
4.2.4 段寻址伪指令
格式:
ASSUME 段寄存器名:段名,段寄存器名:段名,……
例4-15 求从NUM开始的12个无符号字节数的和,结果放在SUM字单元中。
DATA SEGMENT NUM DB 95H,83H,36H,2DH DB 33H,22H,1AH,34H DB 62H,45H,75H,49H SUM DW ?
例4-13
STR1 DB ‘COMPUTER’ ;定义一个字符串,字符串的首地址为STR1 STR2 DW ‘AA’,‘BC’,‘DE’ ;给两个字符组成的字符串分配两个字节存储单元 DATA DW ?,?,? ;为DATA预留6个存储单元
例4-14
DATA1 DB 20 DUP(?) ;为变量DATA1分配20个字节的空间,初值为任意值 DATA2 DW ? ;为变量DATA2分配2个字节的空间,初值为任意值 DATA3 DB 20 DUP(30H) ;为变量DATA3分配20个字节的空间,初值均为30H
K3 DW 20H DUP(0)
K4 DD 50515253H
MOV AL,TYPE K1 ;等效于MOV AL,1
MOV AH,TYPE K2 ;等效于MOV AH,2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三、汇编语言程序的结构 1、程序设计的基本步骤 一般步骤为: (1)分析题意,明确要求; (2)建立思路,确定算法; (3)编制框图,绘出流程; (4)编写程序,上机调试; 显然,算法和流程是至关重要的。程序结构有简单顺序、 分支、循环和子程序等几种基本形式。 2、画流程图 画流程图是指用各种图形、符号、指向线等来说明程序 设计的过程。国际通用的图形和符号说明如下:
(1)利用DPTR作基址的参考程序如下 HEXASC: MOV DPTR, #TABLE MOV A, R2 ANL A, #0FH MOVC A, @A+DPTR ;查表 XCH R2, A ANL A, #0F0H SWAP A ; MOVC A, @A+DPTR ;查表 MOV R3, A RET TABLE: DB 30H,31H,32H,33H,34H ;ASCII表 DB 35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H,46H
4、汇编结束命令END 格式:[标号:] END 功能:END是汇编语言源程序的汇编结束标志,在它后面所 写的指令均不予处理。 5、等值命令EQU 格式:字符名称 EQU 数或汇编符号 功能:将一个数或特定的汇编符号赋予规定的字符名称。先 定义后使用。
6、数据地址赋值命令DATA 格式:字符名称 DATA 表达式 功能:将数据地址或代码地址赋予规定的字符名称
椭圆框:起止框,在程序的开始和结束时使用。 矩形框:处理框,表示要进行的各种操作。 菱形框:判断框,表示条件判断,以决定程序的流向。 指向线:流程线,表示程序执行的流向。 圆 圈:连接符,表示不同页之间的流程连接。 各种几何图形符号如下图所示。
§4-2 汇编语言程序的基本结构形式 一、简单程序的设计 例4-1 已知两个压缩BCD码分别 放在内部RAM的31H30H和33H 32H 等4个单元中,试编程求和,结果存 入R4R3R2中。 分析:流程如图: 程序如下: ORG 0000H LJMP MAIN ORG 0040H
ST1:
TAB:
MOV MOVC XCH INC MOVC MOV MOV CLR JMP DW DW … …
START:MOV MOV MOV MOV LOOP:MOV ADD MOV CLR ADDC MOV INC DJNZ SJMP
R6, R7, R2, R0, A, A, R7, A A, R6, R0 R2, $
#0 #0 #50 #30H R7 @R0 A R6 A LOOP
3、多重循环 如果在一个循环程序中嵌套了其他的循环程序,称 为多重循环程序。在用软件实现延时时显得特别有用。 例4-7 设计1秒延时子程序,假设fosc=12MHz。 分析:软件延时与指令的执行时间关系密切,在 使用12MHz晶振时,一个机器周期的时间为1,us,执行 一条DJNZ指令的时间为2us,我们可以采用三重循环的 方法写出延时1秒的子程序 流程、程序如下图所示:
MAIN:
MOV A, 30H ADD A, 32H DA A MOV R2,A MOV A,31H ADDC A,33H DA A MOV R3,A CLR A MOV ACC.0,C MOV R4, A HERE: AJMP HERE END
例4-2 利用查表指令将内部RAM中20H单元的压缩BCD码拆开, 转换成相应的ASCII码,存入21H、22H中,高位存在22H。 分析:控制流程图(略),程序如下: START: MOV DPTR,#TABLE MOV A, 20H ANL A, #0FH MOVC A, @A+DPTR MOV 21H, A MOV A, 20H ANL A, #0F0H SWAP A MOVC A, @A+DPTR MOV 22H, A AJMP $ TABLE: DB 30H,31H,32H,33H,34H DB 35H,36H,37H,38H,39H
START:MOV MOV
R0, #ST1 R1, #ST2
LOOP:MOV
JZ ENT
A, @R0
MOV
INC
@R1,A
R0
INCSJMP来自R1LOOPENT:RET
四、查表程序设计 用于查表的指令有两条: MOVC A,@A+PC; MOVC A,@A+DPTR; 当使用DPTR作为基址寄存器时查表比较简单,查表 的步骤分三步 1)基址(表格首地址)送DPTR数据指针; 2)变址值(在表中的位置是第几项)送累加器A; 3)执行查表指令MOVC A,@A+DPTR,进行读 数,查表结果送回累加器A。
1、定位伪指令ORG(Origin) 格式: [标号:] ORG m m:16位二进制数,代表地址。 功能:指出汇编语言程序通过编译,得到的机器语言程序的起 始地址。 2、定义字节伪指令DB(Define Byte) 格式:[标号:] DB X1,X2,~Xn Xn:单字节二进制、十进制、十六进制数,或以‘ ’括起 来的 字符串,数据符号。 功能:定义程序存储器从标号开始的连续单元,用来存放常 数、字符和表格。 3、定义字伪指令DW(Define Word) 格式:[标号:] DW Y1,Y2,~Yn Yn:双字节二进制、十进制、十六进制数,或以‘ ’括起来 的 字符串,数据符号。
;查表
;查表
;ASCII表
例4-10 利用查表指令,根据R2的分支序号找到对应 的转向入口地址送DPTR,清ACC后,执行散转指令 JMP @A+DPTR,转向对应的分支处理, 假定分支处理程序在ROM 64KB的范围内分布。 程序如下: ORG 1000H START: MOV DPTR, #TAB MOV A, R2 ADD A, R2 JNC ST1 INC DPH (转下页)
(2)利用PC作基址的参考程序如下: HEXASC: MOV A, R2 ANL A, #0FH ADD A, #9 MOVC A, @A+PC XCH R2, A ANL A, #0F0H SWAP A ADD A, #2 MOVC A, @A+PC MOV R3, A RET TABLE: DB “0”,“1”,…,“F”
…
AJMP PRG0:
…
PRGn
…
PRGn:
… … …
三、循环程序设计 1、循环程序的结构
循环程序包括以下四个部分: 置循环初值 循环体 循环控制变量修改 循环终止控制 常用于循环控制的指令有: DJNZ、CJNE、JC、JNC 等控制类指令。
2、单循环 终止循环控制采用计数的方法,即用一个寄存器 作为循环次数计数器,每次循环后计数加1或减1,达 到终止值后退出循环。 例4-6 计算50个8位二进制数(单字节)之和。 要求:50个数存放在30H开头的内部RAM中,和放 在R6R7中。 分析:采用DJNZ循环体的流程框图如下页所示, 在参考程序中,R0为数据地址指针,R2为减法循环计 数器。 在使用DJNZ控制时,循环计数器初值不能为0, 当为0时,第一次进入循环执行到DJNZ时,减1使R2 变为FFH,循环次数成了256,显然不合题意。
C DPTR,#ST1 A, @DPTR R7, A DPTR A, @DPTR A, R7 BIG1 A, @DPTR BIG2 A, R7 DPTR @DPTR,A $
2、多分支程序 (1)嵌套分支结构 例4-4 设变量X存放于30H单元,函数值Y存放31H单元。 试按照式: 1 X>0 Y= 0 X=0 的要求给Y赋值 -1 X<0 分析:X是有符号数,判断符号位是0还是1可利用JB 或JNB指令。 判断X是否等于0则直接可以使用累加器A的判0 指令。 流程、程序如下页:
对于偏移量 rel (1)可以是数值、标号地址、表达式 (2)使用特殊符号“$”,它代表本条转移指令所在的地址, 如LJMP $(死循环) (3)实际编程时,凡指令中用到地址(rel、 addr11 、addr16 等)都可用标号地址代替实际地址,而地址的运算由汇编程序 完成。 二、常用伪指令 汇编:将计算机不可直接识别的汇编语言源程序翻译成机器语 言的过程。分为计算机汇编和人工汇编两种。 汇编程序:具有完成汇编功能的程序。 目标程序:汇编语言源程序经过汇编得到的机器语言程序。 伪指令:提供汇编用控制信息的指令,只能被汇编程序所识 别,不是单片机的CPU可执行的指令。
例4-5 根据条件0、1、2 …、n,分别转向处理程序PRG0、 PRG1、…、PRGn,条件K设在R2中。 START: MOV DPRT, #TABLE MOV A, R2 ADD A, R2 JNC NEXT INC DPH NEXT: JMP @A+DPTR TABLE: AJMP PRG0
START: MOV JZ JNB MOV SJMP LAB1: MOV OVER: MOV SJMP
A,30H OVER ACC.7,LAB1 A, #0FFH OVER A, #1 31H, A $
(2)多重分支结构 利用MCS-51单片机的散转指令JMP @A+DPTR, 可方便地实现多重分支控制,因此,又称为散转程序。 假定多路分支的最大序号为n,则分支的结构如图所示。
二、分支程序设计 1、单分支程序 单分支结构程序使用转移指令实现,即根据条件 对程序的执行进行判断,满足条件是转移执行,否则 顺序执行。 在MCS-51指令系统中条件转移指令有: (1)判A转移指令JZ、JNZ; (2)判位转移指令JB、JNB、JBC、JC、JNC; (3)比较转移指令CJNE; (4)减1不为0转移指令DJNZ;
DELAY:MOV DL3: MOV DL2: MOV DL1: DJNZ DJNZ DJNZ RET
R7,#10; R6,#200 ; R5,#250 ; R5,DL1 ; R6,DL2 ; R7,DL3 ;
4、按条件转移控制的循环
例4-8 把内部RAM中从ST1地址开始存放的数据传送 到以ST2开始的存储区中,数据块长度未知,但已知数 据块的最后一个字节内容为00H,而其它字节均不为0。 并设源地址与目的地址空间不重复。 分析:显然,我们可以利用判断每次传送的内容是 否为 0 这一条件来控制循环。也可用CJNE来比较与0 是否相等设计。 利用判A转移控制的循环流程图如下图所示。