汇编语言程序设计1(汇编语言源程序的结构、语句格式、伪指令)_第1页
汇编语言程序设计1(汇编语言源程序的结构、语句格式、伪指令)_第2页
汇编语言程序设计1(汇编语言源程序的结构、语句格式、伪指令)_第3页
汇编语言程序设计1(汇编语言源程序的结构、语句格式、伪指令)_第4页
汇编语言程序设计1(汇编语言源程序的结构、语句格式、伪指令)_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

第4章汇编语言程序设计movax,12hcalldisplayJmp1234h1主要内容:汇编语言源程序的结构汇编语言语句格式伪指令功能调用汇编语言程序设计23§4.1

汇编语言源程序了解:汇编语言源程序的结构汇编语言语句类型及格式34.1 汇编语言源程序

(1)机器语言——二进制数形式的指令和数据。

B064是什么意思?这就是机器语言。既不直观,又不易理解和记忆.

MOVAL,64H;很容易记忆理解,这就是助记符。

(2)助记符——用便于记忆的英语单词表示的指令操作码。它反映了指令的功能和主要特征,便于人们理解和记忆。4

操作数可能放在存储器中,这就涉及操作数的地址。程序中遇到转移指令或调用指令,也需要知道转移地址,若采用具体地址就很不方便,一旦有错,改动也很麻烦。于是人们采用标号或符号来代替地址,例:

LP1:MOVAX,VAR…LOOPLP1(3)汇编语言——指令助记符,符号地址,标号,伪指令等语言元素的集合以及这些元素使用的规则。用汇编语言编写的程序叫汇编语言源程序。指令除了操作码以外,还有一个操作数问题。5汇编程序(翻译程序)源程序的编译程序汇编程序汇编语言源程序机器语言目标程序汇编源程序需翻译成机器语言,变成可执行文件,机器才能执行,这个翻译过程叫汇编。——高级语言中称该过程为“解释”或“编译”。执行翻译的程序称为“汇编程序”。672.

汇编语言程序设计与执行过程输入汇编语言源程序(EDIT)汇编(MASM)链接(LINK)调试(TD)源文件.ASM目标文件.OBJ可执行文件.EXE最终程序74.1.1汇编语言源程序的结构

汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由3个(或4个)逻辑段组成:数据段——存放数据、变量

(附加数据段——存放数据、变量)堆栈段——堆栈区域代码段——存放程序指令8一个基本的汇编语言程序框架如下:

stack

SEGMENTPARA‘stack‘DB100DUP(‘stack’)

stackENDS

dataSEGMENT

<数据、变量在此定义>

dataENDS

codeSEGMENT

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

start:

MOVAX,dataMOVDS,AXMOVES,AX

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

INT21H

code

ENDSEND

start

堆栈段数据段代码段真指令90000:0~3FF环境与代码运行FFFF:0堆栈段数据段代码段CS:IPDSSS:SP系统起始运行程序中断向量区(系统专用)栈底最多4个活动段分段结构ES104.1.2汇编语言的语句与格式汇编语言的语句有两种:指令性语句——由8086指令助记符(真指令)构成的语句指示性语句——由伪指令构成的语句11121.

汇编语言语句类型指令性语句指示性语句CPU执行的语句,能够生成目标代码CPU不执行,而由汇编程序执行的语句,不生成目标代码12132.

汇编语言语句格式

指令性语句:

[标号:][前缀]助记符[操作数],[操作数][;注释]指令的符号地址标号后要有冒号操作码注释前加分号1314指示性语句格式[名字]伪指令助记符操作数[,操作数,…][;注释]变量的符号地址其后不加冒号指示性语句中至少有一个操作数14●指令性语句(真指令)由CPU执行,每一条指令性语句都有一条机器码指令与其对应;

●指示性语句(伪指令)由汇编程序执行。它指出汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。

注意:指令性语句汇编时生成机器码;

指示性语句汇编时不生成机器码。15语句的构成元素:标号——指令的符号地址,用来代表指令在存储器中的地址。只能出现在指令性语句中,标号后应加上冒号。名字——段、过程、变量的名字,用来代表它们在存储器中的地址。只能出现在指示性语句中,名字后不加冒号。指令助记符——8086助记符、伪指令操作数——即指令的操作对象对指令性语句(真指令)——0,1,2个对指示性语句(伪指令)——根据需要而定操作数之间以逗号分隔操作数可以是:寄存器、存储单元、常数或表达式例如:AX,[DI+BX+10],200,16*8+TABLE,等等16注释——以分号开头,可放在指令后,也可单独一行。

