广西财经学院《计算机基础》课件-第4章汇编语言程序设计_第1页
广西财经学院《计算机基础》课件-第4章汇编语言程序设计_第2页
广西财经学院《计算机基础》课件-第4章汇编语言程序设计_第3页
广西财经学院《计算机基础》课件-第4章汇编语言程序设计_第4页
广西财经学院《计算机基础》课件-第4章汇编语言程序设计_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

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

文档简介

第4章汇编语言程序设计教学目的:了解汇编语言源程序的结构掌握伪指令理解DOS功能调用掌握汇编语言源程序的设计方法1广西财经学院《计算机基础》E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.1汇编语言源程序用汇编语言编写的程序称为汇编语言源程序,将汇编语言源程序翻译成机器语言的系统程序称为汇编程序assembler,翻译的过程叫做汇编assemble。2E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.1.1汇编语言源程序结构汇编语言源程序结构是指语句的格式和程序的组成部分。源程序结构取决于汇编程序,不同的汇编程序要求的源程序结构不同。本章以80X86CPU所常用的MASM宏汇编程序为背景介绍汇编语言源程序结构。

TASMASM3E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604101.汇编语言源程序的组成部分:数据段名SEGMENT

……数据段名ENDS附加数据段名SEGMENT

……附加数据段名ENDS堆栈段名SEGMENT

……堆栈段名ENDS代码段名SEGMENT

……代码段名ENDS

ENDXXX4每段以SEGMENT语句开始整个程序以END语句结束以ENDS语句结束E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410【例题4-1】将STRING1中100个字节传送到STRING2中DATA SEGMENT ;定义数据段STRING1DB100DUP(55H)DATAENDS;数据段结束EDATA SEGMENT;定义附加段STRING2DB100DUP(?)EDATAENDS;附加段结束STACK SEGMENT ;定义堆栈段

DW256DUP(?)STACKENDS ;堆栈段结束CODESEGMENT;定义代码段

ASSUMECS:CODE,DS:DATA,ES:EDATA,SS:STACKSTART: MOVAX,DATA

MOVDS,AX;初始化DS

5E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410

MOVAX,EDATA MOVES,AX;初始化ES

MOVAX,STACK MOVSS,AX

MOVSI,OFFSETSTRING1 ;初始化源串指针

MOVDI,OFFSETSTRING2 ;初始化目的指针

MOVCX,100 ;初始化计数器

CLD ;设置DF=0,使SI和DI按增量变化,增量为1

REPMOVSB

MOVAH,4CH

INT21H CODEENDS;代码段结束

ENDSTART6E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604102.汇编语言的语句格式汇编语言源程序中一行只能写一个语句。每个语句可以有4部分:标号、操作码助记符、操作数助记符、注释。例如:

BEGAIN:MOVAX,BX ;BX数据传送给AX7E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410汇编语言语句类型:指令性语句指示性语句8E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410指示性语句又称为伪操作语句,它不是8088/8086CPU的指令,它与汇编程序(assembler)有关。指示性语句的功能主要是定义变量、为数据分配存储空间、告诉汇编程序如何对源程序汇编等。源程序汇编后指示性语句不生成目标代码,所以常被称为伪指令。例如:DATA SEGMENT ;定义数据段STRING1DB100DUP(55H)DATAENDS;数据段结束9E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410指令性语句指令性语句是可执行语句,是8088/8086CPU的指令。源程序汇编后指令性语句生成目标代码。例如:START: MOVAX,DATA MOVDS,AX;初始化DS

MOVAX,EDATA MOVES,AX;初始化ES

MOVAX,STACK MOVSS,AX

MOV SI,OFFSETSTRING1 ;初始化源串指针

MOV DI,OFFSETSTRING2 ;初始化目的指针

MOV CX,100 ;初始化计数器

CLD

;设置DF=0,使SI和DI按增量变化,增量为1

REPMOVSB

10E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.1.2汇编语言源程序的处理过程汇编程序(Assembler)就是处理汇编语言源程序的系统程序,处理的过程称为汇编。源程序经过汇编生成目标程序,目标程序经过连接程序连接,就得到可执行文件。

