当前位置:文档之家› 嵌入式系统 汇编语言和C语言相互转换、中断

嵌入式系统 汇编语言和C语言相互转换、中断

02a 汇编和C语言的相互调用

主要内容:

?C语言的编译过程

–C语言程序→汇编语言程序→目标可执行程序?汇编语言的函数调用过程

–参数准备

–函数返回

–汇编函数间调用

?函数调用举例

–C语言调用汇编函数

–汇编语言调用C语言函数

?命令脚本文件和链接脚本文件

C 和汇编语言混合编程

?C 语言程序→汇编语言程序→目标可执行程序

C 程序先要转化为汇编程序,意味着C 和汇编语言混合编程时,最终可以从汇编语言之间的相互调用过程着眼

C 程序

汇编程序

汇编程序

目标程序

编译转化

C 程序

汇编程序

汇编程序

如何转化

如何调用

C 程序

汇编程序

如何调用

C 语言函数→汇编函数

int test_fun(paras...){[处理过程]}

test_fun:mov ip, sp

stmdb sp!, {fp, ip, lr, pc}sub fp, ip, #4; 0x4[处理过程]

ldmdb fp, {fp, sp, pc}

函数名转化为标号

栈回溯结构

退出

fp (r11): Frame Pointer ip (r12):

sp (r13): Stack Pointer lr (r14): Link Register pc

(r15): Program Counter

ip →外层函数的栈顶fp →当前函数的栈底

参数个数≤4时-输入参数

?在函数体内使用参数(4个参数见下表)

别名寄存器说明

a1r0参数1

a2r1参数2

a3r2参数3

a4r3参数4

参数个数≤4时-返回值

?函数结束时,应将返回值存放到r0中

用汇编语言编写函数举例(参数个数≤4)

?C语言函数total_fun(int p1,int p2,int p3),返回三数之和,用汇编语言实现

total_fun:/* 函数名由标号替代*/ mov ip, sp/* 栈回溯结构*/

stmdb sp!, {fp, ip, lr, pc}

sub fp, ip, #4

add a1,a1,a2/* 实现p1+p2,存放在r0中*/

add a1,a1,a3/* 实现p1+p2+p3,存放在r0中*/

ldmdb fp, {fp, sp, pc} /* 返回*/

汇编语言调用函数(参数个数≤4)

?如何准备函数参数

–将参数依次直接存入R0-R3

?如何获得函数返回值

–从寄存器R0中读取

举例:

mov r0,#1/* 准备参数1*/

mov r1,#2/* 准备参数2*/

mov r2,#3/* 准备参数3*/

bl total_fun/* 调用刚编写的求和函数*/

/* 此时,r0中的值应该是6 */

参数个数>4时-输入参数

test_fun:mov ip, sp

stmdb sp!, {fp, ip, lr, pc}sub fp, ip, #4; 0x4sub sp, sp, #32[处理过程]

ldmdb fp, {fp, sp, pc}

ip →外层函数体的栈顶fp →当前函数体的栈底

sp→当前函数体的栈顶#32→当前函数所用栈容量

当前函数所用栈容量

?临时变量个数+函数参数个数多于4个的部分

?例如:

–int foo(int x1,int x2){

int a,b,c;/* 3个临时变量*/

....

}

?其使用的栈容量=3

–int foo(int x1,int x2, int x3, int x4, int x5){

int a,b,c;/* 3个临时变量*/

...

}

?其使用的栈容量=3+(5-4) = 4

当前函数内存布局

外层函数栈顶

当前函数栈顶

子函数参数5子函数参数6

子函数参数:由顶开始依次存放

pc

fp

ip

lr 现场信息

函数变量

子函数参数函数变量2函数变量1

函数中的临时变量:由底开始依次存放

ip

fp ip →外层函数体的栈顶fp →当前函数体的栈底

当前函数内存布局-思考题

?如果当前函数有多个子函数,那么它的内存布局是如何的??例如:

–int foo(){

int x1,x2,x3,x4,x5,x6;foo1(x1,x2);

foo2(x1,x2,x3,x4);

foo3(x1,x2,x3,x4,x5,x6);}

子函数参数5子函数参数6

pc

fp

ip

lr 函数变量

子函数参数函数变量2函数变量1

C语言调用汇编函数

1extern int unsigned

2total_fun(int p1,int p2, int p3); 3int test(){

4int y;

5y = total_fun(1,2,3);

6return y;

7}1.global total_fun

2.text

3total_fun:

4mov ip, sp

5stmdb sp!, {fp, ip, lr, pc} 6sub fp, ip, #4

7add a1,a1,a2

8add a1,a1,a3

9ldmdb fp, {fp, sp, pc} 10.end

test.c total_fun.s

汇编语言调用C语言函数

1.extern total_fun

2.text

3test:

4mov ip, sp

5stmdb sp!, {fp, ip, lr, pc} 6sub fp, ip, #4

7mov r0, #1

8mov r1, #2

9mov r2, #3

10bl total_fun

11ldmdb fp, {fp, sp, pc}

12.end 1unsigned int total_fun(

2int p1, int p2, int p3) { 3 return p1+p2+p3;

4}

test.s total_fun.c

?命令脚本文件

–IDE与目标板连接时

