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

下载本文档

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

文档简介

掌握的内容:段寄存器说明语句的作用,堆栈段定义的特殊性,源程序的各种辅助说明伪指令。熟练掌握的内容:段的定义。程序的三大结构(顺序结构、分支结构和循环结构等)在汇编语言中的表现形式。汇编语言的常用编程工具——MASM、LINK、Debug——的使用,能在该编程环境下完成程序的编辑、汇编、调试和运行等步骤。汇编语言程序设计机器硬件的具体结构联系过于紧密——在一种结构的机器上开发

的程序极难移植到另一种不同结构的机器上去。1)充分利用机器的硬件功能和结构特点,加快程序的执行速度,

减少目标程序所占用的存储空间;2)用来编写实时控制程序、实时通信程序,有时也用来编制某些

系统软件程序。汇编语言进行程序设计缺点汇编语言进行程序设计的优点一个基本的汇编语言程序框架如下:

stack

SEGMENTPARA‘stack‘DB100DUP(‘stack’)

stackENDS

dataSEGMENT

<数据、变量在此定义>

dataENDS

codeSEGMENT

ASSUMECS:code,DS:data,ES:data,SS:stack

start:

MOVAX,dataMOVDS,AXMOVES,AX

<此处加入你自己的程序段>MOVAL,4CHINT21H

codeENDSEND

start

堆栈段数据段代码段真指令ASM-86汇编语言源程序在结构上持点:

(1)一个汇编语言源程序由—个或几个段组成,每个段由SEGMENT语句开始,以ENDS语句结束。

(2)4类段:代码段、数据段、附加段和堆栈段。

(3)若仅由一个段,则这个段必为代码段。

(4)源程序语句无非是指令性语句或指示性语句。

(5)一条语句占一行。

(6)代码段中ASSUME确定段与段寄存器间的关系。

(7)整个源程序必须用END伪指令来结束。END后面的标号表示该程序执行时的起始地址(亦称人口地址)。宏指令语句是由编程者按照一定的规则来定义的一种较“宏大”的指令,可包括多条指令或伪指令。在8086汇编中使用的语句可以分成3种类型这类指令能够产生目标代码,是CPU可以执行的能够完成特定功能的语句,主要由机器指令组成。在汇编时一条指令语句被翻译成对应的机器码,对应着特定的操作。指令语句:伪指令语句:伪指令语句是为汇编程序和连接程序提供一些必要控制的管理性语句,它不产生目标代码,仅仅在汇编过程中告诉汇编程序应如何汇编,并完成相应的伪操作。宏指令语句:汇编语言源程序书写格式三种语句格式是类似的(宏指令语句不用掌握):指令语句的格式:[标号:]操作符[参数][,参数][;注释]伪指令语句的格式:[名字]操作符参数[,参数[,参数…]][;注释]三种语句都由四部分组成:第一部分是标号、名字(包括变量和常量)标号、名字是程序设计人员自己定义的符号,用于代表内存单元的地址,表示本条语句的符号地址,统称为标识符,它应符合下列规定:1)第一个字符必须是字母、问号“?”、“@”、“.”或“_”;2)从第二个字符开始可以是字母、数字、问号“?”、“@”或“_”;3)最大长度为31个字符。4)不应该是保留字。第二部分是操作符。第三部分是参数域。参数域都可由以下几种形式组成:常数、寄存器名、存储器操作数和表达式。

(1)常数①二进制数(须用字母B结尾)②十进制数(数字后面加字母D或什么也不加)③十六进制数(用H结尾)④八进制数(用Q结尾)⑤串常数,串常数的值为串引导中各字符的ASCII码,例如,‘A’的值为41H,而‘AB6’的值为414236H。为了防止与标识符相混,凡是以字母A~H开始的十六进制数,必须在其前面加一个0(零)、如0A786H。

(2)存储器操作数。包括标号和变量标号和变量都是符号地址,所以它们都有三属性:①段值(SEGMENT):即标号或变量所在段的段基址;②段内地址偏移量(OFFSET):即标号或变量所指的实际地址与所在段的起始地址的差的低16位。③类型(TYPE):对于变量来说,类型指字节、字或是双字等,取决于定义变量的伪指令。对于标号来说,类型指NEAR还是FAR。

(3)表达式①算术表达式:加(+)、减(-)、乘(*)、除(/)、 求余(MOD)、右移(SHR)和左移(SHL)②逻辑表达式:包括按位运算的与(AND)、或(OR)、异或 (XOR)和非(NOT)。注:AND、OR、NOT和XOR既是逻辑运算符,又是指令助记符。作为指令助记符,它们必须出现在指令的操作符部分,且其操作是在程序执行时进行的;而逻辑运算符的操作是在汇编过程中完成的.如:OR

DX,7532H

AND

0FFFFH③关系表达式:关系运算有相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于等于(LE)、大于等于(GE)六种。运算结果只有两种可能:若关系是假(关系不成立),则结果为0,若关系为真,则结果为全1。如:MOV

BX,3

LT

