文档库 最新最全的文档下载
当前位置:文档库 › 单片机典型实验汇编程序

单片机典型实验汇编程序

单片机典型实验汇编程序
单片机典型实验汇编程序

实验一LED灯控制实验

实验任务:

①试编程用51单片机P0口实现8个LED 灯的交替亮灭控制;

②试编程实现二进制加法的LED显示;

③试编程实现8位LED灯的单方向跑马灯控制。

实验二数码管静态显示控制实验

实验任务:

用P0口驱动LED数码管静态显示0、1、2、3、4五个数码,每两数码时间间隔2S,循环往复显示。

实验三数码管动态显示控制实验

实验任务:

两片四位一体数码管动态显示0—7八个数码,每两位数码时间间隔2S,循环往复显示,P0口用于段码输出,P1口用于位选。

实验四按键识别控制实验

实验任务:

按键识别,用P2口识别按键,K1—K8对应数码为1—8,按下按键,数码管静态显示对应的数码。

参考程序

实验一:

①试编程用51单片机P0口实现8个LED 灯的交替亮灭控制

ORG 0000H ;程序从此地址开始运行

LJMP MAIN ;跳转到MAIN 程序处

ORG 0100H ;MAIN 从0100H处开始

MAIN:

MOV P2 ,#00H ;P2为低电平LED 灯亮

ACALL DELAY ;调用延时子程序

MOV P2 ,#0FFH

ACALL DELAY

AJMP MAIN

DELAY:

MOV R5,#02H ;将立即数传给寄存器R5

F3: MOV R6,#0FFH

F2: MOV R7,#0FFH

F1: DJNZ R7,F1 ;若为0程序向下执行,若不为0程序跳转到

DJNZ R6,F2

DJNZ R5,F3

RET

END

②试编程实现二进制加法的LED显示

ORG 0000H ;程序从0000开始运行

AJMP MAIN

ORG 0100H

MAIN: MOV A ,#000h

LOOP: MOV P2,A ;全不亮

CALL DELAY ;延时。

INC A ;每次加一。

JMP LOOP

DELAY:MOV R5,#50 ;延时。

D1: MOV R6,#40

D2: MOV R7,#248

D3: DJNZ R7,D3

DJNZ R6,D2

DJNZ R5,D1

RET

END

③试编程实现8位LED灯的单方向跑马灯控制

ORG 0000H ;程序从0000开始运行

LJMP MAIN ;跳到主程序MAIN: ;主程序循环点亮

MOV P2,#00H ;全亮

LCALL DELAY ;延时一段时间

MOV A,#0FEH ;每次只亮一个

灯。

LOOP: MOV P2,A ;输出到p2

LCALL DELAY ;延时

RL A ;循环左移。

AJMP LOOP ;跳转main继续循环

DELAY:MOV R5,#20 ;延时子程序1闪烁灯调用

D1:MOV R6,#20

D2:MOV R7,#250

D3:DJNZ R7,D3

DJNZ R6,D2

DJNZ R5,D1

RET

END

实验二:

LED数码管显示0、1、2、3、4,循环进行ORG 0000H

LJMP MAIN

ORG 0100H

MAIN: MOV 30H,#00H

MOV R0,#5

LOOP: MOV A,30H

INC 30H

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

LCALL DLEAY

DJNZ R0,LOOP

LJMP MAIN

TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H DLEAY:MOV R5,#50

D1: MOV R6,#40

D2: MOV R7,#248

D3: DJNZ R7,D3

DJNZ R6,D2

DJNZ R5,D1

RET

END

实验三:

LED数码管动态显示0—7

ORG 0000H

LJMP MAIN

ORG 0100H MAIN: MOV 30H,#00H

MOV 31H,#0FEH

MOV R0,#8

LOOP: MOV A,30H

INC 30H

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV P1,31H

MOV A,31H

RL A

MOV 31H,A

LCALL DLEAY

DJNZ R0,LOOP

LJMP MAIN

TABLE:DB

3FH,06H,5BH,4FH,66H,6DH,7DH,07H DLEAY:MOV R5,#50

D1: MOV R6,#40

D2: MOV R7,#248

D3: DJNZ R7,D3

DJNZ R6,D2

DJNZ R5,D1

RET

END

实验四:

按键识别

ORG 0000H

LJMP MAIN

ORG 0100H

MAIN:MOV P0,#00H

MOV P2,#0FFH

MOV A,P2

CJNE A,#0FFH,QDD

LJMP RETURN

QDD:MOV R0,A

LCALL DLEAY1

MOV A,P2

CJNE A,00H,RETURN

MOV A,P2