–软件调试过程中

–复位目标板后

?需要集成环境自动完成一些特定的功能:

–复位目标板、清除看门狗、屏蔽中断寄存器,等等

?这些功能可以由一组命令序列完成,该命令序列保存在文件中。该文件称为命令脚本文件。文件后缀一般为.cs

?命令

–GO执行程序:从当前PC开始执行程序–MEMWRITE 存储区写

?向地址0x1000写入值0x5A

?memwrite 0x1000 0x5A

–REFRESH刷新窗口

–REGWRITE寄存器写

?向寄存器PC写入值0x3840

?regwrite pc 0x3840

–RESET复位目标设备

–STOP停止执行程序

?命令脚本文件举例(page 122):

stop; 一般目标板都会处于运行状态

regwrite sp 0x1000;程序刚执行时未初始化堆栈地址

?命令脚本文件

–类似于Windows操作系统中的autoexec.bat 自动执行批处理文件

命令脚本文件的设置

什么也不做,这时,IDE

只是和目标板连接而已,

但映像文件并不下载到目

标板

IDE和目标板连接以后,

自动把映像文件下载到目

标板

IDE和目标板连接以后,

执行脚本文件,但并不将

映像文件下载到目标板

?在程序编译时起作用。

?该文件描述代码链接定位的有关信息,包括代码段,数据段,地址段等,链接器必须使用该文件对整个系统的代码做正确的定位。

?在IDE开发环境中使用扩展名*.ld

1 SECTIONS

2 {

3 .=0X10000;

4 .text :{*(.text)}

5 .=0x80000000;

6 .data:{*(.data)}

7 .bss:{*(.bss)}

8 }

1 SECTIONS

2 {

3 .text:{*(.text)}

4 .data:{*(.data)}

5 .bss: {*(.bss)}

6 }

目标输入文件1目标输入文件2

目标输入文件n 目标输出文件

链接

目标输入文件1:代码段

初始化的数据段未初始化的数据段目标输入文件2:代码段

初始化的数据段未初始化的数据段

目标输出文件:代码段初始化的数据段未初始化的数据段

作业习题 中断及定时器

中断及定时器、串行口习题 一、填空 1.MCS-51的Po口作为输出端口时,每位能驱动个SL型TTL负载. 2.MCS-51有个并行I\O口,其中P0~P3是准双向口,所以由输出转输入时必须先 写入 3.设计8031系统时,_ 口不能用作一般I\O口. 4.MCS-51串行接口有4种工作方式,这可在初始化程序中用软件填写特殊功能寄存 器__ _加以选择. 5.当使用慢速外设时,最佳的传输方式是。 6.当定时器To工作在方式时,要占定时器T1的TR1和TF1_两个控制位. 7.MCS-51有个中断源,有2 个中断优先级,优先级由软件填写特殊功能寄存器加以选择.. 8.用串口扩并口时,串行接口工作方式应选为方式。 9.在串行通信中,有数据传送方向、、三种方式. 10.外部中断入口地址为_ 。 二、判断 1.MCS-51的5个中断源优先级相同。() 2.要进行多机通信,MCS-51串行接口的工作方式应为方式1。() 3.MCS-51上电复位时,SBUF=00H。()。 4.MCS-51有3个中断源,优先级由软件填写特殊功能寄存器IP加以选择.. () 5.用串口扩并口时,串行接口工作方式应选为方式1. () 6.外部中断INTO 入口地址为_0013H() 7.MCS-51外部中断0的入口地址是0003H。(). 8.TMOD中的GATE=1时,表示由两个信号控制定时器的启停。()。 9.使用8751且=1时,仍可外扩64KB的程序存储器。() 10.PC存放的是当前执行的指令。() 11.MCS-51的特殊功能寄存器分布在60H~80H地址范围内。() 12.MCS-51有4个并行I\O口,其中P0~P3是准双向口,所以由输出转输入时必须先写入"0"() 三、选择 1.在中断服务程序中,至少应有一条( ) (A)传送指令(B)转移指令(C)加法指法(D)中断返回指令 2.要使MCS-51能够响应定时器T1中断、串行接口中断,它的中断允许寄存器IE的内容应是() (A)98H (B)84H (C)42 (D)22H 3.D MCS-51在响应中断时,下列哪种操作不会发生( ). (A)保护现场(B)保护PC (C)找到中断入口若悬河(D)保护PC转入中断入口 4.用MCS-51串行接口扩展并行I\O口时,串行接口工作方式应选择( ) (A)方式0 (B)方式1 (C)方式2 (D)方式3 5.MCS-51有中断源() (A)5个(B)2个(C)3个(D)6个 6.MCS-51响应中断时,下面哪一个条件不是必须的() (A)当前指令执行完毕(B)中断是开放的确 (C)没有同级或高级中断服务须(D)必须有RET1指令 7.使用定时器T1时,有几种工作模式() (A)1种(B)2种(C)3种(D)4种 8.计算机在使用中断方式与外界交换信息时,保护现场的工作方式应该是( ) (A)由CPU自动完成(B)在中断响应中完成功之路 (C)应由中断服务程序完成(D)在主程序中完成 9.下面哪一种传送方式适用于处理外部事件( ) (A)DMA (B)无条件传递进(C)中断(D)条件传递 四、编程 1. 1. 8225A控制字地址为300FH,请按:A口方式0输入,B口方式1输出,C口高位输出,C口低位输入,确定8225A控制字并编初始化程序. 2. 2. 编定一个软件延时1S和1min的子程序.设fosc=6Hz,则一个机器周期1μs。

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单片机汇编语言编程:用定时器控制输出矩形波