5;BX=0FFFFH④数值回送符:有SEG、OFFSET、TYPE、LENGTH和SIZE。前三种分别用来分离存储器操作数的段、偏移量和类型三种属性。后两种用来求数组变量的长度和字节数。1)格式:SEG变量/标号功能:取变量或标号的段基址。例如,设OPER1为数据段中定义的变量,则

MOVAX,SEGOPER1

指令的含义是把变量OPERl的段基址送寄存器AX。2)格式:OFFSET变量/标号功能:取变量或标号的偏移地址。例如,设OPER1为数据段中定义的变量,则

MOVAX,OFFSETOPER1

指令含义是把变量OPERl的偏移地址送寄存器AX。3)格式:TYPE变量/标号功能:取变量或标号的类型值。当作用于变量时,得到的是该变量的长度类型值;作用于标号时,将得到该标号的距离类型值,但TYPE运算符主要作用于变量。4)格式:LENGTH变量功能:获取为变量分配的项数。如果变量是用DUP说明,则返回DUP定义变量的重复次数,否则,返回值为1。5)格式:SIZE变量功能:获取为变量分配的总字节数。例:如果在数据段中定义ABCDW100DUP(?),则

TYPEABC=2

LENGTHABC=100

SIZEABC=100X2=200⑤属性操作符:这类运算符为存储器操作数临时指定一个新的属性,而忽略当前属性,因此又称属性修改运算符。1)PTR 格式:PTR地址表达式

功能:临时指定由地址表达式所确定的存储单元

的类型属性。类型可以是BYTE、WORD、DWORD、

NEAR或FAR。如果定义ARYDW100,将ARY定义为字类型变量,为将ARY的低位字节传送到AL,可用PTR临时指定ARY的类型属性,即执行语句

MOVAL,BYTEPTRARY

注意,本语句不更改ARY变量原有的类型属性(即字类型属性)。2)THIS 格式:THIS类型

功能:指定变量或标号的类型。类型可以是BYTE,

WORD,DWORD,NEAR,FAR,被指定变量或标号的段地址和偏移地址与下一个存储单元地址相同。例如WAEQUTHIS

WORD

BADB100DUP(?)此时,变量WA的段地址和偏移地址与变量BA相同,但类型属性不同(WORD),而后者的类型为字节(BYTE)。3)段跨越前缀格式:段寄存器:地址表达式

功能:用来改变地址表达式的段属性。

例如

MOVAX,ES:[BX+

SI]第四部分是注释,由分号“;”开始。数据定义及存储分配伪指令格式:[变量名]DB/DW/DD/DQ/DT<数据项表>[;注释]伪指令DUP常用在数据定义伪指令中,其使用的格式为:[变量名]DB/DW/DD/DQ/DT<表达式1>DUP(表达式2)[;注释]例:A1DB10,10H;定义两个字节

A2DW10,10H;定义两个字

A3DB`AB`;定义两个字节

A4DW`AB`;定义一个字

A5DB2DUP(1,2,3)结果见例LI.ASM0A100A00100041424241等值(赋值)语句EQU格式:符号名EQU表达式等号语句=格式:符号名=表达式注意:用EQU和=定义的符号不占存储单元。010203010203ORG伪指令格式:ORG表达式功能:位置指针<-表达式的值。其中,表达式的值是一个无符号数,取值范围为0~65535。汇编程序在汇编过程中将要用到一个位置指针(亦称地址计数器,其中的值用$表示),它用来告诉汇编程序下一个可分配给指令或数据的存储单元地址(偏移地址)。ORG伪指令用于控制(或修改)当前位置指针的内容。则变量VECT1的偏移地址为10H,而VECT2的偏移地址为1AH。这里,$等于0012H(即当前地址指针)。该数据定义段经汇编后,内存中DAT数据段分配情况如图所示。段定义伪指令SEGMENT/ENDS格式:段名SEGMENT[定位类型][组合类型][`类别`]┇;段内语句序列段名ENDS标号定义伪指令LABEL格式:变量名或标号名LABEL类型LABEL伪指令常用来对已具有变量名或标号名的存储单元另起一个新的变量名或标号,这个新名的段属性和偏移量属性跟原名相同,但类型属性取决于LABEL后的“类型”。段寻址伪指令ASSUME该伪指令用来告诉汇编程序某个段是使用哪一个段寄存器。格式:ASSUME段寄存器名:段名[,段寄存器名:段名,…]功能:设定源程序中各段与段寄存器之间的关系过程定义伪指令定义子程序的格式为:过程名PROC[NEAR]/[FAR]┇

RET过程名ENDP程序结束伪指令END源程序结束伪指令表示一个程序模块的结束,其格式为:END[标号]其中,“标号”是程序中第一条要被执行指令的标识符,它用来指示程序执行时的起始地址。程序设计步骤当在设计一个程序时,应该考虑满足以下目标:1)程序的正确性。2)增强程序的可读性。3)所写程序应该是结构化的,易修改,易调试,即程序的可维护性。程序设计的基本步骤1.明确任务,确定算法例:Y=|X|Y=-X开始X>=0Y=X结束Y=-X3.分配存储空间和工作单元4.编写程序5.上机调试、运行程序2.根据算法画出程序流程图程序的基本结构程序是指令(语句)的有序集合,是对系统任务处理步骤的描述。程序的执行是有一定顺序的,依据执行顺序可将程序分为如下基本结构:顺序结构、分支(选择)结构、循环结构和子程序结构。顺序结构:是一种线性结构,这种结构的程序每执行一次,其中的语句或程序段依次被执行一次程序的顺序结构如图所示:S1S2S3其中S1、S2、S3表示顺序执行的语句或程序段。例

