汇编语言中断程序设计
- 格式:doc
- 大小:202.50 KB
- 文档页数:5
6502汇编语言程序设计手册一、引言6502汇编语言是一种基于6502微处理器的指令集架构的低级编程语言。
它被广泛应用于上世纪70年代和80年代的家用电脑,如Commodore 64、Apple II等。
由于其广泛的应用和较为简单的指令集,6502汇编语言具有一定的历史意义和学习价值。
二、基础知识1. 6502微处理器6502微处理器是由MOS Technology公司设计制造的一款8位微处理器,于1975年发布。
它的指令集架构简单而灵活,共有56条指令,包括算术运算、逻辑运算、分支、跳转等。
6502微处理器的寄存器包括累加器(A)、X、Y寄存器,以及程序计数器(PC)、状态寄存器(SR)、堆栈指针(SP)等。
2. 汇编语言汇编语言是一种将机器指令和助记符一一对应的低级语言。
通过使用汇编语言编写程序,程序员可以更直接地控制计算机的硬件,实现更高效的程序执行。
在6502汇编语言中,每一条汇编指令都对应着6502微处理器的一条机器指令,因此编写的汇编程序可以直接在6502微处理器上执行。
三、程序设计1. 环境准备在编写6502汇编程序之前,需要准备好能够运行6502汇编程序的环境。
一般来说,可以使用模拟器或原始硬件来进行程序的调试和执行。
有一些模拟器可以在现代计算机上运行,如VICE模拟器,能够模拟Commodore 64的硬件环境,非常适合6502汇编程序的开发。
2. 开发工具6502汇编程序的开发工具主要包括文本编辑器和汇编器。
文本编辑器用于编写汇编程序的源代码,而汇编器则用于将源代码转换成机器码。
经典的6502汇编器包括ACME、DASM等,它们能够将6502汇编语言源代码转换成可执行的二进制文件。
3. 基本语法6502汇编语言的基本语法类似于其他汇编语言,包括标号、指令、操作数和注释等组成部分。
在编写6502汇编程序时,需要注意每条指令的操作数数量和类型,以及指令的执行顺序。
合理地使用标号和注释可以使程序更易读和易于维护。
汇编语言程序设计实验指导【实验提要】以下列举的10个实验,都是以Intel的8086及后续系列微处理器的指令系统为核心,采用宏汇编工具MASM6. X以及调试工具DEBUG或DEBUG32,针对本教材所述内容进行相关的上机实践。
旨在帮助学生加深认识和理解理论教学知识,通过大量的上机实验熟悉8086 CPU的指令功能、用途和使用技巧,进而提高汇编语言程序设计的能力。
(带*号的为选作内容)实验一调试工具DEBUG的应用实验目的通过实验掌握下列知识:1、8086指令: MOV,ADD,ADC,SUB,SBB,DAA,XCHG的功能;2、DEBUG命令: A,D,E,F,H,R,T,U的使用;3、BCD码、ASCII码及用十六进制数表示二进制码的方法;4、寄存器: AX,BX,CX,DX,FLAGS,IP。
内容及步骤注:本次实验可以参照教材上关于DEBUG的叙述内容进行。
一、DEBUG 命令使用1、开机后,切换到命令提示符窗口下,出现提示符后键入命令DEBUG, 进入调试环境,显示提示符 '- '。
2、用命令 F 200 220 'AB' 将'AB'的两个ASCII码循环填入内存。
注:第一个参数200是当前段的起始偏移地址,第二个参数220是终了偏移地址,第三个参数‘AB’是被填入的数值,若不给出第二个参数则填入128(8行)个字节。
3、用命令 D200 观察内存中的十六进制码及屏幕右边的ASCII字符。
4、用命令 F230 23F 12 重复上二项实验,观察结果并比较。
5、用命令 E200 41 42 43 44 45将A-E的ASCII码写入地址为200开始的内存单元中,再用D命令观察结果,看键入的十六进制数和ASCII码的对应关系。
6、用H命令检查下列各组十六进制数的和与差(补码表示):(1)56H,34H (2)23H,45H (3)AB,3045H注:输入 H 12 34 则在下一行显示0046 FFDE,即二者的补码和与差。
第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
windows环境下32位汇编语言程序设计附书代码汇编语言是一种底层计算机语言,用于编写与计算机硬件直接交互的程序。
在Windows环境下,可以使用32位汇编语言进行程序设计。
本文将介绍一些常见的32位汇编语言程序,并附带相关的代码示例。
1.程序的基本结构:在32位汇编语言中,程序的基本结构由三个部分组成:数据段、代码段和堆栈段。
数据段用来声明和初始化程序中使用的全局变量和常量。
例如,下面的代码段声明了一个全局变量message,存储了一个字符串。
```data segmentmessage db 'Hello, World!',0data ends```代码段包含了程序的实际执行代码。
下面的代码段使用`mov`指令将message变量中的字符串存储到寄存器eax中,并使用`int 21h`来调用MS-DOS功能1来显示字符串。
```code segmentstart:mov eax, offset messagemov ah, 09hint 21hmov ah, 4chint 21hcode ends```堆栈段用来存储函数调用过程中的局部变量和返回地址。
2.入栈和出栈操作:在程序中,我们经常需要使用堆栈来保存和恢复寄存器的值,以及传递函数参数和保存函数返回值。
以下是一些常用的堆栈操作指令: ```push reg ;将reg中的值压入堆栈pop reg ;将堆栈顶部的值弹出到reg中```下面的示例演示了如何使用堆栈来保存和恢复寄存器的值:```code segmentstart:push eax ;将eax保存到堆栈mov eax, 10 ;设置eax的值为10pop ebx ;将堆栈顶部的值弹出到ebxadd eax, ebx ;将eax和ebx相加int 3 ;调试中断,用于程序的暂停mov ah, 4chint 21hcode ends```3.条件判断和跳转指令:汇编语言中的条件判断和跳转指令用于根据条件的成立与否来改变程序的执行流程。
LPC2000系列中断嵌套设计1.中断服务程序的编译器支持ARM编译器提供为编写FIQ和IRQ中断服务程序而设置的关键字,它们可以用于C函数前,所以可以C编写整个中断服务程序。
下面就是一个在Keil ARM编译器环境下的典型例子:void IRQ_Handler __irq{// Clear the source of the interrupt// Additional statements// Update the VIC by writing to VIC Vector Address Register}通过使用__irq关键字,编译器将为上面的函数添加下面的代码(1)在函数入口处,工作寄存器(包括ATPCS的敏感(易被破坏的)寄存器)被压栈;(2)在函数返回处,出栈上面保存的寄存器;(3)使用SUBS PC,R14,#4从中断服务程序中返回。
这条指令恢复了PC和CPSR。
注意:使用这个关键字的情况下,SPSR_irq没有被保存。
这就是使用关键字的方法处理中断不能实现嵌套的一个原因。
2.使用关键字来处理中断嵌套时出现的问题两个主要的原因都是跟LR_irq和SPSR_irq这两个寄存器有关。
如果一个中断服务程序重新使能中断,调用一个子程序,在子程序中发生了中断,这时,子程序的返回地址(保存在LR_irq中)将被破坏。
下面我们以一个例子来说明:void IRQ_Handler __irq{//reenable intertupts......foo();//地址A}当PC跳转到IRQ_Handler的时候(执行完0x18处的指令后),从ISR返回的地址已经写入LR_irq了。
假定它已经压栈(SP_irq)了。
现在,foo()函数被调用,LR_irq的值被foo调用处的下一条指令的地址所覆盖。
再进一步假设,在foo函数中运行的时候,一个更高优先级的中断发生了。
这时,LR_irq又被返回到foo函数被中断的地方的地址所覆盖,所以这就破坏了返回到IRQ_Handler的地址(即上面的函数中的" 地址A":译者注)。
汇编语言(四)分支结构程序设计分支结构是计算机程序设计中常用的一种控制结构,它根据一些条件的真假决定程序的执行路径。
在汇编语言中,我们可以使用条件分支指令来实现分支结构的程序设计。
常用的条件分支指令有以下几种:1.无条件跳转指令(JMP):该指令用于无条件跳转到指定的地址。
例如,JMPLABEL指令会跳转到LABEL标记的位置。
2.条件跳转指令:根据一些条件的真假决定是否跳转到指定的地址。
常用的条件跳转指令有以下几种:-跳转指令(JZ、JNZ):根据零标志位(ZF)的状态来判断是否跳转。
如果ZF为1,则跳转;如果ZF为0,则不跳转。
-跳转指令(JC、JNC):根据进位标志位(CF)的状态来判断是否跳转。
如果CF为1,则跳转;如果CF为0,则不跳转。
-跳转指令(JS、JNS):根据符号标志位(SF)的状态来判断是否跳转。
如果SF为1,则跳转;如果SF为0,则不跳转。
-跳转指令(JO、JNO):根据溢出标志位(OF)的状态来判断是否跳转。
如果OF为1,则跳转;如果OF为0,则不跳转。
-跳转指令(JP、JNP):根据奇偶标志位(PF)的状态来判断是否跳转。
如果PF为1,则跳转;如果PF为0,则不跳转。
-跳转指令(JA、JNA):根据无符号数比较结果来判断是否跳转。
如果无符号数比较结果为大于,则跳转;如果无符号数比较结果为小于或等于,则不跳转。
-跳转指令(JB、JNB):根据无符号数比较结果来判断是否跳转。
如果无符号数比较结果为小于,则跳转;如果无符号数比较结果为大于或等于,则不跳转。
-跳转指令(JAE、JNAE):根据无符号数比较结果来判断是否跳转。
如果无符号数比较结果为大于或等于,则跳转;如果无符号数比较结果为小于,则不跳转。
-跳转指令(JBE、JNBE):根据无符号数比较结果来判断是否跳转。
如果无符号数比较结果为小于或等于,则跳转;如果无符号数比较结果为大于,则不跳转。
-跳转指令(JE、JNE):根据有符号数比较结果来判断是否跳转。
第四章教学实施计划3课堂教学实施计划第 8 课教学过程设计:复习 0 分钟;授新课 100 分钟讨论 0 分钟;其它 0 分钟授课类型(请打√):理论课√讨论课□实验课□习题课□其它□教学方式(请打√):讲授√讨论□示教□指导□其它□教学手段(请打√):多媒体√模型□实物□挂图□音像□其它□4.1 汇编语言程序设计概述程序实际上是一系列计算机指令的有序集合。
我们把利用计算机的指令系统来合理地编写出解决某个问题的程序的过程,称为程序设计。
程序设计是单片机应用系统设计的重要组成部分,单片机的全部动作都是在程序的控制下进行的。
随着芯片技术的发展,很多标准的或功能型的硬件电路都集成到了芯片中,所以,软件设计在单片机应用系统开发中占的比重越来越大。
一、汇编语言和高级语言汇编语言:用助记符表示的指令称为汇编语言,用汇编语言编写的程序称为汇编语言源程序汇编语言也是面向机器的,它仍是一种低级语言。
汇编语言离不开具体计算机的硬件,与硬件紧密相关。
高级语言:高级语言不受具体“硬件”的限制,具有通用性强,直观、易懂、易学,可读性好等优点。
多数的51单片机用户使用C语言来进行程序设计。
C语言已经成为人们公认的高级语言中高效、简洁而又贴近51单片机硬件的编程语言。
二、汇编语言的特点•助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。
•使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。
•汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。
•汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用。
三、汇编语言的语句格式•指令语句:每一条指令语句在汇编时都产生一个指令代码(也称机器代码),执行该指令代码对应着机器的一种操作。
SSEG SEGMENT STACK ;定义堆栈段STLBL DW 32 DUP(?)SLEN=($-STLBL+15)/16 ;SLEN为堆栈段的节数SSEG ENDSCSEG SEGMENTASSUME CS:CSEG,SS:SSEGINT_1CH PROC ;定义新的1CH号中断服务程序PUSH AX ;保护现场PUSH BXPUSH CXPUSH DXPUSH BPPUSH ESMOV AX,CSMOV ES,AXMOV AH,0FH ;功能号0FH→AH,准备读取当前显示参数INT 10H ;调用功能,读取当前显示参数MOV CS:[PAGENO],BH ;保存当前显示页号MOV AH,03H ;功能号03H→AH,准备读取当前页的光标位置INT 10H ;调用功能,读取当前页的光标位置CMP DH,23 ;当前光标所在行号与23比较JNA DISP ;若未超过23,转DISPMOV AH,06H ;若超过23,功能号06H→AH,准备将第0~23行向上滚动一行MOV AL,1 ;设置滚动行数为1MOV CH,0 ;设置滚动区左上角行号为0MOV CL,0 ;设置滚动区左上角列号为0MOV DH,23 ;设置滚动区右下角行号为23MOV DL,79 ;设置滚动区右下角列号为79MOV BH,07H ;设置新滚入行(新的第23行)的显示属性为07H(黑底白字) INT 10H ;调用功能,实现滚屏MOV AH,02H ;功能号02H→AH,准备设置光标位置MOV BH,CS:[PAGENO] ;取当前显示页号→BHMOV DH,23 ;设置光标所在行号为23MOV DL,0 ;设置光标所在列号为0INT 10H ;调用功能,完成光标位置设置,光标位置(23,0)DISP: DEC CS:[TIMER] ;定时计数器TIMER减1JNZ EXIT ;若未计到0,本次不做移动显示,转到EXITMOV CS:[TIMER],2 ;若已计到0,则将TIMER恢复为初值2,并准备进行一 ;次移动显示MOV AH,13H ;功能号13H→AH,准备进行一次字符串显示MOV BH,CS:[PAGENO] ;当前显示页号→BHMOV BL,07H ;移动显示字符串的显示属性→BL,为黑底白字MOV DH,24 ;显示所在行号24→DHMOV AL,0 ;字符串显示方式0→ALMOV DL,CS:[HEAD] ;本次显示的串首位置(列号)→DLCMP DL,0 ;判断串首是否已经移出屏幕左边界(第0列)JL NSH ;若串首已移出屏幕左边界,则转NSH,计算应从哪个字符开始显示 LEA BP,CS:[STR] ;否则,将实际串首的偏移地址→BP,段地址已在ES中 MOV CX,SLEN ;需显示的字符串原始长度→CXCMP CS:[TAIL],78 ;判断本次显示的串尾是否已进入屏幕右边界(第78列) JLE SHOW ;若串尾已进入右边界,则转SHOW,按串的原始长度完整显示串 ADD CX,78 ;否则,计算需显示的实际串长SUB CL,CS:[TAIL]SBB CH,0JMP SHOW ;转SHOW,按求得的实际串长显示串NSH: LEA CX,CS:[STR] ;下面计算本次应从串的第几个字符开始显示NEG DLADD CL,DLADC CH,0MOV BP,CX ;将开始字符的偏移地址→BP,段地址已在ES中XOR CH,CH ;下面计算本次实际需显示的串长MOV DL,CHMOV CL,CS:[TAIL]INC CX ;实际需显示的串长→CXSHOW: INT 10H ;调用功能,完成本次字符串显示DEC CS:[HEAD] ;一次显示完成后,修改串首和串尾位置,为下一次做准备 DEC CS:[TAIL]CMP CS:[TAIL],0 ;判断串尾是否已移出屏幕左边界JGE EXIT ;若尚未移出,则转EXIT,准备结束本次操作MOV CS:[HEAD],78 ;若已移出,则重新初始化串首串尾位置,准备下一轮 MOV CS:[TAIL],78+SLEN-1EXIT: ;此处,新1CH号中断服务完成,准备调用原1CH号中断服务程序,兼顾其他 ;用户的需求;下面为原1CH号中断服务程序的返回,将标志寄存器和返回点地址入栈PUSHF ;标志寄存器内容入栈PUSH CS ;返回点的段地址(即当前CS)入栈LEA AX,RETPT ;取返回点的偏移地址PUSH AX ;返回点的偏移地址入栈JMP DWORD PTR CS:[OLD_1CH_IP] ;用段间转移转入原1CH号中断服务程序 RETPT: POP ES ;恢复现场POP BPPOP DXPOP CXPOP BXPOP AXIRET ;中断返回;;下面定义1CH中断服务程序所需的变量PAGENO DB ? ;用于保存当前显示页号HEAD DB 78 ;串首位置(列号),初始值78,为屏幕右边界位置STR DB 'THIS IS MY COMPUTER',20H ;需显示的字符串,以空格符(20H)结束 SLEN=$-STR ;SLEN为串长TAIL DB 78+SLEN-1 ;串尾位置(列号),初始值78+SLEN-1,在屏幕右边界之外 TIMER DB 2 ;定时计数器,初始值2,控制每隔2/18.2秒移动显示一次OLD_1CH_IP DW ? ;用于保存原来的1CH号中断向量的偏移地址OLD_1CH_CS DW ? ;用于保存原来的1CH号中断向量的段地址;INT_1CH ENDP ;1CH号中断服务程序定义结束;CLEN=($-INT_1CH+15)/16 ;需驻留内存的代码节数;;下面是主程序部分,保存原1CH号中断向量,设置新1CH号中断向量,并完成驻留 START: MOV AH,35HMOV AL,1CHINT 21HMOV CS:[OLD_1CH_IP],BXMOV CS:[OLD_1CH_CS],ES;MOV DX,OFFSET INT_1CHMOV AX,SEG INT_1CHMOV DS,AXMOV AL,1CHMOV AH,25HINT 21H;MOV AH,31HMOV AL,00HMOV DX,STLEN+CLEN+16INT 21HCSEG ENDSEND START。
汇编语言程序设计实验报告
学院:计算机科学与技术专业:计算机科学与技术班级:计科131
LEA DX,FNAME
MOV CX,0 ;语句1
INT 21H
JC EXIT
MOV FNUM,AX
MOV BX,AX ;语句2
MOV CX,100
MOV AH,40H
LEA DX ,BUF
INT 21H
MOV BX,FNUM
MOV AH,3EH
INT 21H
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START
使用相应的文本编辑器建立文件,内容如上所示。
2.汇编并运行此程序后,在当前目录建立的文件名是什么其内容是什么
1>汇编:
C:\masm> masm lab7;
2>连接:
C:\masm> link lab7;
3>运行:
C:\masm> lab7
3.若将语句1 改为mov cx,1,则运行情况与前面会有什么区别
4.若将语句1 改为mov cx,2,则运行结果同上会有什么不同并简要说明此语句的作用.
5.若将语句2 改为mov bx,1,则运行结果会有什么不同简要说明则语句的作用.
实验二:编写0 号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回到DOS。
源程序下:
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset do
mov ax,0
mov es,ax
mov di,200h
mov cx,offset doend-offset do ;安装中断例程cld
rep movsb
mov word ptr es:[0],200h
mov word ptr es:[2],0 ;设置中断向量表
mov dx,0ffffh
mov bx,1 ;测试一下
div bx
mov ax,4c00h
int 21h
do:jmp short dostart
db 'divide error!'
dostart:
mov ax,0
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,160*12+60
mov cx,13
s:
mov al,ds:[si]
mov ah,15
mov es:[di],ax
inc si
inc di
inc di
loop s
mov ax,4c00h
int 21h
doend:nop
code ends
end start
实验结果3.若将语句1 改为mov cx,1,文件为只读。
4.若将语句1 改为mov cx,2,文件为隐藏。
5.若将语句2 改为mov bx,1,在屏幕上显示写入的字符。
实验总结
这次实验没有花费很多时间,因为代码都是现成的,就只按照要求修改代码并运行,比较了其之间的不同。
实验二修改了在屏幕上显示的字符的颜色和位置,但是背景色还是没能修改成功。
指
导
教
师
意
见签名:年月日。