第5章 汇编语言与程序设计_第1页
第5章 汇编语言与程序设计_第2页
第5章 汇编语言与程序设计_第3页
第5章 汇编语言与程序设计_第4页
第5章 汇编语言与程序设计_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第 5 5 章章 5.1 汇编语言基础汇编语言基础n 计算机语言包括:面向机器的语言面向机器的语言机器语言机器语言汇编语言汇编语言高级语言高级语言n 汇编语言:用助记符表示指令汇编语言:用助记符表示指令n 汇编语言源程序:用汇编语言编写的程序汇编语言源程序:用汇编语言编写的程序n 汇编程序:编译汇编语言源程序的程序汇编程序:编译汇编语言源程序的程序程序设计与执行过程建立源程序建立源程序(文件名文件名.ASM)编译成目标文件编译成目标文件(文件名文件名.OBJ)生成可执行文件生成可执行文件 (文件名文件名.EXE)调试和运行程序调试和运行程序用编辑软件用编辑软件(如如EDIT.EXE)用汇编程

2、序用汇编程序(如如TASM.EXE)用链接程序用链接程序(如如TLINK.EXE)用调试程序用调试程序(如如TD.EXE)也可直接运行可执行文件也可直接运行可执行文件 汇编语言包括的语句n 指令性语句: CPU执行的指令,编译后生成目标代码, 要求的操作在执行程序时完成。n 指示性语句: CPU不执行的指令,编译后生不生成目标代码, 要求的操作由汇编程序完成。下面分别介绍下面分别介绍指令性语句n 由CPU执行的指令, 编译后生成目标代码n 语句格式:标号: 前缀 助记符 操作数 , 操作数 ; 注释例 MIUS: ADD AX , BX ; 加法指令 INC BX ; BX加1指令的符号地址指

3、令的符号地址操作码操作码注释前加分号注释前加分号指示性语句nCPU不执行的指令;n由汇编程序执行,编译后不生成目标代码;n用于分配内存空间、定义变量、指示程序开始和结束等。n指令格式: 名字 伪指令助记符 操作数 ,操作数, ;注释 例 Y EQU 100 ;用符号(变量)Y代替数据100指示性语句中的操作数可以是:n 寄存器n 存储器单元n 常量:数值或字符、字符串n 变量:代表内存的数据区,程序视为存储器操作数n 表达式:可包括各种运算符5.2 常用伪指令n 段定义伪指令n 指定段寄存器伪指令n 过程定义伪指令n 变量定义伪指令n 符号定义伪指令下面分别介绍下面分别介绍段定义伪指令 说明逻

4、辑段的起始和结束 说明不同程序模块中同类逻辑段之间的联系形态段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS例 定义数据段 DATA SEGMENT MEM1 DB 11H , 22H MEM2 DW 1234H DATA ENDS说明逻辑段的起点说明逻辑段的起点段的类别段的类别与其他段的关系与其他段的关系指定段寄存器伪指令n 功能: 用于说明指向逻辑段的寄存器n 格式: ASSUME 段寄存器名: 段名 ,段寄存器名: 段名, 例 DATA SEGMENT ;定义数据段 DATA ENDS CODE SEGMENT ;定义代码段 ASSUME CS: CODE , DS: DA

5、TA ;指定段寄存器 CODE ENDS过程定义伪指令和返回指令n 过程定义伪指令用于定义过程体n 格式: 过程名 PROC NEAR / FAR RET 过程名 ENDPn 过程的返回指令:RETn 该指令一般位于子程序的最后n 用于从堆栈中弹出断点地址,返回原程序。n 变量定义伪指令变量定义伪指令DB/DW/DDn变量定义伪指令用于在数据段中定义变量,并按照变量类型分变量定义伪指令用于在数据段中定义变量,并按照变量类型分配存储单元和赋初值。配存储单元和赋初值。 n格式格式1:变量名变量名 DB/DW/DD表达式表达式n格式格式2:变量名变量名 重复次数重复次数DB/DW/DDDUP 表达式