80C51单片机的时钟频率为12MHz,利用定时器T1和P1.0输出矩形脉冲。 波形只画出了2段:一段为100us 另一段为50us。 要完全的、完整的、详细的编写此程序的过程!谢谢 ------------------------ 最佳答案: 用一个定时器定时50us,也可以达到题目要求。 在我的空间里面有类似的问题和解答。 ORG 0000H SJMP START ORG 001BH ;T1中断入口. SJMP T1_INT START: MOV TMOD, #20H ;设置T1定时方式2 MOV TH1, #206 ;自动重新装入方式. MOV TL1, #206 ;定时时间 MOV IE, #10001000B ;开放总中断和T1中断. SETB TR1 ;启动T1 MOV R2, #3 ;周期是3×50us SJMP $ ;等着吧. T1_INT: SETB P1.0 ;输出高.

DJNZ R2, T1_END ;R2-1 CLR P1.0 ;减到0,就输出低电平. MOV R2, #3 T1_END: RETI ;中断返回. END ;完. ------------------------ 已知51单片机系统晶振频率为12MHz,请利用定时器1工作方式1,中断方式在P2.3输出频率为10Hz的方波。 写出定时设计过程及完整代码 问题补充:用汇编的麻烦写一下 ------------------------ 最佳答案: ORG 0000H SJMP START ORG 001BH ;T1中断入口. SJMP T1_INT START: MOV TMOD, #10H ;设置T1定时方式1 MOV TH1, #(65536-50000) / 256 ;送入初始值.

51汇编语言程序设计

第四章MCS-51汇编语言程序设计 重点及难点: 单片机汇编语言程序设计的基本概念、伪指令、单片机汇编语言程序的三种基本结构形式、常用汇编语言程序设计。 教学基本要求: 1、掌握汇编语言程序设计的基本概念; 2、掌握伪指令的格式、功能和使用方法; 3、掌握顺序结构、分支结构和循环结构程序设计的步骤和方法; 4、掌握常用汇编语言程序设计步骤和方法。 教学内容 §4.1汇编语言程序设计概述 一、汇编语言的特点 (1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。 (2)使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。 (3)汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。 (4)汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用;但是掌握了一种计算机系统的汇编语言后,学习其他的汇编语言就不太困难了。 二、汇编语言的语句格式 [<标号>]:<操作码> [<操作数>];[<注释>] 三、汇编语言程序设计的步骤与特点 (1)建立数学模型 (2)确定算法 (3)制定程序流程图 (4)确定数据结构 (5)写出源程序 (6)上机调试程序 §4.2伪指令 伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令。 MCS- 51常见汇编语言程序中常用的伪指令:

第四章MCS-51汇编语言程序设计91 1.ORG (ORiGin)汇编起始地址命令 [<标号:>] ORG <地址> 2.END (END of assembly)汇编终止命令 [<标号:>] END [<表达式>] 3.EQU (EQUate)赋值命令 <字符名称> EQU <赋值项> 4.DB (Define Byte)定义字节命令 [<标号:>] DB <8位数表> 5.DW (Define Word)定义数据字命令 [<标号:>] DW <16位数表> 6.DS (Define Stonage )定义存储区命令 [<标号:>] DW <16位数表> 7.BIT位定义命令 <字符名称> BIT <位地址> 8.DA TA数据地址赋值命令 <字符名称> DATA <表达式> §4.3单片机汇编语言程序的基本结构形式 一、顺序程序 [例4-1]三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、5414和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。 MOV R0 ,# 52H ;被加数的低字节地址 MOV R1 ,# 55H ;加数的低字节地址 MOV A ,@ R0 ADD A ,@ R1 ;低字节相加 MOV @ R0 , A ;存低字节相加结果 DEC R0 DEC R1 MOV A ,@ R0 ADDC A ,@ R1 ;中间字节带进位相加 MOV @ R0 , A ;存中间字节相加结果 DEC R0 DEC R1 MOV A ,@ R0 ADDC A ,@ R1 ;高字节带进位相加 MOV @ R0 , A ;存高字节相加结果 CLR A

汇编语言例子

实验三: 1)题目:在内存中从ARRAY开始的连续三个字节单元存放着30H,40H,50H。编制程序将这三个连续的数据传送到内存TABLE开始的单元。 DATA SEGMENT ARRAY DB 30H,40H,50H 定义数据段 TABLE DB 3 DUP (?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,ARRAY LEA DI,TABLE MOV CX,3 REP MOVSB JMP $ CODE ENDS END START (2)题目:把内存2000H和3000H字单元的内容相加,结果存入4000H单元。(不考虑溢出) DATA SEGMENT ORG 2000H DW 1234H ORG 3000H DW 5678H ORG 4000H DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,[2000H] ADD AX,[3000H] MOV [4000H],AX JMP $ CODE ENDS END START 实验四 1、数据传送指令和算术运算指令完成NUM1和NUM2相加,结果放入SUM中。

DATA SEGMENT NUM1 DW 0012H,0030H,0FC21H ; 数1 NUM2 DW 3E81H,44E9H,6D70H ; 数2 SUM D W 3 DUP(?) ; 结果单元 DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV CX,3 LEA SI,NUM1 LEA DI,NUM2 LEA AX,SUM HE: MOV BX,[SI] ADD BX,[DI] MOV [AX],BX INC SI INC DI INC AX LOOP HE MOV AH, 4CH ; 返回DOS INT 21H CODE ENDS END START 2、内存中自TABLE开始的七个单元连续存放着自然数0至6的立方值(称作立方表)。;任给一数X(0≤X≤6)在XX单元,查表求X的立方值,并把结果存入YY单元中。;提示用XLAT指令 DATA SEGMENT TABLE DB 0H,1H,2H,3H,4H,5H,6H XX DB 1 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA BX,TABLE MOV AL,[XX] XLAT MOV DL,AL MOV AH,02H INT 21H JMP $

定时器中断综合实验

实验2 定时器、中断综合实验 一、实验目的 熟悉MCS-51定时器,串行口和中断初始化编程方法,了解定时器的应用,时钟程序的设计与调试技巧。 二、实验内容 编写程序,用定时器中断现实LED跑马灯实验。 实验内容1: 1).用查表法实现LED跑马灯实验; 2).采用定时器控制跑马灯的变化速度。 三、流程框图 四、实验步骤及程序 ORG 0000H LJMP MAIN ORG 000BH ; T0 中断入口地址 MOV TH0,#0BH ; 62.5毫秒定时 MOV TL0,#0DCH DJNZ R2,T0OUT ; 中断16次为1秒 MOV R2,#16 PUSH ACC ; 保存数据 MOVC A,@A+DPTR ; 查表法LED 左右移 MOV P0,A POP ACC INC A CJNE A,#24,T0OUT ; 24种"花样" CLR A T0OUT: RETI ORG 0050H MAIN: MOV SP,#6FH ; MOV R2,#16 ; 定时器中断次数,@12M MOV A,#00H ; 查表起始值 MOV DPTR,#TABLE MOV TMOD,#00000001B ; 定时器方式1 MOV TH0,#0BH ; 62.5MS MOV TL0,#0DCH SETB EA ; 中端总允许 SETB ET0 ; 允许T0 中断 SETB TR0 ; 启动定时 WAIT: SJMP $ ;原地等待中断