JNB ACC.0,KEY1

JNB ACC.1,KEY2

JNB ACC.2,KEY3

JNB ACC.3,KEY4

JNB ACC.4,KEY5

JNB ACC.5,KEY6

JNB ACC.6,KEY7

JNB ACC.7,KEY8 KEY1:MOV P0,#0F9H

LCALL DLEAY2 LJMP RETURN

KEY2:MOV P0,#0A4H

LCALL DLEAY2 LJMP RETURN

KEY3:MOV P0,#0B0H

LCALL DLEAY2 LJMP RETURN

KEY4:MOV P0,#99H

LCALL DLEAY2 LJMP RETURN

KEY5:MOV P0,#92H

LCALL DLEAY2 LJMP RETURN

KEY6:MOV P0,#82H

LCALL DLEAY2 LJMP RETURN

KEY7:MOV P0,#0F8H

LCALL DLEAY2 LJMP RETURN

KEY8:MOV P0,#80H

LCALL DLEAY2

LJMP RETURN DLEAY1:MOV R6,#0AH DL1:MOV R7,#0F9H

DL2:NOP

NOP

DJNZ R7,DL2

NOP

DJNZ R6,DL1

RET

DLEAY2:MOV R5,#50 D1:MOV R6,#40

D2:MOV R7,#248

D3:DJNZ R7,D3 DJNZ R6,D2

DJNZ R5,D1

RET

RETURN:RET

END

静态数码管

动态显示

独立按键

51单片机汇编程序范例

16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。 程序可见: http: 32.html中的HEX2BCD子程序。 .说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。 但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。 上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。 为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的!.近来,在网上发现了一个链接: ,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。这篇文章提到的程序,一直也没有找到,也难辩真假。 这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:

“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。 .下面说说做而论道的编程思路。;----------------------------------------------------------------------- ;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。 ;那么可以写成: ; n = [b15 ~ b0] ;把16位数分解成高8位、低8位来写,也是常见的形式: ; n = [b15~b8] * 256 + [b7~b0] ;那么,写成下列形式,也就可以理解了: ; n = [b15~b12] * 4096 + [b11~b0] ;式中高4位[b15~b12]取值范围为0~15,代表了4096的个数; ;上式可以变形为: ; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]} ;用x代表[b15~b12],有: ; n =x * 4000 + {x * (100 - 4) + [b11~b0]} ;即: ; n =4*x (千位) + x (百位) + [b11~b0] - 4*x ;写到这里,就可以看出一点BCD码变换的意思来了。 ;;上式中后面的位:

51单片机实用汇编程序库(word)

51 单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET

五、定时器功能实例 5.1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0 入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50 个 0.2 秒,即50*0.2=1 秒 MOV TMOD,#00000001B;定时器0 工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 11 SETB EA ;开总中断 SETB ET0 ;开定时器0 中断允许 SETB TR0 ;开定时0 运行 SETB P1.0 LOOP: AJMP LOOP DIN0: ;是否到一秒//////////////////////////////////////// INCC: INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPL P1.0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 RETI END 5.2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期是1 微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 的频率为例: 200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电

单片机控制系统汇编程序

; step motor control ; ASM for MCS51 mode equ 082h contrl equ 08003h ctl equ 08000h ;8255接口芯片PA口的地址值 Astep equ 01h ;对A相通电,PA口的赋值 Bstep equ 02h ;对B相通电,PA口的赋值 Cstep equ 04h ;对C相通电,PA口的赋值 Dstep equ 08h ;对D相通电,PA口的赋值 dly_c equ 10h ;启动初值(加速度)寄存器 sd1 equ 80 ;0--255 加速度初值:值越小,加速越快 sd2 equ 40 ;

单片机汇编语言经典一百例

51单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY:

MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH

DJNZ R1,$ RET END 五、定时器功能实例 5.1 定时1秒报警 程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50个 0.2秒,即50*0.2=1秒 MOV TMOD,#00000001B;定时器0工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05秒,定时 20次则一秒 11 SETB EA ;开总中断

LCD1602-51单片机汇编程序