注意注解的写法。要写指令(段)在程序中的作用,而不要写指令的操作。例如:以下为同一条指令写的注释1)MOVCX,100;传送100到CX2)MOVCX,100;循环计数器置初值显然,第二种写法要比第一种写法要好。17汇编语言的一个实例:hello.asm

dataSEGMENTHelloDB‘Hello,world!’,0DH,0AH,’$’dataENDSprogSEGMENTASSUMECS:prog,DS:datastart:MOVAX,dataMOVDS,AX

LEADX,hello ;取字符串首地址MOVAH,9INT21H ;显示字符串MOVAH,4CHINT21H ;退回DOSprogENDSENDstart名字标号1819常量数字常量字符串常量例:‘A’MOVAL,’A’例:’ABCD’汇编时被译成对应的ASCII码41H,42H,43H,44H用单引号引起的字符或字符串数据项(操作数的形式)包括常量、标号/名字、变量及表达式。19有三个属性:

段地址:即标号所在段的段地址;

偏移量:标号所代表存储单元的段内偏移地址;

类型:NEAR或FAR:(SHORT?)

NEAR—表示标号所在语句与转移指令/调用指令在同一码段内,跳转时只需改变IP即可。

FAR—标号所在语句与转移指令/调用指令不在同一代码段内。跳转时需改变CS和IP即可。

若没有对类型进行说明,默认为NEAR。标号通常作为转移指令或CALL指令的转移地址。2.标号/名字——指令或数据所在内存单元的符号地址如

Start:MOVAX,data

JMP/CALLStart

HelloDB06H,45H,44HPTR20变量——即内存中的存储单元或数据区。变量名——是存储单元(数据区)的符号地址或名字。变量也有三个属性:段地址—变量所在段的段地址偏移量—变量单元地址与段首地址之间的位移量。类型—有BYTE、WORD、DWORD三种之一。变量在程序中作为存储器操作数被引用。3.变量如

Start:MOVAX,dataPTR21标号和变量名的使用规则:组成:A-Z(不分大小写),0-9,?@._$不能以数字开头,句号(.)只能作为首字符长度小于31个字符不能与保留字(指令助记符、伪指令、预定义符号等)重名不能重复定义例如:正确的

:LP1,AGAIN,NEXT,_GO,OK_1

错误的

:4M,LOOP,AAA,#HELP,+ONE224.表达式表达式是常数、寄存器、标号、变量与运算符的组合。有数字表达式和地址表达式两种。汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运行时不能改变。表达式中的运算符有6类:算术、逻辑、关系、取地址、属性、杂类。如

Start:MOVAX,16*8+TABLE23用于数字表达式,例:

MOVAX,4*1024汇编后的形式为:

MOVAX,4096用于地址表达式,例:

LEASI,TAB+3若TAB的偏移地址为1000H,则汇编后的形式为:

LEASI,[1003H]1)算术运算符——+、-、*、/,MOD24逻辑运算符只能用于数字表达式中。例:MOVCL,36HAND0FH

经汇编后:MOVCL,06H注意:不要把逻辑运算符与逻辑运算指令混淆:例:ANDAX,3FC0HAND0FF00H汇编后源操作数被翻译为:3F00H,所以上述指令与ANDAX,3F00H等价。2)逻辑运算符——AND、OR、XOR、NOT25关系运算的结果是一个逻辑值:真或假关系为真,结果为全1

关系为假,结果为全0例:MOVBX,PORTGT300H若PORT的值大于300H为真,则汇编后为:

MOVBX,0FFFFH若为假,则汇编后为:

MOVBX,03)关系运算符——EQ、NE、LT、GT、LE、GE2627取值运算符取得其后变量或标号的偏移地址取得其后变量或标号的段地址TYPE取变量的类型LENGTH取所定义存储区的长度SIZE取所定义存储区的字节数用于分析存储器操作数的属性获取变量的属性值OFFSETSEG2728取值运算符例

MOVAX,SEGDATAMOVDS,AXMOVBX,OFFSETDATA