11E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.1.3汇编语言中的操作数汇编语言语句中的操作数可以是寄存器、存储器单元、常量、变量、名字、标号和表达式。12E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604101.常量常量也称常数,有数值常量和字符常量两种。数值常量可以是二进制数、十进制数和十六进制数。十六进制数若是以字母(A~F)开始,需在前面加一个数字0,用以说明这是数值常量,不是字符串。例如:MOV AX,0D3A9H 字符常量是用单引号括起来的字符或字符串,源程序汇编之后它们转换为相应的ASCII码。例如:MOV AL,‘A’ ;AL=41HVAR DB,‘Hello’ ;相当于VARDB48H,65H,6CH,6CH,6FH 13E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604102.变量变量是指存储单元中的一组数据。每个变量可以有一个名字(变量名),也可以没有。一个变量名可以表示一个数据或一组类型相同的数据。变量名是变量的符号地址。例如:

STR DB'STRING'

NUM DW0AAH,23H

LAB0 DQ01A4578H14E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410变量在除了代码段之外的其他段中定义,有段、偏移量和类型三种属性。类型属性:变量的数据类型,有:BYTE、WORD、DWORD、DQ(8个字节)、DT(10个字节)。

15E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604103.标号与名字标号与名字都是符号地址,都可以作为指令的操作数使用。标号在代码段中定义,后面跟冒号,是指令的符号地址。标号经常作为转移指令、循环指令和调用指令的操作数。标号有三种属性:段、偏移量和类型。类型属性:标号是在本段内还是在其他段内,在本段内称为近地址属性(NEAR),在其他段内称为远地址属性(FAR),近地址属性NEAR可以省略。16E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410例如:

… LEA SI,VAR MOV CX,100 XOR AX,AX COUNT: ADD SI,2 ADD AX,[SI]

LOOPCOUNT MOV SUM,AX …;COUNT的属性为近地址属性NEAR17E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410名字通常指的是段名、变量名和子程序名。标号和名字由程序员确定。可以使用:大小写英文字母数字0~9特殊字符?•@#$标号或名字中的第一个字符必须是英文字母或圆点•,整体最长不能超过31个字符,不能使用指令助记符、寄存器名及汇编语言指令系统中的保留字。18E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410表达式表达式由常量、变量和标号通过运算符结合而成。表达式中的运算在汇编时完成,运算结果可以是操作数也可以是操作数地址。例如下面指令中的源操作数:

MOV AX,SEGVAR MOV

BX,5MOD3 ADD AL,LAB*5+DATA19E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410表达式中的常用运算符:(1)算术运算符:+、-、*、/、MODMOD是指除法运算的余数,如15MOD7结果为1。

MOVAX,15MOD7 ;汇编之后为MOV AX,1MOVDX,ARRAY+(7-1)*2

(2)逻辑运算符:AND、OR、XOR、NOT逻辑运算符只能用于数字表达式,不能用于地址表达式中。

MOV AL,04HAND75H ;汇编之后为:MOVAL,0420E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410(3)关系运算符:EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)关系运算的结果应为逻辑值:关系成立结果为真,输出为全1;关系不成立结果为假,输出为0。例如:DATA和NUM为常量,DATA=5AH,NUM=35HMOVBX,DATAGTNUM ;汇编之后为MOVBX,0FFFFHMOVBX,DATAEQNUM ;汇编之后为MOVBX,021E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410(4)取值运算符:OFFSET、SEGOFFSETVariable或label取变量或标号的偏移地址。SEGVariable或label取变量或标号的段基址。

22E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410(5)修改属性运算符:PTR修改操作数的类型,操作仅限于本条指令。例如:MOVBX,WORDPTRLAB0段超越前缀“:”用来表示一个标号、变量或地址表达式的段属性。例如:MOVAX,ES:[BX+SI]23E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410注意:在计算表达式值时,括号内的表达式优先计算,然后按运算符的优先顺序计算,对优先级相同的运算符按从左到右的顺序进行计算。运算符的优先级别从高到低的排列次序如下:在圆括号中的项,方括号中的项PTR、OFFSET、SEG、TYPE*、/、MOD、SHL、SHR+、-EQ、NE、LT、LE、GT、GE先NOT,AND,然后是OR和XOR24E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.2伪指令汇编语言中的指示性语句也称为伪指令。伪指令由汇编程序处理,不生成目标代码,不参与程序的执行。宏汇编程序MASM设置了几十种伪指令,下面简单介绍一些常用的伪指令:设定段寄存器伪指令数据定义伪指令符号定义伪指令过程定义伪指令宏命令伪指令模块定义与连接伪指令25E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.2.1段定义伪指令段定义伪指令SEGMENT和ENDS格式:段名 SEGMENT[定位类型][组合类型][类别]…

段名 ENDS例如:

DATA SEGMENTBUFFER