6、表达式 n例如:例如:nONE DB 25H ;定义;定义1个字节变量个字节变量ONE,存入初值,存入初值25H nTWO DB 5,7 ;定义;定义2个连续的字节单元,分别存入初值个连续的字节单元,分别存入初值5和和7nTHREE DB ? ;定义;定义1个字节,数据任意个字节,数据任意nDATA1 DW 1234H ;定义;定义1个字(个字(2个字节)个字节),存入数据存入数据1234H n 符号定义伪指令(符号定义伪指令(EQU/=) n符号定义伪指令用于为常量、变量、表达式或其他符号定义一个名字,但不分配内存单元。n格式1:符号名 EQU 数值表达式n格式2:符号名 = 数值表达式n例

7、如:nCONSTANT EQU 10 ;用符号CONSTANT表示常数10nVAR EQU 30H+99H ;用符号VAR表示表达式30H+99H nPURGE CONSTANT ;解除符号CONSTANT,以便重新定义nCONSTANT EQU 20 ;用符号CONSTANT表示常数20nDATA = 3 ;用符号DATA 表示3nDATA = 4 ;把符号DATA改为表示4n 汇编语言程序设计汇编语言程序设计 n 简单程序设计入门简单程序设计入门 n 汇编语言程序在一些对内存储器容量和存取速度要求比较高的情况下,如I/O接口驱动程序、实时控制程序、系统软件等设计中常被使用,而且比用高级语言

8、仿佛还要便当些。n 其实,用汇编语言编写程序,首先确定算法,然后紧紧抓住每条指令的格式、功能以及数据的寻址方式,用户也可以编写出高质量的汇编语言程序。 n1 1寄存器的加法寄存器的加法 n 下面给出了一个简单的汇编语言程序段,是用寄存器EAX、EBX、ECX和EDX实现加法运算,依此来说明寄存器加法是如何用汇编语言实现的。形成的32位的累加和被存放在EAX寄存器。n ; 4个32位寄存器EAX,EBX,ECX与EDX内容相加,累加和存放在EAX内 n n ADD EAX,EBX ;EBX寄存器内容与 EAX寄存器内容相n 加,结果存放在EAX上 n ADD EAX,ECX ;ECX寄存器内容与

9、 EAX寄存器内容相加,n 结果存放在EAX上n ADD EAX,EDX ;EDX寄存器内容与 EAX寄存器内容相加,n 结果存放在EAX上n n2 2存储器与寄存器加法存储器与寄存器加法 n 用存储器中的数据与寄存器中的内容进行操作运算,用存储器中的数据与寄存器中的内容进行操作运算,是用存放在存储器的数据段内,其偏移地址为是用存放在存储器的数据段内,其偏移地址为NUMBNUMB和和NUMB+1NUMB+1的两个连续单元的字节数据,与的两个连续单元的字节数据,与AXAX寄存器的寄存器的内容进行累加,其累加和存放在内容进行累加,其累加和存放在AXAX寄存器上寄存器上。n n ;用NUMB与NUM

10、B+l存储单元内的数据与AL寄存器内容进行求和,结果存放在AX中 n n MOV DI,OFFSET NUMB ;将偏移地址NUMB传送到DI寄存器 n MOV AX,1234H ;把常数1234H传送到AX寄存器 n ADD AX,DI ;AX寄存器内容与地址NUMB内的数据n ;进行加运算,结果存放在AX寄存器 n ADD AX,DI+1 ;AX寄存器内容与地址NUMB+1内的n ;数据进行加运算,结果存放在AX寄存器 n3 3数组元素加法操作数组元素加法操作 n 数组,是存储器中顺序排列的一个数据表。假定一个名为ARRAY的一维数组,共有10个数组元素,且数组元素是字节数据,数组元素的下

11、标是09。试用汇编语言编写一个程序,实现三个数组元素ARRAY(3)、ARRAY(5)、ARRAY(7)的累加。n ;三个数组元素数据进行累加运算,累加结果存放在;三个数组元素数据进行累加运算,累加结果存放在AX中中 n ;注意该过程破坏了;注意该过程破坏了SI的内容的内容n n MOV AX, 0 ;由于累加和要存放在;由于累加和要存放在AX内,首先将其清内,首先将其清0n MOV SI, 3 ;将常数;将常数3传送到源变址寄存器传送到源变址寄存器SIn ADD AX, ARRAYSI ;AX寄存器数据与数组元素寄存器数据与数组元素ARRAY(3)相加)相加 n ;结果存放在;结果存放在AX

