我是靠谱客的博主 敏感芹菜,最近开发中收集的这篇文章主要介绍微机原理-05-汇编语言汇编语言程序设计,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

汇编语言程序设计

汇编语言是用助记符(英文字母缩写)来表示的面向机器的程序设计语言,每条助记符指令都有相对应的机器码,即汇编语言是机器语言的符号表示。

格式

汇编语言语句一般由4个字段组成,即标号、操作码、操作数和注释,它们之间应用分隔符隔开,常用的分隔符有空格“ ”、冒号“:”和分号“;”,而且空格的数目可以不止一个。

[标号:] 操作码 [操作数] [;注释]

上述格式中,[ ]中的项为任选项,其中标号与操作码之间用“:”分隔,操作码与操作数之间用空格分隔,操作数与注释之间用“;”分隔,有多个操作数时,操作数和操作数之间用“,”分隔。

  • 标号规定如下:
    ① 标号由1~8个ASCII码字符组成,第一个字符必须是字母。
    ② 同一标号在一个程序中只 能定义一次,不能重复定义。
    ③ 不能使用汇编语言已经定义的符号作为标号,如指令助记符、伪指令及寄存器的符号名称等。
    ④ 标号的有无,取决于本程序中的其他语句是否访问该条语句。如无其他语句访问,则该语句前不需要标号。

  • 操作码字段
    操作码是指令的助记符,表示指令的性质,用于指示CPU执行何种操作。操作码是汇编语言指令中唯一不能空缺的部分。

  • 操作数字段
    操作数字段用于存放指令的操作数或操作数的地址。

    • 即数:#data和#data16。
    • 直接地址:direct,如30H;伪指令定义的符号地址,如SUM;表达式,如SUM+1,特殊功能寄存器的名字等。
  • 注释字段
    注释是为便于读者的阅读和理解而对语句或程序段的说明,汇编时不被翻译成机器码,机器也不执行。

伪指令

​ 伪指令是在“机器汇编”过程中,用来对汇编过程进行某种控制或者对符号和标号进行赋值。这些指令不属于指令系统中的指令,汇编时也不产生机器代码,因此称为“伪指令”。

  • ORG(汇编起始地址伪指令)
    ORG用来定义汇编以后的目标程序的起始地址。其格式如下:
    [标号:] ORG addr16
    例如: ORG 2000H
    START: MOV A,#34H
    ORG规定了标号START的地址为2000H,也就是说该程序应从2000H开始存放。在一个汇编语言源程序中,可以多次使用ORG命令,以规定不同程序段的起始地址,地址一般应从小到大且不能重复。

  • END(汇编结束伪指令)
    END用来表示汇编语言源程序结束,它只能出现在程序的末尾,且只有一个。其指令格式如下:
    [标号:] END

  • EQU(赋值伪指令)
    EQU用来对程序中出现的标号进行赋值。其格式如下:
    字符名称 EQU 数或汇编符号
    在机器汇编时,汇编语言会自动将EQU后面的数或汇编符号赋给左侧的字符名称。例如,
    AA EQU R1 ;AA等同于R1
    K1 EQU 40H ;K1代表40H
    使用该指令必须注意以下几点:
    (1)该指令中的字符名称不是转移指令中出现的标号,而是出现在操作数中的字符名称。
    (2)EQU伪指令中的字符名称必须先定义后使用。
    (3)EQU定义的字符名称不能出现在表达式中,例如语句MOV A,A10+1是错误的。

  • DATA(数据地址赋值伪指令)
    DATA对数据地址或代码地址赋予规定的字符名称。其格式如下:
    标号名称 DATA 表达式

  • B、DW、DS(定义字节、字、空间伪指令)
    DB:从指定的地址单元开始,存放若干字节。
    DW:从指定的地址单元开始,存放若干字(16位二进制数,高8位在前,低8位在后)。
    DS:从指定的地址单元开始,保留若干单元备用。指令格式如下:
    [标号:] DB 字节常数 ;用逗号分隔开的若干项,每项都是一个字节)
    [标号:] DW 字常数 ;用逗号分隔开的若干项,每项都是一个字)
    [标号:] DS 表达式 ;其值表示保留的单元个数)

分析下段程序。  
ORG    2000H
DS      08H
DB      30H,8AH,10,‘B’
DW     54H,1F80H
解:该程序的DS伪指令定义8个存储单元(2000H~2007H)备用;DB伪指令定义了从地址2008H开始的4个单元的内容;DW伪指令定义了后续4个单元的内容。结果如下:

(2008H) = 30H,  (2009H) = 8AH
(200AH) = 0AH, (200BH) = 42H
(200CH) = 00H,  (200DH) = 54H
(200EH) = 1FH,  (200FH) = 80H

  • BIT(位地址符号伪指令)
    BIT用来将位地址赋给字符名称。其格式为:
    字符名称 BIT 位地址
    例如:
    KEY BIT P1.0 ;将P1.0的位地址赋给符号名KEY
    ST BIT 0D7H ;将位地址为D7H的位定义为符号名
    注意:位地址既可以是绝对地址,也可以是符号地址。另外,用BIT定义的“符号名”一经定义便不能重新定义和改变。


汇编程序

步骤

汇编语言程序设计的一般步骤
汇编语言程序设计大致可分成以下几步:
(1)明确设计要求。
(2)确定算法。
(3)绘制程序流程图。
(4)按程序流程图编写源程序。
(5)上机调试。
(6)优化程序。

结构

#####顺序