DB100DUP(?)COUNTDW100DATAENDS26E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410(1)定位类型:说明该段对起始地址的要求。 PARA:段起始地址必须能被16整除;BYTE:段起始地址可以是任何地址;WORD:段起始地址必须为偶数;PAGE:段起始地址必须从页边界开始,即必须能被256整除;如果省略定位类型参数,汇编程序默认为PARA。27E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410(2)组合类型:多个程序模块进行连接时,相同类型的段进行组合构成一个段。NONE:本段作为独立段装入内存,不与其他模块中的段组合,即使段名相同也不组合。PUBLIC:与其他模块中由PUBLIC说明的同名段接在一起。COMMON:与其他模块中由COMMON说明的同名段重叠存放,后连接的COMMON段会覆盖前面的内容,连接之后COMMON的长度是各分段中的最长的段的长度。STACK:与其他模块中由STACK说明的同名堆栈连接在一起,形成一个大的堆栈段,由各模块共享,堆栈指针自动指向这个大堆栈段的栈顶。28E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410MEMORY:将该段放在所有段的最后(高地址),如果连接时有多个MEMORY段,汇编程序将遇到的第一个作为MEMORY段,其余的作为COMMON段。AT<表达式>:表达式计算出的值为段基址,但不能用这种方式指定代码段。如果省略组合类型参数,汇编程序默认为NONE。29E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410(3)类别:指定段的类别。用单引号括起来的字符串,常用‘STACK’表示堆栈段,‘CODE’表示代码段,‘DATA’表示数据段,’EXTRA’表示附加数据段。在多个程序模块连接时,具有相同类别的段在一起装入连续的内存区域,无类别的段在一起装入连续的内存区域。30E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410ESTACK SEGMENT PARASTACK‘STACK’ ……ESTACK ENDS该段是堆栈段,段名为Estack;segment指明堆栈段开始;para说明该段必须从能被16整除的地址边界开始;stack指明组合类型;‘stack’指明类别是堆栈类。注意:同一个段的起始和结束必须是同一个名字。31E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604102.ASSUME伪指令格式:ASSUME段寄存器名:段名[,段寄存器名:段名],…ASSUME伪指令说明段名和段基址寄存器之间的关系,但它不能给段寄存器赋值,段寄存器的值需要在代码段中由指令性语句赋值。例如:ASSUMECS:CSEG,DS:DSEG,SS:SSEG,ES:EDSEG 说明CSEG段是代码段,DSEG段是数据段,SSEG段是堆栈段,EDSEG段是附加数据段。32E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410【例题4-2】测试内存TAB单元内的数为奇数还是偶数,如是奇数则BX置成0FFFFH;如是偶数BX置成0。33E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410DSEG SEGMENT;默认定位类型PARA,默认组合类型NONETAB DB?DSEGENDSSSEG SEGMENT‘STACK’

DW 256DUP(0)SSEGENDS CSEGSEGMENT;默认定位类型PARA,默认组合类型NONEASSUMECS:CSEG,DS:DSEG,SS:SSEG START:MOVAX,DSEG MOVDS,AX;给DS段寄存器赋值

MOVAX,SSEG MOVSS,AX ;给SS段寄存器赋值

MOVAL,TAB

TEST AL,01H ;测试BX中最低位的逻辑值

JZ EVEN1 ;ZF=1,AL为偶数转移至EVEN处执行

34E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410 MOV BX,0FFFFH ;AL为奇数,设置奇数标志

JMP CONEVEN1:MOV BX,0 ;设置偶数标志CON: MOV AH,4CH

INT 21H CSEGENDS;代码段结束

ENDSTART35E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.2.2数据定义伪指令数据定义伪指令也称为变量定义伪指令,或存储单元分配伪指令。它用来定义变量、确定变量的类型、给变量赋初值、为变量分配存储空间等。格式:[变量名]伪操作助记符[操作数1][,操作数2]…

STR DB 'STRING' NUM DW0AAH,23H LAB0 DQ01A4578H