RET TABLE:DB 0FEH,0FDH,0FBH,0F7H ;LED 左右移数据表,共有24种"花样" DB 0EFH,0DFH,0BFH,07FH DB 00H,55H,0AAH,00H DB 7FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH DB 00H,0AAH,55H,00H END 思考:换用T1定时器,定时方式2。 用汇编语言编辑8个LED灯,实现第一秒只有L1不亮,其余七个全亮,第二个L2不亮,其余七个全亮 ORG 0000H SJMP START ORG 000BH SJMP T0_INT START: MOV TMOD, #01H MOV TH0, #3CH ; (65536 - 50000) / 256; MOV TL0, #0B0H ; (65536 - 50000) % 256; SETB TR0 SETB ET0 SETB EA MOV A, #01H MOV R2, #20 SJMP $ T0_INT: MOV TH0, #3CH ; (65536 - 50000) / 256; MOV TL0, #0B0H ; (65536 - 50000) % 256; DJNZ R2, T0_END MOV R2, #20 MOV P0, A RL A T0_END: RETI END 实验内容2: 设计一个实时时钟,用42H显示秒单元,用41H显示分单元,用40H显示时单元。要求每满1秒,秒单元内容加1;秒满60,分单元加1,分满60,时单元加1。时满24 ,时分秒全部清0。 从秒到分,从分到时,通过软件累加现实。P115。 ORG 0000H LJMP MAIN ;上电,跳向主程序 ORG 000BH ;T0的中断入口

单片机定时器汇编

我们在学单片机时我们第一个例程就是灯的闪烁,那是用延时程序做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道单片机只能这样工作吗?当然不是,我们能用定时器来实现灯的闪烁的功能。例1:查询方式ORG 0000H AJMP START ORG 30H START: MOV P1,#0FFH ;关所灯 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#15H MOV TL0,#0A0H ;即数5536 SETB TR0 ;定时/计数器0开始运行 LOOP: JBC TF0,NEXT ;如果TF0等于1,则清TF0并转NEXT处(LOOP:JNB TF0,$) AJMP LOOP ;不然跳转到LOOP处运行 NEXT: CPL P1.0 MOV TH0,#15H MOV TL0,#9FH;重置定时/计数器的初值 AJMP LOOP END 键入程序,看到了什么?灯在闪烁了,这可是用定时器做的,不再是主程序的循环了。简单地分析一下程序,为什么用JBC呢?TF0是定时/计数器0的溢出标记位,当定时器产生溢出后,该位由0变1,所以查询该位就可知宇时时间是否已到。该位为1后,要用软件将标记位清0,以便下一次定时是间到时该位由0变1,所以用了JBC指令,该指位在判1转移的同时,还将该位清0.以上程序是能实现灯的闪烁了,可是主程序除了让灯闪烁外,还是不能做其他的事啊!不对,我们能在LOOP:……和AJMP LOOP指令之间插入一些指令来做其他的事情,只要保证执行这些指令的时间少于定时时间就行了。那我们在用软件延时程序的时候不是也能用一些指令来替代DJNZ吗?是的,但是那就要求你精确计算所用指令的时间,然后再减去对应的DJNZ循环次数,很不方便,而现在只要求所用指令的时间少于定时时间就行,显然要求低了。当然,这样的办法还是不好,所以我们常用以下的办法来实现。程序2:用中断实现 ORG 0000H AJMP START ORG 000BH ;定时器0的中断向量地址 AJMP TIME0 ;跳转到真正的定时器程序处 ORG 30H START: MOV P1,#0FFH ;关所灯 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#15H MOV TL0,#0A0H ;即数5536 SETB EA ;开总中断允许 SETB ET0 ;开定时/计数器0允许 SETB TR0 ;定时/计数器0开始运行 SJMP $ ;LOOP: AJMP LOOP ;真正工作时,这里可写任意程序 TIME0:

