汇编语言程序结构.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

汇编语言程序设计刘辉王勇徐建平编著清华大学出版社参考资料1.IBM-PC汇编语言程序设计(第2版)沈美明温冬婵清华大学出版社2.汇编语言王爽编著清华大学出版社计算机语言的发展机器语言FORTRANBASICCOBOLPASCALC/C++JAVA...汇编语言高级语言计算机语言的发展经历了机器语言、汇编语言到高级语言的发展过程。机器语言使用0,1书写的二进制代码,难于书写和纠错;汇编语言使用接近于人类的语言对计算机的硬件直接发号施令,让内部的各个部件直接进行各种运算;而高级语言程序的书写更简单,但是各个函数之间的参数传递比较复杂,逻辑结构性强。汇编语言的特点面向机器的低级语言,通常是为特定的计算机或计算机系列专门设计的。保持了机器语言的优点,具有直接和简捷的特点。可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。经常与高级语言配合使用,应用十分广泛。1.1汇编语言程序的结构形式1.2汇编语言的各种伪指令1.3masm的上机操作步骤第1章汇编语言程序基本知识1.1汇编语言程序的结构形式例1.编程实现c=a+b,并在屏幕上显示出结果。算法分析:定义存放加数和被加数值的变量a,b;给a,b以确定的值;实现a+b的操作并把结果存放在变量c中;输出运算结果。分别用高级语言c和汇编语言编写的代码如下:#includestdafx.h#includestdio.hintmain(intargc,char*argv[])//程序从主函数开始{inta,b,c;//定义变量a=1;b=2;//直接给变量赋值c=a+b;//计算累加结果printf(“c=%d\n”,c);//输出结果return0;}编译后的目标文件达到3.59KBdatasegment;定义数据段adb?;定义变量bdb?cdb?stringdb'c=$'dataendscodesegment;定义代码段mainprocfar;主程序从此开始assumecs:code,ds:data,es:datastart:pushdssubax,ax汇编后的目标文件只有208字节pushaxmovax,datamovds,ax;数据段的地址装入专用寄存器moves,axmova,1;给变量赋值movb,2moval,aaddal,b;a+bmovc,al;运算结果存入c变量中leadx,stringmovah,09int21h;输出字符串addc,30h;整数转化为字符,因为汇编输出都是字符movdl,cmovah,2int21h;输出dl中字符,这是21号中断的功能调用movdl,0ahint21h;换行movdl,0dhint21h;回车retmainendpcodeendsendstart汇编语言与高级语言的比较•高级语言书写简单,不需知道硬件的详细操作过程,易于掌握•汇编语言需要程序员定义变量的存放位置,直接对硬件进行编程,需要对硬件进行详细的设计,所以有一定的难度。汇编语言的应用系统程序、效率代码、I/O驱动程序70%以上的系统软件是用汇编语言编写的。某些快速处理、位处理、访问硬件设备等高效程序是用汇编语言编写的。高级绘图程序、视频游戏程序一般是用汇编语言编写的。例2.在屏幕上显示字符串”Thisisanassemblylanguageprogram!”题目分析:a.字符串应存放在一个存储单元中,也即一个变量中,这要在数据区中加以定义b.在代码段中,首先把程序中用到的各个段与相应的寄存器名对应起来,这要用到assume伪操作c.调用dos中断显示字符串,中断执行前先做显示的准备操作:数据段的地址存入ds寄存器;从数据区的存储单元中取出要显示的字符串的存放地址存入dx寄存器;执行中断操作,显示DS:DX中的内容汇编程序如下:;ex102.asmdisplayastringdatasegment;定义数据段strdb‘Thisisanassemblylanguageprogram!’,‘$’,13,10;在str存储单元中的字符串内容dataendscodesegment;定义代码段mainprocfar;主程序从此开始assumecs:code,ds:data;指派程序中实际定义的各个段与对应的寄存器的联系start:;语句标号pushds;保护原有的数据段内容到堆栈段中subax,ax;存储一个0值,表示新程序的数据开始存放pushaxmovax,data;先把数据段的地址临时存入ax寄存器中movds,ax;再把地址存入数据段寄存器中leadx,str;取出要显示的字符串的偏移地址存入dx寄存器movah,09hint21h;调用dos中断,显示DS:DX中的内容exit:;主要功能执行完毕,返回dos界面movax,4c00hint21hmainendp;主程序到此结束codeends;代码段到此结束endstart;汇编程序到此结束,与前面的start相对应例3.求两个数中的最大值题目分析:a.现在数据区中定义两个变量并赋值b.在程序中比较这两个变量的大小,把较大的值存放在存储单元max中程序如下:;简短模式书写的程序.MODELTINY;定义程序模型.DATA;定义数据段XDB-8;定义变量名称及具体数值YDB10MAXDB?;只分配存储空间,没有值.CODESTARTUP:MOVAX,@DATA;预定义符@data可以取出数据段的段名MOVDS,AXMOVAL,X;把X的值预存入AX寄存器的低8位AL中MOVCL,Y;把Y的值预存入CX寄存器的低8位CL中CMPAL,CL;比较AL和CL寄存器的数值大小JGEBIG;如果AL=CL,则跳转到BIG标号处;否则,即ALCL,顺序执行下述语句MOVMAX,CL;把较大值CL存入MAX单元中JMPEXITBIG:MOVMAX,AL;把较大值AL存入MAX单元中EXIT:MOVAX,4C00H;返回dos界面INT21HENDSTARTUP通过上述一些例子,可以大致了解汇编语言程序的构成,了解程序的书写形式,及常用的几个语句,后面分章节详细介绍汇编程序的结构构成及各种指令格式1.2汇编语言的各种伪指令•1.2.1数据定义伪指令•数据定义伪指令的用途是定义一个变量的类型,给变量赋初值,或仅仅给变量分配存储单元•数据定义伪指令有DB、DW、DD、DF、DQ、DT•例1.4数据定义伪操作的使用•DATADB1,2H•EXPRDW1,2•STRDB'WELCOM!'•S1DW'AB'•S2DD'AB'•OFFABDWS1存储单元名称内存中的数据内存的地址………DATA010100H020101HEXPR010102H000103H020104H000105HSTR57W0106H45E0107H4cL0108H43C0109H4FO010AH4DM010BH21!010CHS142B010DH41A010EHS242B010FH41A0110H00111H00112HOFFAB0D0113H010114H………FILLERDB?给字节变量FILLER分配存储单元,但不赋予特定的值BUFFERDB10DUP(?)给变量BUFFER分配10个字节的存储空间,但不赋任何初值ZERODW30DUP(0)给变量ZERO分配一个数据区,共30个字(即60字节),每个字的内容均为零MASKDB5DUP('OK!')定义一个数据区,其中有5个重复的字符串'OK!'ARRAYDB100DUP(3DUP(8),6)将变量ARRAY定义为一个数据区,其中包含重复100次的内容:8,8,8,6,共占400个字节1.2.2符号定义伪指令•常用的符号定义伪指令有EQU、=(等号)和LABLE。•EQU伪指令将表达式的值赋予一个名字,以后可用这个名字来代替上述表达式CREQU0DH;常数AEQUASCII_TABLE;变量STREQU64*1024;数值表达式ADREQUES:[BP+DI+5];地址表达式CBDEQUAAM;指令助记符1.2.3段定义伪指令•段定义伪指令的用途是在汇编语言源程序中定义逻辑段。常用的段定义伪指令有SEGMENT/ENDS和ASSUME等。•1.SEGMENT/ENDS•格式:•段名SEGMENT[定位类型][组合类型]['类别']•…•段名ENDS•2.ASSUME•格式:ASSUME段寄存器名:段名[,段寄存器名:段名,…]•例1.6代码段的定义举例。•CODESEGMENT•ASSUMECS:CODE,DS:DATA1,SS:STACK•MOVAX,DATA1•MOVDS,AX;给DS赋值•MOVAX,STACK•MOVSS,AX;给SS赋值•CODEENDS1.2.4地址计数器与对准伪操作•1.地址计数器$•arrdw1,2,$+4,3,4,$+6•则汇编后的存储单元如下图1.1所示:arr0100740000750200760000777c007800007903007a00007b04007c00007d82007e00007f2.ORG伪操作•ORG伪操作用来设置当前地址计数器的值,例如下述数据段的定义:•例1.7ORG伪操作的使用举例。•DATASEGMENT•ORG100H•VALDW345BH;存储单元VAL在DATA段中的偏移地址从100H开始•DATAENDS3.EVEN伪操作•EVEN伪操作使下一个变量或指令开始于偶数地址。•例1.8EVEN伪操作的使用举例。•DATASEGMENT•…•EVEN•VALDW345BH;存储单元VAL在DATA段中的偏移地址从偶数地址开始•DATAENDS1.2.5操作数伪操作•1.算术操作符•算数操作符有+、-、*、/和MOD。MOD是指整除运算后取余数•例如:MOVdx,block+(6-1)*2•2.逻辑与移位操作符•逻辑操作符有AND、OR、XOR、NOT,移位操作符有SHL和SHR,详见第3章。•3.关系操作符•关系操作符EQ(相等),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或等于)。运算结果是逻辑值真或假。真用0FFFFH表示,假用0表示。•4.数值回送操作符•这些操作符把一些特征值或存储器地址的一部分作为结果回送。•1)TYPE:返回变量的字节数,如果变量为DB格式定义的,则返回1;若以DW定义,则返回2;DD为4,DQ为8,DT为10。•2)LENGTH:对于数据段中定义变量时使用DUP的情况,汇编程序回送分配给该变量的单元数,对于其它情况则回送1。•例1.9定义s1dw100dup(?)•指令movcx,lengths1,汇编后成为movcx,100•3)SIZE:回送分配给变量的字节数,它等于LENGTH和TYPE的乘积•例1.10定义s1dw100dup(?)•指令movcx,sizes1,则汇编后成为movcx,200•4)OFFSET:回送变量或标号的偏移地址•例1.11指令movbx,offsets1,汇编程序将变量s1在数据段中的偏移地址回送给指令,该指令将这个偏移地址装入BX寄存器。这条指令与指令LEABX,s1是等价的。•5)SEG:回送变量或标号的段地址•例1.12指令MOVBX,SEGDATA,把名字为DATA的段地址装入BX寄存器5.属性操作符•1)PTR•格式为typePTRexpre,用于建立一个符号地址,给已分配的存储地址赋予另一个属性,是该地址具有另一种属性•例1.13在数据段中定义adb1•在代码段中有如下指令MOVAX,WORDPTRa•则汇编程序把变量a中的数据以word的形式装入AX寄存器。•2)段跨越前缀:•段跨越前缀用来指定段名称,在计算地址时使用指定的段地址和偏移地址而不是使用默认的段地址。•例如指令“MOVAX,ES:[BX+SI]”,把附加段中偏移地址为BX+SI的存储单元中的数据放入AX寄存器。1.2.6过程定义伪指令•过程也就是子程序,所以过程定义伪指

1 / 50
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功