1602汇编程序,51单片机汇编程序,仅需修改引脚定义即可。晶振大小12M,程序测试完全正确。内部包含写数据、写命令(包括读忙和不读忙)、初始化等子函数。调用时先给LCD_DAT赋值,给出需要写入的数据或命令,然后调用。 ;端口引脚定义区 LCD_RS BIT P2.4 ;1602数据命令选择端口 LCD_RW BIT P2.5 ;1602读写选择端口 LCD_EN BIT P2.6 ;1602使能端口 LCD_DATA EQU P0 ;1602数据端口 ;变量声明区 ALL_FLAG EQU 20H ;标志位 LCD_FLAG EQU ALL_FLAG.7 ;1602读忙标志位 LCD_DAT EQU 30H ;1602数据命令字 DELAYED EQU 31H ;延时字 /***************************************** 1602读命令函数,高位存至LCD_LAG中 *****************************************/ LCD_R_DATA: MOV LCD_DATA,#0FFH LCD_BUSY: CLR LCD_RS SETB L CD_RW NOP SETB L CD_EN NOP MOV Acc,LCD_DATA MOV C,Acc.7 MOV LCD_FLAG,C CLR LCD_EN NOP JB LCD_FLAG,LCD_BUSY RET /***************************************** 1602写数据函数,数据存在LCD_DAT *****************************************/ LCD_W_DATA: LCALL LCD_R_DATA SETB L CD_RS CLR LCD_RW NOP MOV LCD_DATA,LCD_DAT

单片机基础汇编语言编程实例

单片机基础汇编语言编程实例 单片机汇编语言编程 1.编写程序,用位处理指令实现“P1.4=P1.0∨(P1.1∧P1.2)∨P1.3”的逻辑 功能。 MOV C,P1.1ANL C,P1.2ORL C,P1.0ORL C,P1.3MOV P1.3,C2.编写程序,若累加器A 的内容分别满足下列条件,则程序转到LABLE 存储单元。设A 中存 放的的无符号数。(1)A≥10;(2)A>10;(3)A≤10。(1)CJNE A,#10,NEXTLJMP LABLENEXT:JNC LABLE(2)CJNE A,#10,NEXTLJMP NEXT2NEXT:JNC LABLENEXT2:(3)CJNE A,#10,NEXTLJMP LABLENEXT:JC LABLE3.编写程序,查找片内RAM 的30H~50H 单元中是 否有55H 这一数据,若有,则51H 单元置为FFH;若未找到,则将51H 单元 清0。MOV R0,29HNEXT:INC R0CJNE R0,#51H,NEXT2MOV 51H,#0FFHAJMP OVERNEXT2:CJNE @R0,#55H,NEXTMOV 51H,#0OVER:4.编写程序,查找片内RAM 的30H~50H 单元中出现0 的次数,并将查找的结果存入51H 单元。MOV R0,30HMOV 51H,#0NEXT:CJNE @R0,#00H,NEXT2INC 51HNEXT2:INC R0CJNE R0,#51H,NEXT5.在片外RAM 中有一个数据块,存有若干字符、数字,首地址为SOURCE 要求将该数据块传送到片内RAM 以DIST 开始的区域,直到遇到字符“$”时结束($也要传送,它的ASCII 码为24H)。MOV DPTR,#SOURCEMOV R0,#DISTNEXT:MOVX A,@DPTRMOV @R0,AINC DPTRINC R0CINE A,#24H,NEXT6.片内RAM 的30H 和31H 单元中存放着一个16 位的二进制数,高位在前,低位在后。编写程序对其求补,并存回原处。CLR CMOV A,#0SUBB A,31HMOV 31H,AMOV A,#0SUBB A,30HMOV 30H,A7.片内RAM 中有两个4 字节压缩的BCD 码形式存放的十进制数,一

快速入门单片机汇编语言

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(p0.0—p0.7):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(p1.0—p1.7):其每一位都能作为可编程的输入或输出线。 P2口(p2.0—p2.7):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(p3.0—p3.7):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 P3口第二功能 引脚第二功能引脚第二功能 P3.0 RXD—串行口数据 输入端P3.4 INT0—定时器T0的外部 输入 P3.1 TXD—串行口数据 输出端P3.5 INT1—定时器T1的外部 输入 P3.2 T0—外部中断0请 求P3.6 WR—外部存储器数据写 选通信号 P3.3 T1—外部中断1请 求P3.7 RD—外部存储器数据读 选通信号 Rst\Vpd:上电复位端和掉电保护端。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当EA为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式: [标号:]操作码 [ 目的操作数][,操作源][;注释]

单片机汇编语言实验程序集合