汇编语言程序设计

《汇编语言程序设计》课程教学大纲 学时:32 学分:2 理论学时:24 实验学时:8 面向专业:电科、电信、通信课程代码:B2700009 先开课程:C语言程序设计课程性质:必修 执笔人:王艳春审定人:陈龙猛、张金政 第一部分:理论教学部分 一、说明 1、课程的性质、地位和任务 本课程属于专业基础课,是电科、电信和通信专业学生必修的核心课程之一,是进一步学习微机原理、操作系统等课程的基础。掌握它有助于提高学生对计算机系统的设计、研究、开发和应用能力。汇编语言是一种面向机器、实践性很强的程序设计语言,必须结合一种实际的计算机来组织教学。因此,本课程选择最广泛使用的IBM PC作为具体的机型来介绍。通过课堂教学和上机实践,培养学生用汇编语言进行编程的思路、方法,养成良好的程序设计习惯,并了解底层I/O 驱动软件的编程方法,熟悉源程序汇编、链接和调试运行的步骤和方法,掌握dos、BIOS功能的调用方法及使用debug工具的调试手段,为后续课的学习打下扎实的基础。 2、课程教学和教改基本要求 课程的目的与教学基本要求:本课程主要介绍汇编语言和宏汇编的基本概念,80X86CPU的指令系统和寻址方式;介绍汇编语言程序格式、伪操作和上机全过程。通过实际例子,详细叙述顺序、分支、循环、子程序等基本程序结构以及程序设计的基本方法和技巧。学习这门课程,应达到以下几个要求: ①掌握汇编语言的基本理论知识和有关概念;掌握用汇编语言编写源程序的基本原则、方法和技巧; ②具有阅读,分析汇编语言程序的能力; ③通过上机实践,能够熟练地掌握汇编语言程序的编辑、汇编、连接、运行 过程及debug工具的调试手段。

汇编教程汇编语言编程实例

汇编语言编程实例一这一章,我们要把我们已学的知识集合起来。具体来讲,我们来写一个使用ODBC APIs的程序.为简单起见,这个程序中我使用Microsoft的Access数据库(Microso ft Access 97) . 注意:如果你使用的windows.inc 是1.18及其以下版本,在开始编译之前要修改其中的一个小bug.在windows.inc中查找 "SQL_NULL_HANDLE",将得到下面这行: SQL_NULL_HANDLE equ 0L 将0后面的"L"删除,象这样: SQL_NULL_HANDLE equ 0 这个程序是一个基于对话框的程序,有一个简单的菜单.当用户选择"connect"时,它将试图连接test.mdb数据库,如果连接成功,将显示由ODBC驱动程序返回的完整连接字符串.接下来,用户可选择"View All Records"命令,程序会使用listview control来显示数据库中的所有数据.用户还可以选择"Query"命令来查询特定的记录.例子程序将会显示一个小对话框提示用户输入想找的人名.当用户按下OK钮或回车键,程序将执行一个查询来查找符合条件的记录.当用户完成对数据库的操作时,可以选择"disconnect"命令与数据库断开连接. 现在看一下源程序: .386 .model flat,stdcall include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\odbc32.inc include \masm32\include\comctl32.inc include \masm32\include\user32.inc includelib \masm32\lib\odbc32.lib includelib \masm32\lib\comctl32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib IDD_MAINDLG equ 101 IDR_MAINMENU equ 102 IDC_DATALIST equ 1000 IDM_CONNECT equ 40001 IDM_DISCONNECT equ 40002 IDM_QUERY equ 40003 IDC_NAME equ 1000 IDC_OK equ 1001 IDC_CANCEL equ 1002 IDM_CUSTOMQUERY equ 40004 IDD_QUERYDLG equ 102 DlgProc proto hDlg:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD

T0作定时器汇编程序中断法

T0作定时器汇编程序(中断法) 单片机T0作定时器实现数码管显示的汇编程序(中断法) 电路是:P0口接数码管的字型码笔段,P2口接数码管的数位选择端. 下面是汇编语言源程序: SECOND EQU 30H TCOUNT EQU 31H ORG 00H LJMP START ORG 0BH LJMP INT0X START: MOV SECOND ,#00H MOV A,SECOND MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B