LEABX,DATA等价于28TYPE取变量的类型(1,2,4)LENGTH取所定义变量的长度(即变量中元素的个数)SIZE取所定义存储区的字节数

(=TYPE*LENGTH)例:VARDW1,2,3,4,5则TYPEVAR=2LENGTHVAR=5SIZEVAR=105)取值运算符——TYPE、LENGTH、SIZE296)属性运算符——PTR用来指定地址操作数的类型。格式:<类型>PTR<地址操作数>

类型∈{BYTE,WORD,DWORD和NEAR,FAR,SHORT}BYTE、WORD、DWORD

用于描述数据存储单元(变量)地址NEAR、FAR(SHORT?)

用于描述转移、调用的目的地址30例:MOV BYTEPTR[DI],0;字节类型MOV WORDPTR[DI],0;字类型

MOV [DI],0B5H;类型不定PTR也可用来进行强制类型转换例:STR1DW? ;STR1定义为字类型 MOV AX,STR1;合法MOV AL,STR1;非法

MOVAL,BYTEPTRSTR1;合法3132其它运算符方括号:

[]段重设符

段寄存器名:[]方括号中内容为操作数的偏移地址用于修改默认的段基地址3233§4.2

伪指令掌握:伪指令的格式及实现的操作伪指令的应用3334伪指令由汇编程序执行的“指令系统”作用:定义变量;分配存储区定义逻辑段;指示程序开始和结束;定义过程等。3435常用伪指令数据定义伪指令符号定义伪指令段定义伪指令结束伪指令过程定义伪指令宏命令伪指令3536一、数据定义伪指令用于定义数据区中变量的类型及大小格式:

[变量名]伪指令助记符操作数,…;[注释]符号地址定义变量类型定义变量值及区域大小36371.

数据定义伪指令助记符DB定义的变量为字节型DW定义的变量为字类型(双字节)DD定义的变量为双字型(4字节)DQ定义的变量为4字型(8字节)DT定义的变量为10字节型3738数据定义伪指令例DATA1DB11H,22H,33H,44HDATA2DW11H,22H,3344HDATA3DD11H*2,22H,33445566H以上变量在内存中的存放形式3839数据定义伪指令例_变量在内存中的分布DATA111223344DATA2224411000033DATA32200220000XX665544333940数据定义伪指令的几点说明伪指令的性质决定所定义变量的类型;定义字符串必须用DB伪指令例:

DATA1DB‘ABCD’,66H‘A’‘B’‘C’‘D’41H42H43H44H66H40练习DATA_BDB10,5,10HDATA_WDW100H,-4DATA_DDD0FFFBH汇编后的内存分配情况如右图所示。05H10H00H01HFCHFFHFBHFFH00H00H0AHQDATA_BDATA_WDATA_D10510H100H-40FFFBH41例2:操作数可以是字符串,例如

STRDB ‘HELLO’汇编后的情况如图:STR‘H’‘E’‘L’‘L’‘O’注意:下面两个定义的不同之处:DB ‘AB’ ;41H在低字节,42H在高字节(先A后B)DW‘AB’;42H在低字节,41H在高字节(先B后A)48H45H4CH4CH4FH42432.

重复操作符作用:为一个数据区的各单元设置相同的初值目的:常用于声明一个数据区格式:

[变量名]伪指令助记符nDUP(初值,…)例:

BW20DUP(0)M1DB10DUP(0)43443.

“?”的作用表示随机值,用于预留存储空间MEM1DB34H,’A’,?DW20DUP(?)预留40个字节单元,每单元为随机值随机数占1个字节单元4445数据定义伪指令例M1DB‘Howareyou?’M2DW3DUP(11H),3344H

DB4DUP(?)M3DB3DUP(22H,11H,?)变量在内存中的分区4546数据定义伪指令例M1‘H’‘o’‘w’‘‘‘a’M211H11H00H44H33H‘r’‘e’‘‘‘y’‘o’‘u’‘?’11H00H00H随机数M311H22H11H22H11H22HXXXXXXXXXXXXXX464.2.2符号定义伪指令把一个表达式用一个符号表示,以后凡出现该表达式的地方都可用这个符号表示。类似于C语言中的#define。符号定义伪指令有两种:EQU,=用EQU定义的符号未清除前,不能重新定义。清除EQU定义可用PURGE伪指令。用”=”定义的符号可在任何时候进行重定义。二者均不占用存储空间,仅是给符号赋值47例:FIVEEQU5COUNTEQUCXTENEQU10DIST=BYTEPTR[SI+BP]GOTO=JMP…MOVAX,TENMOVCX,COUNTADDDIST,FIVEDIST=WORDPTR[SI+BP+1]ADDDIST,AXGOTOLABEL定义引用4849三、段定义伪指令说明逻辑段的起始和结束;说明不同程序模块中同类逻辑段之间的联系形态4950段定义伪指令格式段名SEGMENT[定位类型][组合类型][’类别’]