12、寄存器寄存器 n ADD AX, ARRAYSI+2 ;AX寄存器数据与数组元素寄存器数据与数组元素ARRAY(5)n ; 相加结果存放在相加结果存放在AX寄存器寄存器n n ADD AX,ARRAYSI+4 ;AX寄存器数据与数组元素寄存器数据与数组元素ARRAY(7)相加)相加 n ;结果存放在;结果存放在AX寄存器寄存器 n4 4数组元素加法数组元素加法 n 下面程序段是32位的程序,采用的是比例变址寻址方式,求数组ARRAY中三个数组元素ARRAY(3)、ARRAY(5)、ARRAY(7)的累加和。且数组元素是16位的操作数,并把数组元素的和存放在寄存器EAX中。 n ;程序段是采用比

13、例变址进行寻址的32位操作数的程序n nMOV EBX,OFFSET ARRAY ;将数组地址ARRAY传送到寄存器EBXnMOV ECX,3 ;将常数3传送到ECX,ECX保存着数组元素的序号 nMOV EAX,EBX+2*ECX ;将数组元素ARRAY(3)的值传送到寄存器EAXnMOV ECX,5 ;将常数5传送到ECX,ECX保存着数组元素的序号nADD EAX,EBX+2*ECX ;数组元素ARRAY(3)与数组元素ARRAY(5)相加n ;结果存放在寄存器EAX nMOV ECX,7 ;将常数7传送到ECX,ECX保存着数组元素的序号nADD EAX,EBX+2*ECX ;数组元素

14、ARRAY(3)+ARRAY(5)+ARRAY(7)n ; 相加,结果存放在寄存器EAX n5 5 乘法程序设计乘法程序设计 n 下面这个程序段是实现寄存器BX上的数据与寄存器CX上的数据相乘的程序段。假设BX中存放的是数据55,在CX中存放的是数据110,两数进行乘法操作,产生的32位乘积存放在寄存器对DX-AX中。n;寄存器BX上的数据与寄存器CX上的数据相乘,n ;乘积存放在寄存器对DX-AX中n n MOV BX, 55 ;将字数据55装到寄存器BX上n MOV CX,110 ;将字数据110装到寄存器CX上n MOV AX,CX ;将寄存器CX上的数据110,传送到寄存器AX上n M

15、UL BX ;寄存器AX上的数据与寄存器BX上的数据相乘n ;结果存放在寄存器对DX-AX中n6 6 除法程序设计除法程序设计 n 下面的程序段是两个16位有符号数的除法,即AX中的-100除以CX中的+9。执行除法之前,要用指令CWD将AX中的-100转换成寄存器对DX-AX中的-100,除法操作执行后,结果存放在寄存器对DX-AX对中,其中商-11存放在AX中,而余数-l则是被存放在DX中。n;寄存器AX中的-100除以寄存器CX中的+9,商存放在AX中,n 余数存放在DX中 n n MOV AX,-100 ;将有符号数-l00传送到寄存器AX n MOV CX,9 ;将有符号数+9传送到

16、寄存器CX n CWD ;将AX中的-100转换成寄存器对DX-AX中的-100 n IDIV CX ;用寄存器对DX-AX中的-100,除以寄存器CX上的+9 n ;在AX中存放商-11,在DX中存放余数-l 完整的汇编源程序结构DATA SEGMENT ;定义数据段;定义数据段MEM1 DB 11H , 22H DATA ENDSCODE SEGMENT ;定义代码段;定义代码段 ASSUME CS:CODE ,DS:DATASTART: MOV AX,DATA CODE ENDS END START ;程序结束;程序结束n 顺序结构程序设计顺序结构程序设计n 顺序结构的程序是完全按指令书

17、写的先后顺序逐条执行的。这种结构的顺序结构的程序是完全按指令书写的先后顺序逐条执行的。这种结构的汇编程序既无分支、又无循环,只会自上而下地线性地顺序地运行,这种结汇编程序既无分支、又无循环,只会自上而下地线性地顺序地运行,这种结构的汇编程序通常是比较简单的程序。构的汇编程序通常是比较简单的程序。n 下面所展示出的程序就是一个顺序结构汇编程序的框架。下面所展示出的程序就是一个顺序结构汇编程序的框架。n Program 5.1 顺序结构汇编程序的框架顺序结构汇编程序的框架 n .DOSSEG ; 连接时按连接时按DOS方式排列段方式排列段n .MODEL SMALL ; 程序存储模式程序存储模式:

18、 小模式小模式n .486 ; 80486伪指令伪指令n .STACK 300H ; 建立程序堆栈段建立程序堆栈段:768字节字节n .DATA ; 建立程序数据段建立程序数据段n DB 16 DUP(?) ; WINDOWS保留数据区保留数据区:16字节字节n ; 其它程序数据其它程序数据n .CODE ; 建立程序代码段建立程序代码段nSTART: ; 程序开始执行地址程序开始执行地址n MOV AX, DATAn MOV DS, AX ; 设置数据段地址设置数据段地址n ; 插入实际程序代码插入实际程序代码n MOV AH, 4CHn INT 21H ; 返回返回DOSn END STA

19、RT ; 程序结束程序结束 分支程序设计分支程序设计n 分支程序结构可以用如图所示的两种形式表示。他们的结构分别相当于高级语言中的 IF-THEN-ELSE 语句和CASE语句,这种结构常用于根据不同的条件作出不同处理的情况。IF-THEN-ELSE 语句可以有两个分支,CASE语句则可以有多个分支。但不论是哪一种形式,他们的共同特点是:其运行方向是向前的,在确定的条件下,只能执行多个分支中的一个分支。判定条件判定条件 Program 5.3 分支结构的程序示例程序 ;显示两个数x1,x2的比较结果 .DOSSEG .MODEL SMALL ; 程序存储模式: 小模式 .486 ;80486伪

20、指令 .STACK 300H .DATA DB 16 DUP(?) X1 DD 1000 ; 两个数X1,X2 X2 DD 2000 ; 数值可任意指定 MSG1 DB X1X2,13,10,$ ; 比较结果分为大于、小于、等于三种情况 MSG2 DB X1X2,13,10,$ ; MSGE DB X1=X2,13,10,$ ; .CODESTART: MOV AX, DATA MOV DS, AX MOV EAX, X1 ; 取X1数值 CMP EAX, X2 ; 与X2比较 JE EQUAL ; 相等? JG GREAT ; X1大于X2 ? MOV DX, OFFSET MSG2 ; 比

21、较结果: X1X2 JMP OKEQUAL: MOV DX, OFFSET MSGE ; 比较结果: X1=X2OK: MOV AH, 09H ; 显示比较结果 INT 21H MOV AH, 4CH INT 21H END START 循环程序设计循环程序设计 在程序中,如果需要多次重复执行相同或相似的功能,就可以使用循环在程序中,如果需要多次重复执行相同或相似的功能,就可以使用循环结构。结构。 循环结构总是包含了三个部分循环结构总是包含了三个部分: : 1) 1)初始化,设置循环执行的初始状态。初始化,设置循环执行的初始状态。 2)2)循环体,需要多次重复执行的部分。循环体,需要多次重复执

22、行的部分。 3)3)循环条件,用于控制循环体的执行。循环体每次执行后,应该修改循环条循环条件,用于控制循环体的执行。循环体每次执行后,应该修改循环条件,使得循环能够在适当的时候终止执行。件,使得循环能够在适当的时候终止执行。循环控制条件循环初始状态循环体循环初始状态循环控制条件循环体(1)DO-WHILE 结构形式 (2)DO-UNTIL结构形式下面是循环程序设计一范例。其功能是选出一组数据中的最大者放到big单元;而将最小者放到little单元。DATA SEGMENT A DW 88,89,92,78,76,69,63,96,60,100 ;一组数据BIG DW ?LITTLE DW ?D

23、ATA ENDSCODE SEGMENTASSUME CS:CODE ,DS:DATASTART: MOV AX , DATA MOV DS , AX MOV BX , OFFSET A MOV AX , BX MOV DX , AX INC BX INC BX MOV CX , 9 ;循环次数放在CX之内AGAIN: CMP AX , BX JGE NEXT1 MOV AX , BX ;将大的数 ;放在AX之内NEXT1: CMP DX , BX JLE NEXT2 MOV DX , BX ;将较小的 ;数放DX之内 NEXT2:INC BX INC BX LOOP AGAIN ;实现循环 MOV BIG , AX ;存放最大数 MOV

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论