MOVC A,@A+DPTR MOV P2,A MOV TCOUNT,#00H MOV TMOD,#01H MOV TH0,#(65536-50000)/256 MOV TL0,#(65536-50000) MOD 256 SETB TR0 SETB ET0 SETB EA SJMP $ INT0X: MOV TH0,#(65536-5000)/256 MOV TL0,#(65536-5000) MOD 256 INC TCOUNT MOV A,TCOUNT CJNE A,#20,NEXT MOV TCOUNT,#00H

INC SECOND MOV A,SECOND CJNE A,#60,NEX MOV SECOND,#00H NEX: MOV A,SECOND MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B MOVC A,@A+DPTR

MOV P2,A NEXT: RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END T0工作在方式1,计时50ms,共20个循环,总计时1秒。 P0口显示低位,P2口显示高位,满60清零

DSP 的定时器和外中断实验报告

实验三:DSP 的定时器和外中断 定时器: 一.实验目的 1.通过实验熟悉VC5509A 的定时器; 2.掌握VC5509A 定时器的控制方法; 3.掌握VC5509A 的中断结构和对中断的处理流程; 4.学会C 语言中断程序设计,以及运用中断程序控制程序流程。 二.实验设备 计算机,ICETEK-VC5509-A 实验箱(或ICETEK 仿真器+ICETEK–VC5509-A 系统板+ 相关连线及电源)。 三.实验原理 1.通用定时器介绍及其控制方法(详见spru595b.pdf): TMS320VC5509A 内部有两个20 位通用定时器(GP): * 每个通用定时器包括: - 一个16 位的减计数的计数器TIM; - 一个16 位的定时器周期寄存器PRD; - 一个16 位的定时器控制寄存器TCR; - 一个16 位的定时器预定标寄存器PSCR; * PSCR 寄存器说明: 15 10 9 6 5 4 3 0 Reserved PSC Reserved TDDR PSC: 4 位的预定标值,与TIM 共同组成20 位的定时计数器. TDDR: 预定标周期寄存器(在需要时重装入PSC 的值) TCR 寄存器说明(详见spru595b.pdf) 2.中断响应过程(详见spru595b.pdf): 外设事件要引起CPU 中断,必须保证:IER 中相应使能位被使能,IFR 相应中断也被 使能。在软件中,当设置好相应中断标志后,开中断,进入等待中断发生的状态;外设(如定时器)中断发生时,首先跳转到相应中断高级的服务程序中(如:定时器1 会引起TINT 中断),程序在进行服务操作之后,应将本外设的中断标志位清除以便能继续中断,然后返回。 3.中断程序设计: - 程序中应包含中断向量表,VC5509A 默认向量表从程序区0 地址开始存放,根据IPVD 和IPVH 的值确定向量表的实际地址。 - 注意观察程序中INTR_init()函数的定义部分,其中IPVD 和IPVH 的值都为0x0d0;同时 观察配置文件ICETEK–VC5509-AE.cmd 中的VECT 段描述中o=0x0d000。 - 向量表中每项为8 个字,存放一个跳转指令,跳转指令中的地址为相应服务程序入口地址。第一个向量表的首项为复位向量,即CPU 复位操作完成后自动进入执行的程序入口。 - 服务程序在服务操作完成后,清除相应中断标志,返回,完成一次中断服务 5.实验程序分析:

24个汇编实例小程序

24个汇编小程序 题目列表: 1.逆序输出字符串“BASED ADDRESSING” 2.从键盘上输入两个数,分别放到x,y单元,求出它们的和 3.是编写一段程序,要求在长度为10h的数组中,找出大于42h的无符号数的个数并存入地址为up开始区域,找出小于42h的无符号数的个数并存入地址为down的开始区域 4.键盘输入一段字符串,其中小写字母以大写字母输出,其他字符不变输出 5.从键盘上就收一个小写字母,找出它的前导字符和后续字符,在顺序显示这三个字符 7.把一个包含20个数据的数组M分成两组:正整数组P和负整数组N,分别把这两个数组中的数据的个数显示出来 8.求出首地址为data的100个字数组中的最小偶数,并把它放在ax中 9输入两船字符串string1和string2,并比较两个字符串是否相等,相等就显示“match”,否则显示“no match” 10从键盘接收一个四位的十六进制数,并在终端显示与它等值的二进制数 11从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示计数结果 12有一个首地址为mem的100个字的数组,试编程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零 13.从键盘上输入一串字符(用回车键结束,使用10号功能调用)放在string中,是编制一个程序测试字符串中是否存在数字。如有,则把cl的第五位置1,否则将该位置置0 14.在首地址为data的字数组中,存放了100h的16位字数据,试编写一个程序,求出平均值放在ax寄存器中,并求出数组中有多少个数小于此平均值,将结果放在bx寄存器中(f 分别考虑有符号数、无符号数情况) 15.一直数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。试编制一个程序,把既在A中又在B中出现的整数存放于数组C中 16.设在A、B和D单元中分别存放着三个数。若三个数都不是0,则求出三个数的和并存

汇编语言程序设计