36E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410数据变量有5种定义命令,如下:DB:定义变量为字节类型,其后的每个操作数都占一个字节。DW:定义变量为字类型,其后的每个操作数都占两个字节。DD:定义变量为双字类型,其后的每个操作数都占二个字,即四个字节。DQ:定义变量为四个字类型,其后的每个操作数都占四个字,即八个字节。DT:定义变量为十个字节,其后的每个操作数都占十个字节。37E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410例如:VAR DB67H,4FH,7AH;定义VAR为字节类型变量,3个字节类型的操作数顺序存储在以VAR为首地址的连续内存单元中,每个操作数占一个内存单元。注意:使用变量时,变量的类型必须与指令的要求相符。例如:MOVAL,VAR;AL=67H3867H4FH7AHVAR137A0H137A1H137A2H137A3H137A4H137A5HE6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410DELAY DW98A3H,17D9H;定义DELAY为字类型变量,2个字类型的操作数顺序存储在以DELAY为首地址的连续内存单元中,每个操作数占2个内存单元。例如:MOVBX,DELAY+2;BX=17D9H39A3H98HD9H17H200A0H200A1H200A2H200A3H200A4H200A5HDELAYE6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410NUM DD0AAH,3EF6AC23H ;定义NUM为双字类型变量,2个双字类型的操作数顺序存储在以NUM为首地址的连续内存单元中,每个操作数占4个内存单元。40237A0H237A1H237A2H237A3H237A4H237A5HAAH00H00H00H23HACHF6H3EHNUME6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410从NUM中取一个字,应使用如下方法:例如:MOVSI,OFFSETNUM

MOVCX,[SI]下列用法错:

MOVCX,NUM ;指令错误41E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410LAB0 DQ01A4578H;定义LAB0为4字类型变量,操作数存储在以LAB0为首地址的连续8个内存单元中。LAB1DT 3958235434H;定义LAB1为10个字节类型变量,操作数存储在以LAB1为首地址的连续10个内存单元中。注意:多字节数据在内存中存放时遵守“低位存于低地址中,高位存于高地址中”的原则。42E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410【例题4-3】数据段中变量的内存分配。DATA SEGMENTSTR DB 'STRING'NUM DW0AAH,23H LAB0 DQ01A4578HENDS43AAH0023H0078H45H1AH0000000000‘S’‘T’‘R’‘I’’N’’G’DS:0HDS:1HDS:2HDS:3HDS:4HDS:5H...DS:0FHDS:10HDS:11HSTRNUMLAB0E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410数据定义伪指令中的操作数可以是数值型常量、字符串常量,也可以是常量表达式,还可以是问号?,问号表示预留相应数量的存储单元,但不存入数据。例如:

DATA1 DW16*9,55*3 DATA2DB?,? 变量DATA2有2个字节类型的操作数,为每个操作数预留2个存储单元,不进行初始化。4490H00HA5H00H--DATA1137A0H137A1H137A2H137A3H137A4H137A5HDATA2E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410如果操作数很多而且相同,可以使用重复数据操作符DUP定义变量。例如:DATA3DB6DUP(AAH) DATA4 DB3DUP(?,55H,?)变量DATA3有6个操作数,初始化为AAH;变量DATA4有3组操作数,每组为3个,共9个字节类型的操作数。45-55H--55H--55H-AAHAAHAAHAAHAAHAAH20000H20001H20002H20003H20004H20005H20006H20007H20008H20009H2000AH2000BH2000CH2000DH2000EH2000FHDATA3DATA4E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.2.3符号定义伪指令符号定义伪指令也称为赋值伪指令。在程序中有时会多次出现同一个数值或表达式,通常可以用赋值伪指令将其赋给一个符号,程序中凡是用到该数值或表达式的地方都用这个符号代替,这样既提高了程序的可读性又使程序易于修改。有2条符号定义伪指令:EQU=46E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604101.EQU伪指令格式:符号名EQU表达式例如:

CONSEQU10 ;常数赋给符号CONSALPHAEQUCONSⅹ9-32;常数赋给符号ALPHAADDREQUALPHA[SI]+8;地址表达式赋给符号ADDRLOADEQUMOV ;助记符赋给符号注意:表达式中如果有变量或符号,则应该在该语句之前定义它们。在同一个程序中,一个符号不能定义两次。47E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410用法:

MOVAL,ALPHA

CMPAL,CONS

JMPWORDPTRADDR48E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410=伪指令格式:符号名=表达式说明:功能与EQU一样,给符号赋值,唯一的区别是可以对一个符号名重复定义。例如:

NUM=8

NUM=NUM+6这两条伪指令汇编之后,NUM=14,一般等号伪指令定义数值常量。49E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.2.4过程定义伪指令过程定义伪指令也称为子程序定义伪指令。在程序中使用调用命令CALL调用它。过程定义伪指令的格式: 过程名PROC[属性] …