将片内RAM的20H单元中的压缩BCD码拆成两个ACSII码存入21H、22H单元。低4位存在21H单元,高4位存 在22H单元。

ORG	 2000H
MOV	 A,20H
MOV	 B,#10H ;除以10H
DIV	 AB
ORL	 B,#30H ;低4位BCD码转换为ASCII码
MOV	 21H,B
ORL	 A,#30H ;高4位BCD码转换为ASCII码
MOV	 22H,A
END

#####分支

求单字节有符号数的二进制补码。

GCMPT:JNB   ACC.7,RETURN	;(A) > 0,不需转换
MOV  C,ACC.7	             ;符号位保存
CPL   A		         	;(A)求反,加1
ADD  A,#1				
MOV  ACC.7,C      ;符号位回存A的最高位
RETURN:RET

循环
设有100个单字节数。连续存放在内部M单元开始的数据存储器中,且总和也为单字节数,存放到N单元。试编写求这100个数之和的程序。

参考程序:
N	  EQU	30H
M	  EQU	31H
 	  ORG	2020H
 	  MOV	A,#00H
 	  MOV	R0,#M
 	  MOV	R1,#64H
LOOP:ADD 	A,@R0
 	  INC	R0
 	  DJNZ	R1,LOOP
 	  MOV	N,A
 	  SJMP $
 	  END

现场保护与恢复工作

由于主调程序和子程序经常是分开编制的,所以它们所使用的寄存器或存储单元往往会发生冲突。为避免子程序在运行过程中,修改主调程序中使用的寄存器/存储单元的原有内容,在子程序开始运行时应进行相应寄存器/存储单元内容的保存,在子程序运行结束,再将这些寄存器/存储单元的内容进行恢复,以保证调用程序的正常运行。

在主程序中实现
        现场保护与恢复工作在主程序中实现,特点是结构灵活。例如,
PUSH   PSW      	;保护现场(含当前工作寄存器组号)
PUSH   ACC     
PUSH   B        
MOV    PSW,#10H 	;切换当前工作寄存器组
LCALL  addr16    	;子程序调用
POP    B         		;恢复现场
POP    ACC     
POP    PSW      		;含当前工作寄存器组切换

在子程序中实现
        现场保护与恢复工作在子程序中实现,特点是程序结构规范、清晰。例如,
SUB1: PUSH  PSW      ;保护现场(含当前工作寄存器组号)
       PUSH  ACC     
       PUSH  B        
       MOV   PSW,#10H ;切换当前工作寄存器组
       … 
       POP   B         	;恢复现场
       POP   ACC    
       POP   PSW      	;内含当前工作寄存器组切换
       RET


###习题

  1. 用于程序设计的语言分为哪几种?它们各有什么特点?

答:51系列单片机的编程语言可以分为汇编语言和高级语言(如C语言)两种,各自的特点如下:

名称特点缺点优点适用场合
汇编语言用符号书写指令(用助记符表示操作码,特殊符号表示操作数)机器不能直接识别;程序员必须了解机器的结构和指令系统,不易推广和普及;不能移植,不具备通用性较易为人们识别、记忆和读写实时控制系统
高级语言用以英语为基础的语句编程机器不能直接识别;执行时间长易于推广和交流;不依赖于机器,具有通用性科学运算和数据处理
  1. 设常量和数据标号的定义为:
	ORG	2000H

	DAT1:		DB  1, 2, 3, 4, 5

	DAT2:		DB  ‘ABCD’

	DAT3:		DW  1200H,-2

	TAB: 		DW  DAT1, DAT3

补充:A为65,也就是十六进制的41H

​ (1)画出上述数据或地址的存储形式。

​ (2)写出各标号的地址。

答:(1)

地址内容(H)
2000H01
02
03
04
05
2005H41
42
43
44
2009H12
00
FF
FE
200DH20
00
20
09

(2)DAT1=2000H; DAT2=2005H; DAT3=2009H; TAB =200DH

  1. 试编写程序,找出片内RAM 30H~5FH单元中无符号数的最大数,并将结果存入60H单元。

答:

        ORG  0000H
		MOV  R0,  #30H
		MOV  R7,  #2FH
		MOV  A,   @R0
AGAIN:	INC  R0
		MOV  B,	A
		CLR	C
		SUBB  A,  @R0
		JNC   L1
        MOV   A,  @R0
		AJMP  L2
L1:     MOV   A,  B
L2:     DJNZ  R7, AGAIN
		MOV   60H, A
		SJMP  $
		END

6.试编写程序,统计片内RAM的20H~5FH单元中出现55H的次数,并将统计结果送60H单元。

答:

       TAB		EQU   20H
				ORG  0000H
       START:   MOV  60H, #0
                MOV  R0, #TAB
       LOOP2:   MOV  A,  #55H
                CLR  C
				SUBB  A,  @R0
				JNZ   NEXT
				INC   60H
		NEXT:   INC   R0
	        	CJNE  R0,  #60H,  LOOP2
				SJMP  $
				END

7.编写程序,将片外数据存储区中3000H~30FFH单元全部清零。

答:

                ORG  0000H
       START:   MOV  A, #0
 				MOV  R7,  #0
                MOV  DPTR,  #3000H
       LOOP:    MOVX  @DPTR,  A
                INC   DPTR
	        	DJNZ  R7, LOOP
				SJMP  $
				END

最后

以上就是敏感芹菜为你收集整理的微机原理-05-汇编语言汇编语言程序设计的全部内容,希望文章能够帮你解决微机原理-05-汇编语言汇编语言程序设计所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部