第4章 汇编语言程序设计 §4.1 汇编语言的模式 一、汇编语言源程序的一般模式 [Name 模块名] [Title 标题] [定义宏] [定义数据段] [定义附加段] [定义堆栈段] 定义代码段 源程序结束 中括号括起的部分可以省略,可见在一个汇编语言源程序中必须要定义代码段,并且必须有源程序结束指令。 二、8086汇编语言程序的一个例子 Pg90。 §4.2 语句行的构成 汇编语言中的语句一般分为两种类型:指令性语句和指示性语句。 指令性语句的格式为: [标号:] 助记符 [操作数1[,操作数2]] [;注释] 指示性语句的格式为: [名称] 助记符 [参数1,参数2,……] [;注释] 标号和名称都是编程人员根据需要和一定的规则任意取的。也可以认为汇编语言的语句行是由标记和分隔符(空格)构成。 一、标记 1.IBM宏汇编的字符集 (1)字母 (2)数字符 (3)特殊字符 2.界符 用于定界一个标记的结束或一个标记的开始,本身具有一定的意义。 3.常量 出现在汇编语言源程序中的固定值称为常量。 (1)数值常量 ①二进制:以字母B结束。 ②十进制:以字母D或无字母结束。

③八进制:以字母Q(或O)结束。 ④十六进制:以字母H结束。 (2)字符常量 指用单引号或双引号引起的字符或字符串。 4.标识符 由程序员自己建立的字符序列(标号或名称)。一个标识符不能超过31个字符,不能以数字开头。 5.保留字 汇编语言中具有特殊意义的字符序列。 6.注释 一行中分号以后的部分。用于对一段或一行程序进行说明,便于阅读和理解。 二、符号 具有一定意义的字符序列。 1.寄存器名 2.变量 段属性、偏移属性、类型属性 3.标号 段属性、偏移属性、类型属性 4.常数 5.其它 三、表达式 由操作数和运算符组合而成的序列。 1.操作数 (1)立即数 (2)寄存器操作数 (3)存储器操作数 2.运算符 (1)算术运算符 +、-、*、/、MOD(求余) (2)逻辑运算符 AND、OR、NOT、XOR (3)关系运算符 EQ、NE、LT、LE、GT、GE 结果为“假”时,返回0,结果为“真”时,返回二进制全1。 §4.3 指示性语句

用汇编语言编写的秒表计时器

实验报告十 课程名称:微机原理与接口技术指导老师:李素敏 学生姓冬:向春霞学号:1243013专业:通信工程日期:6月地点:理工603 实验九矩阵键盘检测 一、实验目的和要求 1.掌握利用单片机定时器实现定时。 2.熟悉单片机与数码管的接口技术及数码管动态显示的控制过程。 3.熟悉单片机与键盘的接口技术及按键识别过程。 4.学会如何编制含数码管显示,定时器中断及按键控制等多种功能的综合程序,体会大型程序的编制和调试技巧。 > 二、主要仪器设备 电脑,Keil软件 三、实验内容 1、实验要求: 要求其实现的功能如下(其中定时要求采取中断方式): (1)、用6位数码管显示秒表时间,最左边2位显示分,中间2位显示秒,最右边2位显示秒的小数位(~秒),秒与小数位之间要显示小数点。 (2)、两个按键: ①计时/停止按键:首次按下从0开始计时,再次按下暂停计时,之后每次按 下按键实现'继续计时、暂停计时,继续计时、暂停计时……'。(继续计时即从上次暂停时的时间开始继续计时) ②复位按键:按下后全部清0,等待下次按下'计时/停止按键’时重新开始计时。 2.设计思路: (1)、采用内部脉冲定时,实现计时,最低显示位为10ms记一次数显示一次,即一秒。100个10ms是1秒,所以当低位计满100次,(当50H为10时,把50H 单元清零,向51H进1)即得到秒计时,然后把51H单元清零,给52H单元加1?

当52H为10时,清零,给53H加1,当53H为6时秒计时达到60次,则向分计时,即给54H加1,再给53H清零,当54H计满10时,清零,给55H加4 直到55H为6时给55H清零。 50H z51H放最低位计数 52-53H放秒位次数 54-55H放分位计数 (2)、S2键,用扫描 S2:当为低电平时,让TR0为0,即暂停计数。当再次为低电平时继续计?数, 让TR0=l. (3)、S3键,T1计数模式实现中断响应,复位按键 S3:当F0为0时,给50-55H单元清零;然后按S2开始计数 3.源程序: ORG 0000H AJMP MAIN ORG 000BH LJMPTIME ;定时 ORG 001BH LJMPS3 ;暂停 ORG 0030H MAIN: CLR A MOV 50H,A ;最低位次数 MOV51H,A MOV 52H,A ;秒位次数 MOV 53H,A MOV 54H,A ;分位计数 MOV 55H,A

汇编语言程序实例