51单片机汇编语言实验程序集合 说明:最近一直在做51的编程,下面的程序是基于AT89S52实验板的汇编练习程序,适合于初学者练习和对实验板进行下载测试用,自己写的目的是熟练一下单片机的硬件和软件编程,呵呵,把所有通过调试和下载的源程序都贴在下面了: ;功能说明:实现p0口输出循环右移的led流水灯,500ms延时 START: MOV R0,#8; MOV A,#01111111B; LOOP: MOV P0,A; ACALL DELAY RR A DJNZ R0,LOOP JMP START DELAY: MOV R5,#50 DLY1: MOV R6,#100 DLY2: MOV R7,#100 DJNZ R7,$ DJNZ R6,DLY2 DJNZ R5,DLY1 RET END *********************************************************************** ;function description: T0 as timer contrled p0.7's led 50ms ; while T1 as counter contrled p0.0's led while T0 reached 100 (--10S) ;hardware: p0.0 p0.7 led; p0.7----p3.5(t1's extern int) ORG 0 JMP MAIN ORG 000BH ;T0 OVERFLOW JMP EXT0 ORG 001BH ;T1 OVERFLOW JMP EXT1 MOV SP,#60H;SET SP MAIN: MOV TMOD,#01100001B ;SET T/C MODE MOV TL0,#LOW(65536-50000)

单片机汇编程序电子闹钟

电子闹钟课程设计

摘要:本课程设计主要是通过单片机系统,综合运用定时器、中断、数码显示等知识设计一个可定时的电子钟。它包括系统总体方案及硬件设计,软件设计,Proteus软件仿真等部分。 硬件设计的主要任务是根据总体设计要求,以及在所选机型的基础上,确定系统扩展所要用的存储器,I/O电路及有关外围电路等然后设计出系统的电路原理图。 合理的软件结构是设计出一个性能优良的单片机应用性系统软件的基础,因 此必须充分重视。编写完程序后在用Proteus软件仿真检查设计是否合理。 一.课程设计的概况 通过对51单片机的扩展,接键盘,显示器等相应的外围器件。在LED显示器中分成静态显示和动态显示两类,在本设计中主要用了它的动态显示功能,动态显示利用了人视觉的短暂停留,在数据的传输中是一个一个传输的,且先传输低位。键盘是由若干个按键组成的开关矩阵,是一种廉价的输入设备。键盘通常包括有数字键,字母键以及一些功能键。操作人员可以通过对键盘向计算机输入数据,地址,指令或其他的控制命令,实现简单的人机对话。这里采用非编码式键盘。通过51单片机的P1口扩展出独立连接式键盘。外围扩展复位,时钟电路,利用软件源程序代码实现相应的功能。 二.课程设计实现的功能: 1.能显示时时-分分-秒秒。 2.能够设定定时时间,修改定时时间。 3.定时时间到能发出警报声或者启动继电器,从而控制电器的起停。 三.设计方案 使用是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。 本系统采用单片机AT89C51作为本设计的核心元件,利用7段共阴LED作为显示器件。接入共阴LED显示器,可显示时,分钟,秒,单片机外围接有定时报警系统,定时时间到,扬声器发出报警声,提示预先设定时间电器的起停时间到,从而控制电器的起停。

51单片机汇编语言音乐程序

01两只老虎 NEXT BIT10H;定义标志位 ORG0000H JMP MAIN ORG000BH JMP TONE ORG001BH JMP BEAT ORG0100H MAIN:MOV TMOD,#11H MOV TH0,R2 MOV TL0,R3 MOV TH1,#3CH MOV TL1,#0B0H MOV R4,#00H MOV DPTR,#TAB YD:MOV A,R4;取音调数据 MOVC A,@A+DPTR MOV R2,A XRL A,#00H JNZ JP;直接取节拍 INC R4 CALL PD;判断指针是否溢出 MOV A,R4 MOVC A,@A+DPTR MOV R3,A XRL A,#0FFH JZ JP MOV A,R2 XRL A,#0FFH JNZ MAIN JP:INC R4;取节拍数据 CALL PD MOV A,R4 MOVC A,@A+DPTR MOV R5,A

SETB EA SETB ET0 SETB ET1 SETB TR0 SETB TR1 SETB NEXT JB NEXT,$ INC R4 CALL PD JMP YD PD:MOV A,R4 CJNE A,#00H,L1 INC DPH L1:RET ;音调产生子程序 TONE:CPL P2.0 MOV TH0,R2 MOV TL0,R3 RETI ;节拍产生子程序 BEAT:DJNZ R5,L2 MOV TH1,#3CH MOV TL1,#0B0H L3:RETI L2:CLR TR0 CLR TR1 CLR NEXT JMP L3 ;两只老虎音符表 TAB:DB 0FBH,0F9H,08H,0FCH,066H,08H,0FCH,0C7H,08H,0FBH,0F9H,08H DB 0FBH,0F9H,08H,0FCH,066H,08H,0FCH,0C7H,08H,0FBH,0F9H,08H

基于单片机的汇编语言入门教程

入门教程2007-04-2922:04对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS 段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用

相关文档
相关文档 最新文档