




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
复习控制类指令传送类指令数据操作类指令串操作类指令第4章汇编语言程序设计本章主要内容:汇编语言源程序的结构汇编语言语句格式伪指令功能调用汇编语言程序设计4.1汇编语言源程序了解:计算机的三种语言源程序的结构汇编语言语句格式一、计算机设计语言机器语言汇编语言高级语言面向机器的语言机器语言汇编语言高级语言汇编程序汇编语言源程序用助记符编写源程序的编译程序汇编程序汇编语言源程序机器语言目标程序汇编程序的功能汇编程序的主要功能是将由汇编语言(助记符)编写的源程序翻译成用机器语言(二进制代码)编写的目标程序。下图可用以说明这个功能。汇编程序的功能目标代码文件:其中的地址数据还是浮动的(相对的),不能直接运行;列表文件:包含程序的逻辑地址、代码程序及源程序对照清单,附有引用符号表,可用DOS的TYPE命令输出;交叉索引文件:包含了符号定义行号和引用行号,不能用TYPE命令输出,需要执行CREF文件后生成索引列表文件(.REF)才能输出。观察可得:汇编语言源程序作为汇编程序(MASM或ASM)这个“翻译”的输入,而这个“翻译”的输出是三个文件:二、汇编语言源程序结构数据段名SEGMENT…数据段名ENDS附加段名SEGMENT…附加段名ENDS堆栈段名SEGMENT…堆栈段名ENDS代码段名SEGMENT…代码段名ENDS三、汇编语言语句类型指令性语句指示性语句CPU执行的语句,能够生成目标代码CPU不执行,而由汇编程序执行的语句,不生成目标代码四、汇编语言语句格式指令性语句:[标号:][前缀]助记符[操作数],[操作数][;注释]指令的符号地址,标号后要有冒号操作码注释前加分号指示性语句格式:[名字]伪指令助记符操作数[,操作数,…][;注释]变量的符号地址,其后不加冒号指示性语句中至少有一个操作数区分标号和名字标号后有冒号,在指令性语句前;名字后不加冒号,在指示性语句前。名字由英文字母、数字及专用字符组成,最大长度不能超过31个,且不能由数字打头,不能用保留字(如寄存器名,指令助记符,伪指令)。 操作码指令码命令CPU要完成的操作伪指令助记符指示汇编程序要完成的操作用来定义变量,分配存储单元指示程序开始和结束等注释用分号作为注释的开始用于说明程序或语句的功能,以便于阅读和理解数据项及表达式寄存器存储器单元常量变量或标号表达式操作数常量数字常量:没有任何属性的纯数值。在汇编期间,它的值已能完全确定,且在程序运行中,它也不会发生变化。字符串常量:用引号引起的字符或字符串例:‘A’,’ABCD’汇编时被译成对应的ASCII码41H,42H,43H,44H常数的应用在程序中,常数主要出现在:
1)指令语句源操作数中做立即数,它应与目的操作数的位数相一致,可以是8位或16位的。
2)在指令语句中的基址加变址的寻址方式中作位移量。
3)在数据定义伪指令中。
例如:
MOVAX,1234HMOVBX,[SI+32H]DB12H
;定义一个字节数据变量变量是代表存放在某些存储单元的数据,这些数据在程序运行期间随时可以修改。为了便于对变量的访问,它常常以变量名的形式出现程序中,它可以认为是存放在数据存储单元的符号地址。(1)变量的定义与预置(2)数据定义伪指令变量的定义与预置定义变量就是给变量分配存储单元,且对这个存储单元赋予一个符号名,即变量名,同时将这些存储单元预置初值。
VAR-DATASEGMENTDATA1DB12HDATA2DB34HDATA3DW9876HVAR-DATAENDS变量的属性定义变量是用数据定义伪指令DB,DW,DD等。经过定义的变量,每个变量均有三个属性:
(1)段属性(SEG)
(2)偏移量属性(OFFSET)
(3)类属性(TYPE)段属性段属性(SEG):表示变量存放在哪一个逻辑段中,即变量所在段的段基值。例如:VAR-DATASEGMENTDATA1DB12HDATA2DB34HDATA3DW9876HVAR-DATAENDS
三个变量都存放在VAR_DATA逻辑段中。当在指令中要对这些变量进行存取操作时,事先要把它们所在段的段基值存放在某一个段寄存器中。偏移量属性偏移量属性(OFFSET):表示变量在逻辑段中离段起始点的字节数。
例如变量DATA1的偏移量为0,而DATA2的偏移量为1,DATA3的偏移量为2。段属性和偏移量属性构成了变量的逻辑地址。类属性类属性(TYPE):表示变量占用存储单元的字节数。类属性是由数据定义伪指令DB,DW,DD来规定的。
变量DATA1,DATA2的类属性为字节;而DATA3的类属性为字;如果用DD定义,类属性为双字。标号标号是一条指令目标代码的符号地址,它常作为转移指令(含子程序调用指令)的操作数。与变量相似,每个标号亦具有三个属性:
(1)段属性:表示这条指令目标代码在哪个逻辑段中。
(2)偏移量属性:表示这条指令目标代码的首字节在段内离段起始点的字节数。
(3)距离属性:表示本标号可作为段内或段间的转移特性。距离属性又分为NEAR(近)属性和FAR(远)属性。五、表达式与运算符表达式由操作数和运算符组成,而运算符主要由以下几种类型组成:
一、算术运算符二、逻辑运算符三、关系运算符四、取值运算和属性运算符
五、其它运算符算术运算符+、-、*、/:加减乘除运算符MOD:除法取余运算符例如:MOVAL,
32
MOD5
;(AL)=
2逻辑运算符AND:逻辑“与”操作符OR:逻辑“或”操作符XOR:“异或”操作符NOT:逻辑“非”操作符例如:
MOVAL,
24H
AND
0FH;(AL)=04H
24H
XOR
0FH
=
2BH关系运算符参与关系运算的必须是两个数值,关系运算是数值型的。关系运算是逻辑判定式,当为“真”时结果取0FFFFH,当为“假”时结果取0。
EQ
等于LE
小于等于
NE
不等于GT
大于
LT
小于
GE
大于等于
例如:
5
LT6
=
0FFFFH取值运算符OFFSET取得其后变量或标号的偏移地址SEG取得其后变量或标号的段地址TYPE取变量的类型LENGTH取所定义存储区的长度SIZE取所定义存储区的字节数用于分析存储器操作数的属性取值运算符取值运算符的格式:(1)SEG
求段基址格式:SEG〈符号名〉
(2)OFFSET
求偏移地址格式:OFFSET〈符号名〉
(3)TYPE
求符号名类型值格式:TYPE〈符号名〉类型1字节2字节4字节8字节10字节近程远程类型值124810-1-2取值运算符(4)SIZE
求为符号名分配的字节数格式:SIZE〈符号名〉
(5)LENGTH
求为符号名分配的项数格式:LENGTH
〈符号名〉
注意:SIZE和LENGTH要求为符号名定义的数据项必须是用重复格式DUP()定义的。取值运算符例MOVAX,SEGDATAMOVDS,AXMOVBX,OFFSETDATA
LEABX,DATA等价于取值运算符例若BUFFER存储区是用如下伪指令定义:
BUFFERDW200DUP(0)
则:
TYPE BUFFER
等于2
LENGTHBUFFER
等于200
SIZEBUFFER
等于400注意:SIZE=TYPE*LENGTH属性运算符属性运算符PTR
用于指定其后存储器操作数的类型
格式:(类型)PTR(符号名)例1:MOVBYTEPTR[BX],12H
例2:已知内存变量D1是字节属性,要把它的两个字节内容送到AX中。
MOVAX,WORDPTRD1其它运算符方括号:
[]方括号中内容为操作数的偏移地址段重设符段寄存器名:[]用于修改默认的段基地址例:
MOVAX,[BX]MOVAX,ES:[BX]4.2伪指令掌握:伪指令的格式及实现的操作伪指令的应用伪指令由汇编程序执行的“指令系统”。伪指令没有对应的机器指令,它不是由8086/8088CPU来执行,而是由MASM-86识别,并完成相应的功能。用于定义变量、分配存储区、定义逻辑段、指示程序开始和结束等标号名伪指令操作数注释
,伪指令语句格式这是一个任选字段。标号名后面不能用冒号“:”,这是它与指令语句的突出区别。不同的伪指令,标号名可以是常量名、变量名、过程名、结构名、记录名等。它们可以作为伪指令语句和指令语句的操作数,这时,标号名就表示一个常量或存储器地址。这是伪指令语句不可省略的主要成分。伪指令种类很多,如定义数据伪指令DB,DW,DD;段定义伪指令SEGMENT;定义过程伪指令PROC等。它们是伪指令语句要求汇编程序完成的具体操作命令。本字段是否需要,需要几个,需要什么样的操作数等都由伪指令字段中伪指令来确定。操作数可以是一个常数、字符串、常量名、变量名、标号、一些专用的符号等。这是一个任选字段,它必须以分号为开始,它的作用与指令语句的注释字段相同。伪指令语句格式伪指令MASM-86识别的伪指令可分成以下几类:
(1)符号定义伪指令
(8)定位伪指令
(2)内存数据定义伪指令
(9)列表伪指令
(3)段定义伪指令
(10)系统隐含进位制伪指令
(4)段寄存器说明伪指令
(11)连接伪指令
(5)子程序定义伪指令
(12)记录伪指令(6)模块开始伪指令(13)结构伪指令(7)模块结束伪指令(14)块注释伪指令
(15)宏命令伪指令符号定义伪指令格式:
(1)〈名字〉EQU〈表达式〉
(2)〈名字〉=〈表达式〉作用:把表达式的值赋给符号名。区别:在同一程序中,用EQU语句赋值的符号名不能被重新赋值,但用“=”号赋值的符号名可以被重新赋值。“〈〉”号表示此项不能缺省,但该符号不需要输入。符号定义伪指令例:
CONSTANT EQU 100VAREQU30H+99HEQU说明的表达式不占用内存空间内存数据定义伪指令用于定义数据区中变量的类型此指令主要有以下五大类:字节定义伪指令DB
定义的变量为字节型字定义伪指令DW
定义的变量为字类型四字节定义伪指令DD
定义的变量为双字型八字节定义伪指令DQ
定义的变量为4字型十字节定义伪指令DT
定义的变量为10字节型字节定义伪指令格式:
[名字]DB〈表达式或数据项表〉
表达式值或项表中的每一项是一个字节数,它们从符号名地址开始按字节连续存放,直到表中数据项结束(地址递增方向)。方括号[]表示该项可以缺省。字定义伪指令格式:
[名字]DW〈表达式或数据项〉
除表达式值或项表中的每一项是两个字节数之外,其它与DB伪指令相同。四字节定义伪指令格式:
[名字]DD〈表达式或数据项〉
表达式值或项表的每一项是四个字节数。八字节定义伪指令格式:
[名字]DQ〈表达式或数据项表〉
表达式值或数据项表的每一项是八字节数,各项从小地址一端连续存放,允许浮点数形式,与DD伪指令相同。高四个字节填0。十字节定义伪指令格式:
[名字]DT〈表达式或数据项表〉
表达式值或数据项表的每一项是10个字节数,允许浮点数形式,与DQ伪指令相同,若项表中的数据项是十进制整数书写的,汇编程序按组合的BCD码格式存放,最低字节在高地址一端存放,数据的最高字节的最高位是符号位,“0”表示正,“1”表示负。数据定义伪指令该伪指令主要为数据项分配存储单元并预置初值。该伪指令构成的语句格式是:
DB
变量名+DW+表达式1,表达式2,…DD
其中表达式1,表达式2,…是给变量赋予的初值。表达式可以有如下几种情况:
(1)数值表达式(2)?表达式(3)字符串表达式(4)带DUP表达式数值表达式例如:
DA_BYTEDB50H,50DA_WORDDW0A3F1H,4981H
变量DA_BYTE的内容为50H,它的下一个字节为32H。DA_WORD字单元内容为0A3F1H,它的下一字单元为4981H。?表达式不带引号的?表示可预置任何内容。例如:
DA_BDB?,?DA_WDW?,?
第一条语句是要求汇编程序分配两个字节单位,第二条语句是要求分配两个字单元。这些单元里现在可以是任意值。字符串表达式DB伪指令:为字符串中每一个字符分配一个字节单元。字符串必须是用引号括起来且不超过255个字符。字符串自左至右以字符的ASCII码按地址递增的排列顺序依次存放。DW伪指令:可以给两个字符组成的字符串分配两个字节存储器单元,且这两个字符ASCII码的存储顺序是前一字符在高字节,后一字符在低字节,每一个数据项不能多于两个字符。DD伪指令:仅可给两个字符组成的字符串分配四个字节单元,且这两个字符ASCII码是存储在两个低字节中,两个高字节均存放00H。字符串表达式STRING1DB‘ABCDEF’STRING2DW‘AB’,’CD’,’EF’STRING3DD‘AB’,CD’带DUP表达式DUP是定义重复数据操作符。使用DUP操作符格式是:
DB
变量名+DW+表达式1DUP(表达式2)
DD
其中表达式1是重复的次数,表达式2是重复的内容
例如:
BB1DB12HDUP(’ABCD’)
BB2DW10HDUP(4)ARRAY1DB2DUP(0,1,2,?)ARRAY2DB100DUP(0,2DUP(1,2),0,3)700bytesARRAY2例题内存数据定义伪指令例题 …VAR1DB32H,‘ABC’VAR2DW1234H,40H,‘AB’DD12345678HDB?,11000011BARRY1DB2DUP(0,1)ARRY2DW2DUP(?,1) …段定义伪指令存储器在逻辑上是分段的,各段的定义由伪指令实现格式:
〈段名〉SEGMENT[定位方式][连接方式][类别名]
:::
〈段名〉ENDS
段定义伪指令为程序的汇编和连接说明了段名、分段的各种属性以及分段的开始和结束。段名是自定义符,开始的段名与结束的段名必须相同。段的长度不超过64KB(字节)。SEGMENT后面的参数是可选项。定位方式定位方式指定段的起始地址边界,方式有以下四种:
(1)PAGE:指定起始地址的低8位是0,即其值能被256整除(称为页边界)。
(2)PARA:指定起始地址的低4位是0,即其值能16整除(称为段边界)。缺省值是PARA
(3)WORD:指定起始地址的最低位是0,即其值能被2整除(称为字边界)。
(4)BYTE:指定起始地址是任意值。连接方式连接方式告诉连接程序本段与其它段可按以下方式连接:PRIVATE:
不组合,默认状态是PRIVATEPUBLIC:依次连接(顺序由LINK程序确定)COMMON:覆盖连接STACK:堆栈段的依次连接AT表达式:段定义在表达式值为段基的节边界MEMORY:相应段在同名段的最高地址处类别名类别名是合法的自定义符,它必须用单引号括起来。如代码段(‘CODE’)、堆栈段(‘STACK’)等。凡是类别名相同的段在连接时均按先后顺序连接起来,即不同模块连接时将相同类别的段放在连续的内存区域中。格式:
ASSUME
段寄存器:段定义名1[,段寄存器:段定义名2,…]功能:说明所定义逻辑段的性质
该伪指令告诉汇编程序在汇编时,段寄存器CS:、DS:、SS:和ES:应具有的符号段基址,以便汇编指令时确定段和建立错误信息。但是段寄存器实际值(CS除外)还要由传送指令在执行程序时赋值。段寄存器说明伪指令例题DATA_SEG1SEGMENT
...(伪指令
Directives);数据段内定义各类程序执行需要的相关的数据DATA_SEG1ENDSDATA_SEG2SEGMENT …(伪指令
Directives)DATA_SEG2ENDS;还可根据具体程序的需要,定义堆栈段供程序执行过程中保持临时数据例题CODE_SEGSEGMENT
ASSUME
CS:CODE_SEG,DS:DATA_SEG1,ES:DATA_SEG2START:MOVAX,DATA_SEG1 MOVDS,AX MOVAX,DATA_SEG2MOVES,AX :::;完成具体操作的指令序列CODE_SEGENDS
ENDSTART实际操作(实现X+Y→Z)DATASEGMENT ;数据段
XDB05H YDB04H ZDB?DATAENDS
CODESEGMENT ;代码段
ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA ;数据段基址→AXMOVDS,AX ;AX→DS MOVAL,X ;内存单元X的数据→AL ADDAL,Y ;内存单元Y的数据+AL→AL,即X+Y→AL MOVZ,AL;AL→内存单元Z,即求和结果送回Z
MOVAH,4CH ;送功能号
INT21H ;系统功能调用,返回操作系统
CODEENDS
ENDSTART子程序定义伪指令格式:〈过程名〉PROC[NEAR](或[FAR])
:::
〈过程名〉ENDP
过程名是自定义符。定义过程是为实现子程序调用而设的。调用格式为:
CALL〈过程名〉
过程由RET指令返回,它可以不是最后一条指令,它在过程中可以设多点返回。并且过程起始名和终止名必须相同。例题
CODE_SEG SEGMENT
BEGINPROC FAR…CALLNEAR A…CALL FARB…
BEGINENDPA PROCNEAR…RETA ENDPCODE_SEG ENDSCODE_SEG1SEGMENTB PROC FAR…RETB ENDPCODE_SEG1ENDS定位伪指令格式:
ORG〈表达式〉
该伪指令把以下语句定义的内存数据或程序,从表达式指定的起点(偏移地址)开始连续存放,直至遇到新的ORG指令。表达式的值是一个无符号数。DATASEGMENT
ORG0100HD1DB11H,22H,33HDATAENDS112233DS:0100计算值为非负常数模块开始伪指令格式:
NAME
模块名该伪指令指明程序模块的开始,并指出模块名。模块名是自定义符,它不能是系统保留字,每次汇编只能出现一次。若该伪指令缺省,则取TITLE语句中的页标题前6个字符;若没有TITLE语句,则取源程序文件名为模块名。模块结束伪指令格式:
END[启动标号或过程名]该伪指令告诉汇编程序源文件结束,并给出执行程序的入口位置。启动地址只有在主模块才有意义。系统隐含进位制伪指令格式:
RADIX
表达式
定义在源程序中书写数据时的隐含进位制方式。表达式的值是2-16之间的十进制数,要遇到新的•RADIX语句后才改变隐含进位制。宏命令伪指令格式:
宏名MACRO[形式参数1,形式参数2,…]
ENDM功能:宏命令伪指令为指令序列定义一个宏名,称为宏指令,宏名可以像指令一样在程序中引用。
...…宏体(指令序列)宏命令——源程序中由汇编程序识别的具有独立功能的一段程序代码宏指令的使用宏指令的使用步骤:(1)宏定义:对各个宏指令进行定义,并分别起一个名字;(2)宏调用:在需要使用的地方,通过宏指令名来调用它;(3)宏扩展:由宏汇编程序用宏定义中的指令来代替宏调用中的宏指令名。宏命令伪指令当代换指令中的符号时,在其前面需加一个宏代换符&
例如:AD1MACROY,XMOVCL,XRO&YAX,CLENDM宏调用:经宏代换语句定义的宏名,在应用时可直接引用,这个过程称为宏调用。例如:AD1R,5
MOVCL,5RORAX,CL注意:宏调用时,形式参数要用实在的参数取代,顺序也应与形式参数顺序相同。宏指令-宏命令伪指令宏指令与过程的区别:
(1)宏调用语句由宏汇编程序中的宏处理程序来识别,并完成相应的处理,而调用过程中的CALL语句由CPU来执行。(2)汇编语言源程序在汇编过程中要将宏指令所代替的程序段汇编成相应的机器代码,每次调用均需插入到源程序的目标代码中,这样使用宏调用并不能缩短目标代码的长度。而在过程调用中,由于其目标代码与主程序分开独立存放的且在存储器中只保留一份从而能有效的缩短目标代码的长度。
(3)过程调用时需要保留程序的断点和现场,待过程执行完毕还要恢复现场,这些操作需要耗费CPU的时间,而宏汇编则不需要进行这些操作,因此,过程调用可节省程序占有的存储空间,但会降低程序的执行速度;而宏调用不能节省存储空间,却能有较快的执行速度。
(4)在每次宏调用时允许修改有关的参数,使得同一条宏指令在各次调用过程中可完成不同的操作;而“过程”一旦被定义,一般不允许修改,因此,任何一个“过程”在各次调用中只能完成完全相同的操作。宏指令-宏命令伪指令4.3
系统功能调用一、系统功能调用概述为给编写汇编语言源程序提供方便,MS-DOS系统中设置了几十个内部子程序,它们可完成I/O设备管理、存储管理、文件管理和作业管理等功能。其入口地址已由系统置入中断入口地址表中,在汇编语言源程序中可用软件中断指令调用它们。DOS功能调用高级调用,操作系统提供BIOS功能调用低级调用DOS功能调用包含多个子功能的功能包,用软中断指令调用,中断类型码固定为21H各子功能采用功能号来区分二、系统功能调用方法系统功能调用中的几十个子程序成为汇编语言程序员的重要工具,调用它们时采用统一的格式,只需要使用三个语句,如下所示:
(1)传送入口参数到指定寄存器中;(2)功能号送入AH寄存器中;(3)INT21H。
有的子程序无入口参数,则只需安排后两个语句,调用结束后,系统将出口参数送到指定寄存器中或从屏幕显示出来。常用的系统功能调用常用的系统功能调用有以下14个:
(1)键盘输入单字符(7)从串口输入单字符
(2)键盘输入字符串(8)向串口输出单字符
(3)输出单字符
(9)返回操作系统
(4)输出字符串(10)设置日期(5)设置时间(11)取得日期(6)取得时间(12)无回显键盘输入单字符(13)直接控制台输入/输出单字符(14)无回显直接控制台输入单字符键盘输入单字符键盘输入单字符——1号系统功能调用格式:
MOVAH,1INT21H说明:该调用没有入口参数,执行1号系统功能调用时,系统等待键盘输入,待程序员按下任何一键,系统先检查是否Ctrl-Break键,如果是则退出,否则将键入字符的ASCII码置入AL寄存器中,并在屏幕上显示该字符。注意:区分1、7和8号功能单字符输入例GET_KEY:MOV AH,1 INT 21H
CMP AL,’Y’ JZ YES CMP AL,’N’ JZ NO JNZ GET_KEY
YES:┇ NO: ┇交互式应答程序;输入的字符在AL中当第一、二条指令执行完时,系统等待键盘按键。按下任一字符时,AL中的内容即为该字符的ASCII码,同时显示器上显示出所按下的字符。键盘输入字符串键盘输入字符串——0AH号系统功能调用格式:
BUFDB20DB?
DB20DUP(?)
:::MOVDX,OFFSETBUFMOVAH,0AHINT21H;代码段中0A功能调用;字符串在内存中的存放地址在数据段中定义缓冲区输出单字符输出单字符—2号系统功能调用格式:
MOVDL,‘A’MOVAH,2INT21H说明:执行2号系统功能调用时,将置入DL寄存器中的字符从屏幕上显示输出(或打印)。
;待输出字符’A‘送到DL中输出字符串输出字符串——9号系统功能调用格式:
BUFDB‘goodbye$’MOVDX,OFFSETBUFMOVAH,9INT21H说明:执行9号系统功能调用时,将内存缓冲区BUF中存放的字符串送屏幕显示输出(或打印),缓冲区中的字符串必须以“$”字符作为结束标志。待输出字符串的偏移地址例
...BUFF2DB‘Howdoyoudo!$’...MOVDX,OFFSETBUFF2;送字符串的首地址至DXMOVAH,09H ;送功能号INT21H ;系统功能调用显示字符串
执行以上几条指令后,屏幕上将显示:Howdoyoudo!返回操作系统返回操作系统——4CH号系统功能调用格式:
MOVAH,4CHINT21H说明:该调用没有入口参数,执行结果是结束当前正在执行的程序,并返回操作系统。屏幕显示操作系统提示符(N>),N为当前使用驱动器名。设置时间设置时间——2DH系统功能调用格式:
MOVAH,2DHINT21H说明:如果设置成功,则将AL寄存器内容清“0”,否则将AL寄存器置全置“1”。如当前有效时间是8点15分20.5秒,应将小时数8置入CH寄存器,分钟数15置入CL寄存器中,秒数20置入DH寄存器中,百分之一秒数50置入DL寄存器中。
MOVCX,0815H
MOVDX,2050H
MOVAH,2DH
INT21H取得时间取得时间——2CH号系统功能调用格式:
MOVAH,2CHINT21H说明:该调用没有入口差数,执行结果是将当前时间送入CX和DX寄存器中供使用。
从串口输入单字符——3号系统功能调用格式:
MOVAH,3INT21H说明:该调用没有入口参数,系统将从异步通信口串行输入的字符置入AL寄存器中。从串口输入单字符向串口输出单字符向串口输出单字符——4号系统功能调用格式:
MOVDL,‘$’MOVAH,4INT21H说明:执行结果将DL寄存器中的字符通过异步通信口串行输出。无回显键盘输入单字符无回显键盘输入单字符——8号系统功能调用格式:
MOVAH,8INT21H说明:它没有入口参数,与1号系统功能调用的区别仅在于键入的字符不送屏幕显示。设置日期设置日期——2BH号系统功能调用格式:
MOVAH,2BHINT21H说明:将年号以装配型BCD码形式置入CX寄存器中,将月号置入DH寄存器中,将日期置入DL寄存器中,然后调用。如果设置成功,则AL寄存器为全0,否则AL寄存器将为全1,从此以后日期会自动修改。取得日期
取得日期——2AH号系统功能调用
格式:
MOVAH,2AHINT21H
说明:该调用没有入口参数,执行结果是将年号置入CX寄存器中,月份和日期置入DX寄存器中。直接控制台输入/输出单字符直接控制台输入/输出单字符——6号系统功能调用格式:
MOVDL,0FFHMOVAH,6INT21H无回显直接控制台输入单字符无回显直接控制台输入单字符——7号系统功能调用格式:
MOVAH,7INT21H说明:该调用没有入口参数,系统等待从控制台标准输入设备输入单字符后,将其ASCII码置入AL寄存器中。复习段定义伪指令〈段名〉SEGMENT〈段名〉ENDS
段寄存器说明伪指令
ASSUME
段寄存器:段定义名
子程序定义伪指令〈过程名〉PROC〈过程名〉ENDP
宏命令伪指令宏名MACROENDM
DOS功能调用一个完整源程序结构例DSEGSEGMENTDATA1DB1,2,DATA2DW1234HDSEGENDSESEGSEGMENTDB20DUP(?)ESEGENDSSSEGSEGMENTSTACK‘STACK’DB200DUP(?)SSEGENDS一个完整源程序结构例CSEGSEGMENTASSUMECS:CSEG,DS:DSEG,ES:ESEG,SS:SSEGSTART:MOVAX,DSEGMOVDS,AXMOVAX,ESEGMOVES,AXMOVAX,SSEGMOVSS,AX┇CSEGENDSENDSTART源程序代码程序的编辑、汇编及连接过程汇编语言的程序一般要经过编辑、汇编(MASM或ASM)、连接(LINK)和调试(DEBUG)这些步骤。
1.建立源程序文件
2.汇编(MASM或ASM)源程序
3.程序连接
4.执行程序
5.调试程序汇编语言程序设计与执行过程输入汇编语言源程序源文件.ASM汇编(编译)目标文件.OBJ链接可执行文件.EXE调试最终程序4.4汇编语言程序设计设计步骤:根据实际问题抽象出数学模型确定算法画程序流程图分配内存工作单元和寄存器程序编码调试在计算机上进行程序设计过程D:\masm>EDIT输入源程序D:\masm>MASM汇编D:\masm>LINK链接D:\masm>DEBUG调试简单程序简单程序是最简单的形式,计算机执行程序的方式是“从头到尾”,逐条执行指令语句,直到程序结束。
例:将内存(10050H)单元的内容拆成两段,每段4位,并将它们分别存入内存(10051H)和(10052H)单元。即(10050H)单元中的低4位放入(10051H)低4位,(10050H)单元中的高4位放入(10052H)的低4位,而(10051H)和(10052H)的高4位均为零。简单程序例题
设(10050H)=7AH,程序如下:
MOVAX,1000H
MOVDS,AX
;DS=1000H
MOVSI,50H
;需拆字节7AH的地址赋给(SI)=50H
MOVAL,[SI]
;取10050H中内容到AL中,
;(AL)=7AH
ANDAL,0FH
;把AL中的前4位清0,
;(AL)=0AH
01111010AND0000111100001010简单程序例题
MOV[SI+1],AL
;把OAH→(10051H)单元
MOVAL,[SI]
;把10050H内容到AL中,
;(AL)=7AH
MOVCL,4
SHRAL,CL
;逻辑右移四次,前4位补0,
;AL=(07H)
MOV[SI+2],AL
;放入(10052H)单元例题:内存自TABLE开始的连续16个单元中存放着0-15的平方值,查表求DATA中任意数X(0≤X≤15)的平方值,并将结果放在RESULT中。
DATA1SEGMENTTABLEDB0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225DATADB10RESULTDB?DATA1ENDS
STACSEGMENTDB100DUP(?)STACENDS
CODESEGMENT
ASSUMEDS:DATA1,SS:STAC,CS:CODESR:MOVAX,DATA1
MOVDS,AX
MOVAX,STACMOVSS,AXLEABX,TABLEMOVAH,0MOVAL,DATAXLATMOVRESULT,AL
MOVAH,4CHINT21H
CODEENDS
ENDSR
;ADDBX,AL;MOVAL,[BX]分支程序
分支程序是利用条件指令,使程序执行到某一指令后,根据条件是否满足,来改变程序执行的次序。这类程序使计算机有了判断作用。分支程序例题1例1:求AX累加器和BX寄存器中两个无符号数之差的绝对值,结果放在内存(2800)单元中。否是分支程序例题1
CLC
;清除CF
CMP
AX,
BX
;AX-BX≥0?
JC
AA
;CF=1,转AA执行
SUB
AX,
BX
;AX←AX-BX
MOV
DI,
2800H
;结果指针DI=2800H
MOV[DI],AX
;结果送至2800,2801H单元
HLT
AA:
SUB
BX,
AX
;BX←BX-AX
MOV
DI,
2800H
MOV
[DI],
BX
HLT分支程序例题2例2:
编写一个程序,从外设71号中取一个数M,判断其值是否在10H和20H之间。如果M≥20H,则送0FFH给外设73H;如果M<10H,则送00H给外设73H;如果10H≤M<20H,则送88H给外设73H。
判断M的分支流程图
START:IN
AL,
71H
;将71H端口的字节读入AL
CLC
;清除CF
CMP
AL,10H
;AL与10H比较
JC
LP1
;小于10H转至LP1
CMP
AL,20H
;AL与20H比较
JC
LP2
;10H≤AL<20H转到LP2
MOV
BL,0FFH
;AL≥20H则0FFH→BL
LP3:
MOVAL,BL
OUT
73H,AL
;将BL内容输出到73H端口
HLT
;暂停
LP1:
MOV
BL,
00JMP
LP3LP2:
MOV
BL,
88HJMP
LP3例题:编写程序,完成符号函数:假设x的值存放在DATA1中,y的值存放DATA2中。DATSEGMENTDATA1DBXDATA2DBYDATENDSCODSEGMENTASSUMECS:COD,DS:DATST:MOVAX,DATMOVDS,AX
MOVAL,DATA1CMPAL,0JGEBIG;大于等于转BIGMOVAL,0FFH;DATA2中置-1MOVDATA2,ALJMPAABIG:JEEQUAL;ZF=1,转EQUALMOVAL,1;DATA2中置+1MOVDATA2,ALJMPAAEQUAL:MOVAL,0;DATA2中置0MOVDATA2,ALAA:MOVAH,4CHINT21HCODENDSENDST循环程序循环程序是强制CPU重复执行某一指令系列的一种程序结构形式,凡是要重复执行的程序段都可以按循环结构设计。循环结构程序简化了程序执行过程。相反,增加了一些循环控制等环节,总的程序执行语句和时间会有所增加。循环程序的组成:
循环程序的组成可分为初始化、循环化、循环控制和循环结束处理。循环程序(1)初始化:完成建立循环次数计数器,设定变量和存放数据的内存地址指针的初值,装入暂存单元的初值等。(2)循环体:是程序的处理部分(3)循环控制:包括修改指针、修改变量为下一次循环作准备,以及修改循环计数器,判断循环次数完成否。(4)结束处理:主要用来分析和存放程序的结果。循环程序基本结构框图循环程序例题1例1:要求将DATA1:0000地址开始的100个数据送到DATA2:0000开始的单元中去
MOV
AX,
DATA1
MOV
DS,
AX
;设置源操作数段首地址
MOV
AX,
DATA2
MOV
ES,
AX
;设置目的操作数段首的地址
MOV
SI,
0
;源操作数偏移地址送至SI
MOV
DI,
0
;目的操作数偏移地址送至DI
MOV
CX,
0100
;传送的字节数送CX寄存器循环程序例题1
CLD
;使DF=0指针按增量方向修改
NEXT:MOVSB
;将源地址的1个字节送到目的地址单元
DEC
CX
;字节数减1
JNZ
NEXT
;100H字节如未传送完,则继续传送
:
其中NEXT:MOVSBDECCXJNZNEXT
可用一条语句REPMOVSB
代替循环程序例题2例2:在一串数中找出最大值和最小值,并将最大值和最小值放在指定的存储单元中。程序流程图循环程序例2程序体
DATA
SEGMENTBUFFER
DW
X1,X2,…XnCOUNT
EQU($-BUFFER)/2MAX
DW?MIN
DW?DATA
ENDSPROG
SEGMENTASSUME
CS:PROG,
DS:DATASEARCH
PROG
FARSTART:
MOV
AX,
DATAMOV
DS,
AX循环程序例2程序体MOV
CX,
COUNTLEA
BX,
BUFFERMOV
AX,
[BX]MOV
DX,
[BX]DEC
CXLP:INC
BXINC
BXCMP
AX,
[BX]JGE
NEXT1MOV
AX,
[BX]JMPNEXT2
NEXT1:
CMP
DX,
[BX]JL
NEXT2MOV
DX,
[BX]NEXT2:
LOOP
LPMOV
MAX,
AXMOV
MIN,
DXMOV
AH,4CHINT
21H
SEARCH
ENDPPROG
ENDSEND
START子程序
子程序相对主程序而定,是一个子的程序段,确切地说,它是被父程序调用的程序。一般子程序具有公用性,重复性或有相对独立性的特点。〈一〉子程序的调用与返回
子程序的调用与返回由CALL和RET指令实现。子程序的调用实际上是程序的转移,但它与转移指令有所不同,转子指令CALL执行时要保护返回地址,而转移指令不考虑返回问题。每个子程序都有RET指令负责把压入栈后的返回地址弹出送IP或CS和IP(段间返回)实现程序返回。子程序〈二〉子程序设计与应用应该注意的问题(1)现场保护与恢复
子程序使用时,要注意寄存器内容的保护。由于CPU的寄存器的数量有限,子程序使用的寄存器往往会和调用的寄存器发生冲突,破坏了调用程序中寄存器的内容,影响了子程序返回后的继续处理。为了避免这种现象,在子程序入口处把所用寄存器的内容投入堆栈,保护起来,而在退出子程序前恢复寄存器的内容是必要的。恢复现场是保护现场的逆操作。当用栈区保护现场时,应注意恢复现场的顺序。子程序
(2)参数传递
指主程序与子程序之间相关信息或数据的传递。参数传递方式有寄存器传递,用内存单元传递或用栈区传递(寄存器、变量、地址表、堆栈等)。(3)子程序说明
由于子程序有共享性,可被其它程序调用,因此,每个子程序应有必要的使用注释。主要包括:〈1〉子程序名;〈2〉功能、技术指标;〈3〉占用寄存器和存储单元;〈4〉入口、出口参数;〈5〉嵌套哪些子程序子程序〈三〉子程序调用技巧常用技巧(1)子程序嵌套子程序调用子程序的过程。(2)子程序递归子程序调用自身的过程。(3)可重入子程序子程序被调用后没有执行完又被另一程序重复调用。(4)协同子程序两个以上子程序协同完成一项任务,且又相互调用,直到任务完成。子程序例题
例:数组求和子程序。假设有一数组求和子程序SUM,试用这个子程序分别求出ARY1和ARY2两个数组和,结果分别存入SUM1和SUM2字单元中。
DATASEGMENTARY1DB03H,07H,50H,06H,23H,45H,0F6H,0DFHLEN1EQU$-ARY1SUM1DW?ARY2DB33H,44H,55H,12H,78H,89H,0FFH,0CDHL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 赊销额度协议书
- 楼栋长志愿服务协议书
- 背书转让协议书
- 变更孩子抚养权协议书
- 综合还款协议书
- 考研录取协议书
- 房屋代买卖合同协议书
- 酒场休战协议书
- 道路绿化协议书
- 米油回收协议书
- 细致解读wps考试内容的试题及答案
- 2025届高考语文写作押题范文8篇及分析
- 纸张印刷与印后加工考核试卷
- 2025年汽车维修工职业资格考试重点试题及答案
- 2024年四川西华师范大学招聘辅导员真题
- 2025年安全生产考试题库:安全生产隐患排查治理安全生产责任制试题
- 2025年高考英语语法填空热点语法填空热点话题06(学生版+解析)
- 湛江漓源农牧科技有限公司年产36万吨饲料项目环境影响报告表
- 随班就读试题及答案
- 1.1细胞是生命活动的基本单位课件高一上学期生物人教版(2019)必修1
- 2024年福建省长乐市事业单位公开招聘医疗卫生岗笔试题带答案
评论
0/150
提交评论