汇编语言中断程序设计
汇编语言分支结构程序设计技巧
《 编语 言程 序 设 计 》 高 等 院 校计 算 机 专 业 教 学 体 系 中的 汇 是 门重 要 的专 业 基 础 课 程 r1 汇编 语 言是 能 够 充 分 发 挥计 算 机 1。 所 有硬 件 特 性 并 能 直 接 控 制 硬 件 的 最 快 、 有 效 的语 言 。 和 计 最 它 算 机 的 硬 件 系 统 紧 密 联 系 .本 文 主 要 讨 论 8 8/0 8的 汇 编 语 0 68 8 言 。汇 编 语 言 是 结 构 化 的 『1结 构 化 编程 技 术 简 化 了程 序 实 现 , 2,
一
指 令 的通 用格 式是 : 件 标 号 , 件 转 移 指 令 的 功 能 是 : 果 J条 条 如 条 件 成 立 , 转 到 标 号 所 标 明 的指 令 去 执 行 ; 果 条 件 不 成 立 , 则 如 则顺序执行。 由此 可 以得 到 , 号 处 是 ” ” 标 Y 分支 , 紧跟 条件 转 移 指
这 里我 们 以这 样 的一 个 例 子 为 例 进 行 介 绍 : 已定 义 了 两个 整 数 变 量 A和 B. 编 写程 序完 成 以下 功 能 : 试 1 若 两 个 数 中 有 一 个 是 奇 数 , 将 奇 数 存 入 A 中 , 数 存 ) 则 偶
入 B中。
2 若 两个 数 均 为 奇 数 . 将 两 数 均 加 l 存 回原 变量 。 ) 则 后 3 若 两个 数 均为 偶 数 . 两 个 变 量 均 不 变 。 ) 则 首先 , 我们 对 题 意 进 行 分 析 。变 量 A 和 B的 奇偶 情 况 有 四
要 是 用条 件 转 移 指 令 来 实现 的 , 文 结 合 汇 编 语 言 中条 件 转 移 指 令 的特 点及 作 者 多年 的 教 学 经验 提 出 了设 计 分 支结 构程 序 本
汇编语言程序设计方法
C 名字前加 下划线
从右到左 调用程序
是
SYSCALL
从右到左 被调用程序
是
STDCALL 名字前加
下划线 (注)
被调用程序
是
PASCAL 名字变大写
BASIC 名字大写
FORTRAN 名字大写
从左到右 被调用程序
是
从左到右 被调用程序
是
从左到右 被调用程序
是
12
PROTO是过程声明伪指令,用于事先声明过程的结构。它的格 式如下:
结束处理部分
AGAIN: ADD AX,CX
;从20,19,……2,1倒序累加到AX
LOOP AGAIN ;每循环一遍,CX自动减1
MOV SUM,AX ;将累加和送入SUM单元
.EXIT 0
END
初始化部分
循环结束? 是 否
工作部分 修改部分 结束处理部分
7
二、用MASM 6.x循环控制伪指令实现循环结构
.CODE
.STARTUP
MOV AL, B
IMUL AL
MOV BX,AX MOV AL,A
;BX中为B的平方
IMUL C
MOV CX,4
IMUL CX
;AX中为4AC
.IF SWORD PTR BX>=AX ;比较B的平方和4AC的大小
MOV SIGN,1
;条件成立,SIGN得到1
.ELSE
MOV SIGN,0
.IF 条件表达式 ;条件为真(非0),执行分支体
分支体
[.ELSEIF 条件表达式
分支体
;前面IF条件为假,并且当前ELSEIF条件为真执行分支体
[.ELSE
;前面IF条件为假执行分支体
汇编语言程序设计
第4章 汇编语言程序设计
例4.4 显示两位压缩BCD码值(00~99) ,要求不显示前导0。 本例一方面要排除前导0的情况,另一方面 对于全0情况又必须显示一个0,所以形 成了两个双分支结构的程序。
第4章 汇编语言程序设计 DATA SEGMENT BCD DB 04H ; 给出一个BCD码数据 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA BEGIN: MOV AX, DATA MOV DS, AX MOV DL,BCD ;取BCD码 TEST DL,0FFH ;如果这个BCD码是0,则显示为0 JZ ZERO TEST DL,0F0H ;如果这个BCD码高位是0,不显示 JZ ONE MOV CL,4 ;BCD码高位右移为低位 SHR DL,CL OR DL,30H ;转换为ASCII码 MOV AH,2 ;显示 INT 21H
第4章 汇编语言程序设计 ADC MOV MOV MUL ADD DX,0 W+4,DX AX,A B+2 W+2,AX ;部分积2的高16位与进位相加 ;结果保存到从W+4开始的内存单元 ;取被乘数的低16位 ;与乘数的高16位相乘,得到部分积3 ;部分积3的低16位与W+2开始的内存单元相加 ;结果保存在从W+2开始的内存单元 ;部分积3的高16位与W+4开始的内存单元及 ;进位相加,结果保存在从W+4开始的内存单元 ;把进位值保存在从W+6开始的内存单元 ;取被乘数的高16位 ;与乘数的高16位相乘,得到部分积4 ;部分积4的低16位与W+4开始的内存单元相加 ;结果保存在从W+4开始的内存单元 ;部分积4的高16位与W+6开始的内存单元及 ;进位相加,结果保存在从W+6开始的内存单元
6502汇编语言程序设计手册
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,即二者的补码和与差。
汇编语言程序概述、功能与设计
汇编语言(Assembly Language)
指用指令助记符代替机器码的编程语言。汇编语 言程序结构简单,执行速度快,程序易优化,编译后 占用存储空间小,是单片机应用系统开发中最常用的 程序设计语言。汇编语言的缺点是可读性比较差,只 有熟悉单片机的指令系统,并具有一定的程序设计经 验,才能研制出功能复杂的应用程序。
(a) 单汇分编支语流言程程序; 概述(b、)功多能分支流程
和设计
例 3 x, y均为8位二进制数, 设 x存入R0, y存入R1, 求解:
1
x0
y
1
x0
0
x0
汇编语言程序概述、功能 和设计
程序如下: START: CJNE R0, #00H, SUL1; R0中的数与00比较不等转移
MOV R1, #00H; 相等, R1← 0 SJMP SUL2 SUL1: JC NEG ; 两数不等, 若(R0)<0, 转向NEG MOV R1, #01H ; (R0)>0, 则 R1←01H SJMP SUL2 NEG: MOV R1, #0FFH ; (R0)<0, 则 R1←0FFH SUL2: RET
汇编语言程序概述、功能 和设计
机器语言(Machine Language)
直接用机器码编写程序、能够为计算机直接执行 的机器级语言。机器码是一串由二进制代码“0”和“1”组 成的二进制数据,其执行速度快,但是可读性极差。 机器语言一般只在简单的开发装置中使用,程序的设 计、输入、修改和调试都很麻烦。
汇编语言程序概述、功能 和设计
例 4 比较两个无符号数的大小。 设外部 RAM 的存储单元 ST1和 ST2中存放两个不带符号的二进制
第四章-汇编语言程序的设计
第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
windows环境下32位汇编语言程序设计附书代码
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.条件判断和跳转指令:汇编语言中的条件判断和跳转指令用于根据条件的成立与否来改变程序的执行流程。
第4章 MCS-51单片机汇编语言程序设计
程序清单:
送转移地址序号
A,R3 ;取序号 A ;序号乘2 DPTR, #JTAB ;32个子程序 首地址送DPTR JMP @A+DPTR ;根据序号转移 JTAB: AJMP ROUT00 ;32个子程序首地址 AJMP ROUT01 … MP: MOV RL MOV AJMP ROUT31
第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计
【例4-1】
双字节二进制数求补。
程序说明:对R3(高8位)、R2(低8位)中的二进制定 点数取反加1即可得到其补码。
开始
程序清单:
BINPL:MOV A,R2 CPL A ADD A,#01H MOV R2,A MOV A,R3 CPL A ADDC A,#00H MOV R3,A RET ;低位字节取反 ;加1 ;低位字节补码送R2 ;高位字节取反 ;加进位 ;高位字节补码送R3
散转生成正确偏移号
置换指令地址表首址
转入R3指示的程序
AJMP
……
AJMP
第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计
3.循环程序
包括:循环初始化、循环处理、循环控制
开始 置初值 循环体 循环结束? Y 循环修改 N 循环体 循环结束? N Y 结束 循环修改 结束 开始 置初值
;调用查表子程序 ; 暂存R1中 ;调查表子程序 ;平方和存A中 ;等待
取第一个数→A 调查表子程序 结果存入R1 取下一个数→A 调查表子程序 两数平方相加 存结果
子程序清单:
SQR: INC A ;加RET占的一个字节 MOVC A,@A+PC ;查平方表 RET TAB: DB 0,1,4,9,16 DB 25,36,49,64,81 END
LPC2000系列中断嵌套设计
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":译者注)。
6502汇编语言程序设计(2版)之程序设计part1
(一)
一. CPU 对命令的执行
6502是普通的8位CPU.它需要外接其他器件(如:SRAM、EPROM、定时/计数器、I/O接口器件等)才能工作,它地址线为16,直接寻址能力为64K($0000--$FFFF)之间. 数据线为8,一次只能完成8位数据(0--255)的处理. CPU通过地址线联系到要操作的内存单元,然后读取该单元的操作码,通过预设好了的操作码所代表的操作,CPU对其进行相应命令执行. 例如对命令 ASL 的执行,假设程序计数(PC)=$7000 , ($7000)=$0A .
[]中的内容为可选项
标号 标号标识了一条指令的位置,可以使用标号作为访问该指令的地址,标号的格式应遵循下面规则:
.必须从第一列开始或者以: 结束
. 不能用操作代码或伪指令的名字命名
. 标号长度为1~28个字符(视各汇编而定)
ror
jmp MULCH02
MULCH08:
rts
例3.
;无符号整型数除法
;($A2|$A1)/($A4|$A3)=$A2|$A1).........($A6|$A5)
;结果 , 商:($A2|$A1) 余数:($A6|$A5)
;说明: C=0有效, C=1 无效(除数为0)
3. $0200--$0700(cheapchange注:综合上下文,应为0200--07FF) 公共内存区 (1.5K字节)
4. $0800--$1FFF $0000 -- $0700的镜像. 连做了3次镜像(6K字节)
汇编语言程序设计debug调试命令
标志位:
“1”
“0”
OF:溢出标志 —— OV溢出, NV没溢出
DF:方向标志 —— DN减量, UP增量
IF:中断允许标志 —— EI允许, DI禁止
SF:符号标志 —— NG负数, PL正数
ZF:“0”标志
—— ZR为“0”, NZ不为“0”
下次课预习内容:顺序结构程序设计
要求:1、实验指导书及实验报告上的预习内容 2、预习验收时要提供设计的源程序磁盘或笔写程序
-E CS:211 21 2A
;从CS:211H开始输入2个字节的内容
-E 110 ‘anything’
;输入从DS:110H开始的字符串
⑹ D(显示存储器的内容):
默认寄存器是DS,格式是:
-D段地址:偏移地址
;显示80H个字节的内容。
-D
显示从上一次结束处开始的80H个字节 的内容。
⑺ R(显示修改寄存器内容) -R ;显示所有寄存器内容。 -RDS ;显示并可修改DS的内容。 -RF ;显示并可修改标志寄存器
实验数据记录注意事项:
1、实验报告第三页:表格中标志位与计算机 自动给出的不是一一对应的,要求记录1/0
2、实验报告第四、五页:列出调试运行后的程序清单
因为行汇编不识别标号,所以:用行汇编运行的程
序中没有行号,转移指令处是绝对地址。
验收内容:
1、用T命令执行完程序最后一条指令处的界面:
-T =段地址:0
-G=段地址:偏移地址
-G
;从程序当前位置执行到
程序结束
-G =200 260
;从指定200H地址开始执行, 遇到断点
汇编语言(四)分支结构程序设计
汇编语言(四)分支结构程序设计分支结构是计算机程序设计中常用的一种控制结构,它根据一些条件的真假决定程序的执行路径。
在汇编语言中,我们可以使用条件分支指令来实现分支结构的程序设计。
常用的条件分支指令有以下几种: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):根据有符号数比较结果来判断是否跳转。
第4章-汇编语言程序设计教案
第四章教学实施计划3课堂教学实施计划第 8 课教学过程设计:复习 0 分钟;授新课 100 分钟讨论 0 分钟;其它 0 分钟授课类型(请打√):理论课√讨论课□实验课□习题课□其它□教学方式(请打√):讲授√讨论□示教□指导□其它□教学手段(请打√):多媒体√模型□实物□挂图□音像□其它□4.1 汇编语言程序设计概述程序实际上是一系列计算机指令的有序集合。
我们把利用计算机的指令系统来合理地编写出解决某个问题的程序的过程,称为程序设计。
程序设计是单片机应用系统设计的重要组成部分,单片机的全部动作都是在程序的控制下进行的。
随着芯片技术的发展,很多标准的或功能型的硬件电路都集成到了芯片中,所以,软件设计在单片机应用系统开发中占的比重越来越大。
一、汇编语言和高级语言汇编语言:用助记符表示的指令称为汇编语言,用汇编语言编写的程序称为汇编语言源程序汇编语言也是面向机器的,它仍是一种低级语言。
汇编语言离不开具体计算机的硬件,与硬件紧密相关。
高级语言:高级语言不受具体“硬件”的限制,具有通用性强,直观、易懂、易学,可读性好等优点。
多数的51单片机用户使用C语言来进行程序设计。
C语言已经成为人们公认的高级语言中高效、简洁而又贴近51单片机硬件的编程语言。
二、汇编语言的特点•助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。
•使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。
•汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。
•汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用。
三、汇编语言的语句格式•指令语句:每一条指令语句在汇编时都产生一个指令代码(也称机器代码),执行该指令代码对应着机器的一种操作。
例5.3程序-汇编语言程序设计教程-陆遥-清华大学出版社
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。
第四章 汇编语言程序设计基础
4.2.2 分支程序的设计方法 ★条件控制 ★逻辑尺控制 ★地址跳转表控制
1. 条件控制——利用比较和条件转移指令实现分支,是最常用的 程序设计方法。
பைடு நூலகம்
例如,求解函数:
练习题2. 编写程序,比较两个字符串STRING1和STRING2所 含字符是否完全相同,若相同则显示“MATCH”,若不同则显示 “NO MATCH”。 答案: datarea segment string1 db ‘asfioa’ ;定义字符串STRING1 string2 db ‘xcviyoaf’ ;定义字符串STRING2 mess1 db ‘MATCH’,’$’ ;定义显示字串“MATCH” mess2 db ‘NO MATCH’,’$’ ;定义显示字串“NO MATCH” datarea ends prognam segment main proc far assume cs:prognam,ds:datarea start: push ds ;将ds:00入栈 sub ax,ax push ax mov ax,datarea ;装填数据段及附加段 mov ds,ax mov es,ax
程序流程图
mov ch,4 rotate: mov cl, 4 rol bx,cl mov al,bl and al,0fh add al,30h ;’0’-’9’ ASCII 30H-39H cmp al,3ah jl printit add al,7h ;’A’-’F’ ASCII 41H-46H printit: mov dl,al mov ah,2 int 21h dec ch jnz rotate
例4.3 将首地址为A的N字数组按照从小到大的次序整序(气 泡算法,多重循环) A dw 32,85,16,15, 8
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言程序设计实验报告
学院:计算机科学与技术专业:计算机科学与技术班级:计科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,在屏幕上显示写入的字符。
实验总结
这次实验没有花费很多时间,因为代码都是现成的,就只按照要求修改代码并运行,比较了其之间的不同。
实验二修改了在屏幕上显示的字符的颜色和位置,但是背景色还是没能修改成功。
指
导
教
师
意
见签名:年月日。