假设由下列数学公式:Y=X3+8X2+8X+6试编写当X=10时,计算Y值的程序。(X)→AX(AX)+8→AX(AX)*(X)→AX(AX)+6→AX(AX)+8→AX(AX)*(X)→AXAX→(Y)Y=((X+8)X+8)X+6START:MOVAX,STACK_SEGMOVSS,AXMOVSP,OFFSETTOPPUSHDSSUBAX,AXPUSHAXMOVAX,DATA_SEGMOVDS,AXMOVAX,XADDAX,8MULXADDAX,8MULXADDAX,6MOVY,AXRETMAINENDPCODE_SEGENDSENDSTARTDATA_SEGSEGMENTXDW10YDW0DATA_SEGENDSSTACK_SEGSEGMENTSTACK'STACK'DW100DUP(?)TOPLABELWORDSTACK_SEGENDSCODE_SEGSEGMENTMAINPROCFARASSUMECS:CODE_SEG,DS:DATA_SEGASSUMESS:STACK_SEGdatasegment;数据段

msgdb0dh,0ah,07h,"Hello$"dataendsss_segsegment;堆栈段

db256dup(?)ss_segendscodesegment;代码段

assumecs:code,ds:data,ss:ss_segmainprocfarpushds;标准序

movax,0pushax

movax,data;设置数据段

mov

ds,axleadx,msg;取字符串地址执行后显示HELLO。movah,09h;显示字符串int21hret;返回操作系统mainendpcodeendsendmain

在计算机上运行汇编语言程序的步骤:

(1)编辑程序建立源程序文件(.ASM)。

(2)用汇编程序(MASM或ASM)把源文件(.ASM)汇编成目标文件(.OBJ)。

(3)用连接程序(LINK)把目标文件(.OBJ)转换成可执行文件。

(4)在DOS命令状态下通过直接键入文件名执行该汇编语言程序或利用DEBUG程序对

用户程序进行调试。文件名.ASM文件名.OBJ文件名.EXE汇编语言源程序

汇编目标程序连接执行程序编辑程序EDIT.EXE或记事本汇编程序MASM.EXE连接程序LINK.EXE用汇编语言编写源程序,经过汇编程序和连接程序生成目标程序和执行程序

分支程序:具有两个或两个以上相对独立的程序段,每执行一次分支程序,其中有且仅有一个程序段被执行一次。汇编语言中实现分支的要素有二:(1)使用能影响状态标志的指令,如算术运算指令、逻辑运算指令和移位指令等,利用状态标志来反映条件成立与否。(2)使用条件转移指令,对状态位进行测试判断,确定程序如何转移,形成分支。开始条件满足?S1S2NOYES结束例:编写程序计算Y=│X│,X,Y为字变量。开始X>=0X→Y-X→YNOYES结束CMP

AX,0JGEPOSANDAX,AXJNSPOSDATASEGMENTXDW10HYDW?DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASTART:PUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVAX,XTESTAX,8000HJZPOSNEGAXPOS:MOVY,AXRETMAINENDPCODEENDSENDSTART

编写程序,根据键盘输入的值,显示不同的内容。若输入数字“0”,则显示“Youhaveinputdigit0.”,若输入数字“1”,则显示“Youhaveinputdigit1.”

若输入数字“9”,则显示“Youhaveinputdigit9.”,否则显示“Error!”。开始Y键盘输入0~9?N结束图5-9例5-7程序的流程图显示Error!显示Youhaveinputdigit0.显示Youhaveinputdigit9.显示Error!

为0为9DATASEGMENTDISDB0DH,0AH,’Pleaseinputdigit0~9.$’DIS0DB0DH,0AH,’Youhaveinputdigit0.$’DIS1DB0DH,0AH,’Youhaveinputdigit1.$’┇DIS9DB0DH,0AH,’Youhaveinputdigit9.$’DIS10DB0DH,0AH,’Error!$’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;初始化DSMOVDS,AXLEADX,DISMOVAH,09H;DOS功能调用:显示字符串INT21HMOVAH,01H;从键盘输入一个字符,其ASCII码送ALINT21HCMPAL,30H;与0的ASCII码比较JBERR;小于0的ASCII码转EXITCMPAL,39H;与9的ASCII码比较JAERR;大于9的ASCII码转EXITANDAL,0FH;ASCII码→二进制JMPGOODERR:MOVAL,10;如果输入的不是0~9,AL寄存器送10GOOD:LEABX,TAB;取地址表的偏移地址→BXMOVAH,0SHLAL,1;JMPSHORTP*为两字节指令ADDBX,AXJMPBX;转到地址表中对应的指令去执行EXIT:MOVA

温馨提示

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

评论

0/150

提交评论