一:题目 编写求十进制数12678532与41412042(本人学号)之和的程序,并将和以十进制数的形式送屏幕显示。 二:要求 (1)两个加数均以压缩(组合)十进制数形式存放在ADD1和ADD2为首址的存贮器单元。 (2)和以压缩十进制数的形式存入SUM以下单元。 (3)将和送到屏幕显示部分功能的实现采用子程序的形式。三:算法设计 1:程序 DATAS SEGMENT ;此处输入数据段代码 ADD1 DD 12678532H ADD2 DD 41412042H SUM DD ? DATAS ENDS STACKS SEGMENT STACK 'STACK';此处输入堆栈段代码 DW 100H DUP(?) TOP LABEL WORD STACKS ENDS CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV AX,STACKS MOV SS,AX ; LEA SP,TOP LEA SI,ADD1 LEA DI,ADD2 MOV AL,[SI] ADD AL,[DI] DAA MOV BYTE PTR SUM,AL MOV AL,[SI+1] ADC AL,[DI+1] DAA MOV BYTE PTR SUM+1,AL MOV AL,[SI+2] ADC AL,[DI+2] DAA MOV BYTE PTR SUM+2,AL

MOV AL,[SI+3] ADC AL,[DI+3] DAA MOV BYTE PTR SUM+3,AL MOV AX,WORD PTR SUM+2 CALL DISPAX MOV AX,WORD PTR SUM CALL DISPAX ; MOV AH,4CH INT 21H DISPAL PROC NEAR PUSH AX PUSH CX PUSH DX PUSH AX MOV CL,4 SHR AL,CL CALL CHANG MOV AH,02 MOV DL,AL

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

单片机基础汇编语言编程实例 单片机汇编语言编程 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 码形式存放的十进制数,一

5.7 定时器与外部中断程序设计举例

1 第五章指令系统及应用程序设计 5.7 汇编语言程序设计举例 例5.15 设定时器T0选择工作模式0,定时时间为1ms,fosc=6MHZ (1)试确定T0初值,计算最大定时时间 (2)编程实现其定时功能 (1) 设T0的初值为X,(TL0低5位,TH0高8位) 从X开始加1次数: 213-X 加1一次的时间: Tosc*12=1/6 *12=2μs (213-X) * 1/6 *12=1ms X=7692D=1111000001100B

TL0低5位=01100B=0CH TH0=11110000B=F0H 最大定时时间: 213*1/6*12

(2) ORG 0000H SETB TR0 RESET: AJMP MAIN SETB ET0 ORG 000BH SETB EA AJMP ITOP RET ORG 0100H ORG 0120H MAIN: MOV SP,#60H ITOP: MOV TL0,#0CH ACALL PTOMD MOV TH0,#F0H HERE: AJMP HERE RETI PTMOD: MOV TL0,#0CH MOV TH0,#0F0H

例5.16 将P1口的P1.4~P1.7作为输入位,P1.0~P1.3作为输出位,利用89C51 将开关所设的数据读入单片机内,并通过P1.0~P1.3输出,驱动发光二极管。要求采用中断边沿触发方式,每中断一次,完成一次读/写操作。

Vcc P1.7 EA P1.6 P1.5 X1 P1.4 P1.3 X2 P1.2 P1.1 P1.0 RST INT0 Vss +5V 3133pF 19 1833pF +5V 22uF 1 k Ω 1 k Ω 1 k Ω 200 k Ω38373635 34 33 32 39+5V K 4.7 k Ω89C51+9外部中断INT0电路 图5.13 外部中断INT0电路

常见汇编程序源代码示例

包含14个常见的汇编程序源代码,所有代码在VC6.0中调试通过;汇编程序采用《微机原理接口与技术》(钱晓婕)一书中所用的框架。 目录 1. 编写程序,计算下面函数的值并输出。 (2) 2. 输入一个年份(调用readuid子程序),判断是否是闰年. (2) 3. 输入三个无符号整数(调用readuid子程序),判断并输出这三个数是否能构成一个三角形的三条边。若这三个数能构成一个三角形的三条边,输出三角形的形状:斜三角形、等腰三角形、等边三角形。 (3) 4. 采用无条件和条件转移指令构造while和do while循环结构,完成下面的求和任务并输出sum(sum 为双字)。 (5) 5. 编写程序,求0到100间所有偶数和并输出。要求采用loop、while和do while 三种不同的循环结构完成。 (6) 6. Fibonacci numbers的定义: (8) f1=1,f2=1, fn= fn-1 + fn-2 n>=3 (8) 编程输出Fibonacci numbers的前30项。 (8) 7. 有一个首地址为array的20个有符号的双字数组,编程分别求出正数的和与负数的和并输出。 (10) 8. 有一个首地址为string的字符串,剔除string中所有的空格字符。请从字符串最后一个字符开始逐个向前判断、并进行处理。 (12) 9. 有一个首地址为string的字符串,分别统计string中空格、英文字母、数字和其它字符的个数并输出。 (13) 10. palindrome(回文)是指正读和反读都一样的数或文本。例如:11、121、12321等,编写程序,求10到10000之间所有回文数并输出。要求每行输出10个数。 15 11. 编写程序,求出所有满足勾股定理且边长不大于500的直角三角形。. 17 12. 编写一个求n!的子程序,利用它求1!+2! +3! +4! +5! +6! +7! +8! 的和并输出。 22 13. 编写一个判断闰年的子程序,利用它求出2010年到2060年之间所有的闰年并输出。 (25) 14. 编写一个求解双字型有符号数数组元素的平均值子程序,并验证它的正确性。26

相关主题
文本预览
相关文档 最新文档