┇段名ENDS说明逻辑段的起点说明不同模块中同名段的组和连接方式5051定位类型PARA:段的起点从节边界开始(16个字节为1节)BYTE:段的起点从存储器任何地址开始WORD:段的起点从偶地址开始PAGE:段的起点从页边界开始(256个字节为1页)5152组合类型与其它模块中的同名段在满足定位类型的前提下具有的组合方式:NONE:不组合PUBLIC:依次连接(顺序由LINK程序确定)COMMON:覆盖连接STACK:堆栈段的依次连接AT表达式:段定义在表达式值为段基的节边界MEMORY:相应段在同名段的最高地址处。5253段定义伪指令例DATASEGMENTMEM1DB11H,22HMEM2DB‘Hello!’

MEM3DW2DUP(?)DATAENDS变量在逻辑段中的位置就代表了它的偏移地址表示变量所在逻辑段的段地址表示变量的类型534.2.3段定义伪指令汇编语言程序是按段来组织程序和数据的。和存储器的物理段相对应,汇编语言程序中的段称为逻辑段。汇编连接后被映射到物理段中。3/4类段:代码(程序)、数据/附加数据、堆栈段定义伪指令:SEGMENT、ENDS、ASSUME、ORG定义一个段的基本格式:

段名SEGMENT

[定位类型][组合方式][类别]

<汇编语言语句>

段名

ENDS54这两个伪指令总是成对出现,二者前面的段名应一致。SEGMENT说明了一个段的开始,ENDS说明了一个段的结束。对数据段和堆栈段,段中的语句一般是变量定义。对代码段则是指令语句。如:dataSEGMENT<指令语句>dataENDSSEGMENT和ENDS伪指令5556四、设定段寄存器伪指令说明所定义逻辑段的性质格式:

ASSUME段寄存器名:段名[,段寄存器名:段名,…]56ASSUME伪指令在代码段中,还必须明确段和段寄存器的关系,这由ASSUME语句来指定。如

ASSUMECS:code,DS:data,ES:data,SS:stack语句中的code和data为段名。这个语句说明:

(1)CS将指向名字为code的代码段

(2)DS和ES将指向名字为data的数据段57

注意:ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值。故下面的语句

MOV AX,dataMOV DS,AXMOV ES,AXMOV AX,stackMOV SS,AX将段基址装入段寄存器。如果程序中用到堆栈段,则SS也需装入实际的初值。代码段基地址不需要程序员装入CS寄存器,而由操作系统(OS)负责装入。58SEGMENT语句后可以带有可选参数,用以规定逻辑段的其他一些属性。它的格式为:1)定位类型说明如何确定逻辑段的边界。有4种:PARA(Paragraph):

逻辑段从一个节

(16个字节)的边界开始。即段的起始地址应能被16整除,或这说段起始物理地址应为××××0H。——默认类型BYTE:逻辑段从字节边界开始,即段可以从任何地址开始。WORD:逻辑段从字边界开始。即段的起始地址必须是偶数。PAGE:逻辑段从页边界开始。256字节称为一页,故段的起始物理地址应为×××00H。也即:PAGE(页边界)--能被256除;PARA(段边界)--能被16除;WORD(字边界)--(能被2除);BYTE(字节边界)

段名SEGMENT[定位类型][组合类型][‘类别’]593)类别用单引号’’括起来的字符串。所有同类别的段被安排在连续的存储区域中。如:在模块1中有段定义:

seg1SEGMENTPARASTACK‘stack’

…seg1ENDS在模块2中有段定义:

seg2SEGMENTPARASTACK‘stack’

…seg2ENDS则连接时这两个段被安排在一起。6061五、结束伪指令表示源程序结束格式:

END[标号]6162汇编语言源程序结

温馨提示

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

评论

0/150

提交评论