过程名ENDP50E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410说明:过程名(procedurename)为标识符,由程序员设置。过程名是子程序入口的符号地址,即是子程序的第一条指令性语句的符号地址。过程的属性可以是NEAR或FAR,过程与调用命令在同一个代码段,过程的属性可以设置为NEAR类型;过程与调用命令不在同一个代码段,过程的属性应该设置为FAR类型。NEAR为缺省属性。51E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410DELAY PROCNEAR PUSHAX PUSHCX

MOV AX,0FFFFHNEXT:

MOV CX,AXNEXT1: LOOPNEXT1

DEC AX

JNZ NEXT POP CX POP AX RETDELAY ENDP52E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410可以使用CALL指令调用DELAY,也可以用JMP指令跳转到DELAY例如:CSEGSEGMENTASSUMECS:CSEG,DS:DSEG START: MOVAX,DSEG

MOVDS,AX MOVAX,ARRAY

CALL DELAY

MOV AH,4CH

INT 21H CSEGENDSENDSTART53E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410一个过程可以调用其他的过程,这称为过程嵌套。例如:MAIN PROC FAR

CALL SUB

RETMAIN ENDP SUB PROC NEAR

RETSUB ENDP过程也可以调用自己,称为递归调用。54E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.2.5程序结束伪指令55程序结束伪指令告诉汇编程序MASM源程序到此结束,并附带说明程序从哪开始执行。格式:END[标号]

END为伪操作符,标号为程序开始执行的指令的符号地址。如果程序包含多个模块,只有主程序模块的结束伪指令END后可以加标号,其他程序模块的END后不能指定标号。E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.2.6其他较常见伪指令简介程序开始伪指令NAME格式:NAME模块名功能:定义本程序模块的名字,告诉汇编程序MASM:源程序从这开始。56E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604102.标题定义伪指令TITLE

格式:TITLE标题字符串功能:打印源程序清单时,标题字符串作为每一页的标题。标题字符串对程序模块的功能有说明作用,最多可有60个字符。如程序中没有NAME伪指令,则汇编程序将标题字符串中的前6个字符作为模块名。如果程序中既无NAME也无TITLE伪指令,源程序文件名就作为模块名。57E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410ORG伪指令格式:ORG表达式功能:指定后面的指令或数据从表达式指出的地址(偏移地址)开始存放。58E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410DOS系统功能调用知识点4.359E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.3DOS系统功能调用60操作系统的主要功能是管理硬件资源和为应用程序开发提供良好的编程环境。系统内核提供一系列具备一定功能的函数,通过系统调用(systemcall)接口呈现给用户。系统调用接口把应用程序的请求传给系统内核,调用内核函数完成任务处理,并将处理结果返回给应用程序。系统调用通常是通过软中断机制来实现的。E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E6041061DOS操作系统为用户提供的系统功能调用有两种,一种称为BIOS功能调用,也叫低级调用,调用它们可以驱动磁盘、控制显示器输出、驱动打印机和管理时钟;另一种称为DOS功能调用,也叫高级调用,调用它们可以管理内存、管理设备、管理文件和目录。E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410DOS操作系统中21H号中断被称为DOS系统功能调用,它的内部提供了八十多个功能子程序,可以实现字符输入、字符显示和打印、磁盘读写、文件建立打开关闭、文件读写等功能,基本上满足了普通程序员的编程需要。为了调用方便,系统对这些功能子程序进行编号,称为功能号。调用的步骤如下:①把要调用的功能号送AH寄存器②根据调用要求设置入口参数③INT21H62E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604101.输入单个字符从键盘输入单个字符可以使用1、7、8号功能。1号功能接收键盘输入的字符并保存在AL中,同时显示在屏幕上。7、8号功能接收键盘输入的字符保存在AL中但不显示。它们都不需要入口参数。例如:

MOV AH,1 INT 21H这两条指令执行后,光标在屏幕上闪动,等待键盘按键。一旦有键按下,其ASCII码存入AL中,字符显示在屏幕上。63E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604102.输入字符串0A号系统调用:从键盘输入字符串存入指定的内存区域。入口参数为DS:DX使用0A号功能之前首先要定义一个数据区,要求数据区的的第一个字节含有允许输入的最大字符个数(包括回车符),第二个字节用于存放实际输入的字符个数,从第三个字节开始作为字符串存储空间。如果计划最多输入10个字符,数据区的定义方法如下:

BUFF DB10,0,10DUP(?)64E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410调用0A号功能的方法如下:

MOVDX,OFFSETBUFFMOVAH,0AHINT 21H

BUFF数据区允许输入的最大字符个数为10个,若实际输入的字符个数(包括回车符)超过10个,则后面的字符由于没有存储空间而被丢弃,且喇叭会发出嘟嘟声报警,直到键入回车符。65E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410BUFF数据区的第二个字节初始化为0,0A号功能执行时会把实际键入的字符数(不包括回车符)置入其中。如果实际键入的字符数不足10个,字符存储空间还有空余,空余的空间置0。一般在定义数据区时,会比计划输入的字符数多一些。66E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410【例4-4】从键盘上输入字符串‘WELCOME’DATASEGMENT BUFF DB10,0,10DUP(?);定义数据区DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVDX,OFFSETBUFF

MOV AH,0AH

;功能号送AH INT21H;功能调用

MOV AH,4CH

INT21HCODE ENDSENDSTART670AH07H‘W’‘E’’L’’C’’O’’M’’E’0DH00DS:0HDS:1HDS:2HDS:3HDS:4HDS:5H...BUFF图4-6字符串输入E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604103.显示单个字符682号功能:显示单个字符。入口参数:DL,将待显示字符的ASCII码送DL寄存器。例如在屏幕上显示大写字母B,可以用下面的3条指令实现:

MOVDL,'B' ;待显示字符的ASCII码送DL MOVAH,2 ;功能号送AH INT21H ;功能调用E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.显示字符串699号功能:将字符串显示在屏幕上。入口参数:DS:DX,字符串必须以‘$’结尾。【例4-5】在屏幕上显示字符串。

MOV DX,OFFSETSTRING ;设置入口参数

MOV AH,09H ;功能号送AH INT 21H E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410DATA SEGMENTSTRINGDB'WELCOMETOJILINUNIVERSITY','$'DATA ENDSCODE SEGMENT

ASSUMECS:CODE,DS:DATASTART: MOV AX,DATA

MOV DS,AX

MOV DX,OFFSETSTRING ;设置入口参数

MOV AH,09H ;功能号送AH

INT 21H ;功能调用

MOV AH,4CH

INT 21HCODE ENDS

ENDSTART70E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604105.返回操作系统4CH号功能:使程序正常结束并返回操作系统,调用方法如下:

MOV AH,4CH INT21H21H号中断内包含有丰富的系统功能调用,如果想查看更多的系统功能调用,可以参考附录。71E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.4汇编语言程序设计基础4.4.1汇编语言程序设计步骤(1)分析问题确定算法 (2)画出程序流程图(3)编写程序(4)上机调试程序将源程序汇编,剔除语法错误,生成目标代码文件;将目标代码文件链接生成可执行文件,利用调试工具(如DEBUG等)对可执行文件进行调试,经过调试确定程序的正确性。72E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E604104.4.2顺序程序设计【例4-6】编写计算S=A*B-C的程序,A、B、C是无符号字节变量,S是字变量。DATASEGMENTA DB38;定义数据

B DB54C DB16S DW?;为运算结果保留存储空间DATAENDS73E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410CODE SEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,AMOVBL,B MULBL ;A*B,结果存在AX中

MOVBL,CMOVBH,0 SUBAX,BX ;AX-C,结果在AX中

MOVS,AX;保存计算结果

MOVAH,4CHINT21H;返回操作系统CODE ENDSEND START74E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410【例4-7】在内存中从TABLE单元开始的连续16个单元中,存放着0~15的平方值(平方表),查表求任意数X(0≤X≤15)的平方值,将结果保存在RESULT中。DATASEGMENTTABLEDB0,1,4,9,16,25,36,49,64,81DB100,121,144,169,196,225

XDB11RESULTDB?;定义结果存放单元DATAENDSSTACKSEGMENT'STACK' DW100DUP(?);定义堆栈空间STACKENDS7519H24H31H40H51H64H79H90HA9HC4HE1H1H4H9H10HDS:0HDS:1HDS:2HDS:3HDS:4HDS:5HDS:6HDS:7HDS:8HDS:9HDS:AHDS:BHDS:CHDS:DHDS:EHTABLE图4-7变量的内存分配0E6636B02012BD195C019CE06C16E3084C13D07E32711A616D0819A183DEAA8F88FB93503BC41BA964B41DEF0472B73A72FC0F2BE2AA53EFE6A06217957F7271DBF2DB6715F2B3FB877C24E60410CODESEGMENTASSUMECS:

温馨提示

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

评论

0/150

提交评论