计算机组成原理与汇编语言程序设计课件

PPT
  • 阅读 157 次
  • 下载 0 次
  • 页数 86 页
  • 大小 848.500 KB
  • 2022-11-12 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
计算机组成原理与汇编语言程序设计课件
可在后台配置第一页与第二页中间广告代码
计算机组成原理与汇编语言程序设计课件
可在后台配置第二页与第三页中间广告代码
计算机组成原理与汇编语言程序设计课件
可在后台配置第三页与第四页中间广告代码
计算机组成原理与汇编语言程序设计课件
计算机组成原理与汇编语言程序设计课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 86
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】计算机组成原理与汇编语言程序设计课件.ppt,共(86)页,848.500 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-2515.html

以下为本文档部分文字说明:

计算机组成原理与汇编语言程序设计第5章©UCBSpring2005第1页,共86页。五、汇编语言程序设计•重点章节1.掌握:常用汇编语言语句、伪指令、源程序的一般结构,顺序程序设计,分支程序设计,简单循环程序设计,子程序设计;能够读写常用汇编语句编写的程序段。2.

理解:宏操作伪指令,系统功能调用。3.了解:汇编语言程序的开发方法。第2页,共86页。五、汇编语言程序设计•汇编语言程序是符号化的机器语言,汇编语言必须经过“汇编”(即翻译)转换成机器语言指令代码,再由计算机识别并执行。•汇编语言源程序→→目标程序•汇编语

言源程序的基本组成单位是语句。•源程序中使用的语句有三种:指令语句、伪指令语句和宏指令语句(或称宏调用语句)•5.1概述•5.2汇编语言语句•一、指令语句格式指令语句的一般格式如下:标号:指令助记符操作数;注释•1.标号:标号是机器指令语句存放地址的

符号表示,代表该指令目标代码的第一个字节地址,后面必须紧跟冒号“:”,在指令语句中,是任选字段。•2.指令助记符:指令助记符为语句的核心成分,表示了该语句的操作类型。汇编程序操作数的有无、有几个,取决于指令助记符翻译后,没有对应的目标代码第3

页,共86页。五、汇编语言程序设计•3.操作数:操作数表示指令助记符的操作对象。•4.注释:注释均以分号开始,它可占一行或多行,一般放在一条语句的后面。例:一项是含有4个字段的一条指令语句:LOP:MOV

AX,0000H;将AX清零标号指令助记符操作数注释例:以下是含有4个字段的一条指令语句INCCX•二、伪指令语句格式如下:[符号名]伪指令符操作数;注释•1.符号名:符号名是伪指令语句的一个可选项。允许

是常量名、变量名、过程名或段名。注意符号名后无冒号。•2.伪指令符:伪指令符指定汇编程序要完成的具体操作,如数据定义伪指令DB、DW、DD,段定义伪指令SEGMENT,假定伪指令ASSUME等。此字段必不可少。第4页,共86页。五、汇编语言程序设计•3.操作数:伪指令后面的操作数可以是常

数、字符串、变量、表达式等,其个数由具体的伪指令决定,各个操作数之间必须以“逗号”分隔。•4.注释:伪指令的注释必须以“;”开始,其作用同指令语句中的注释部分。•伪指令语句是指示汇编程序如何汇编源程序的命令语句,在汇编时,它不产生目标代码,由汇编程序解释他的意义逼供能立即完成相应的操作。•例:以下

是一条伪指令语句:VAR1OB12H;给VAR1分配一个字节单元,初值为12H•三、标识符•标识符是指令语句中标号和伪指令语句中的符号名和统称,其组成规则如下:•(1)字符个数1~31;•(2)第一个字符开始,可以是字母或特殊字符,特殊字符有5

个:?@_$.;•(3)第二个字符开始,可以是字母、数字或特殊字符;•(4)标识符不能与系统专用保留字(伪/指令助记符)相同第5页,共86页。五、汇编语言程序设计•例如:标识符:?ABC、_VAR、.234、

A2非标识符:1ABC、+VAR、ADD、256总结:伪指令和指令的通用格式:1~31•1.名字字段(NameField)名字字段的三个注意事项:开头•2.操作符字段(OperatorField)保留字•3

.操作数字段(OperandField)•4.注释字段(CommentField)•5.3汇编语言数据•5.3.1符号定义语句•1、等值伪指令•指令格式:符号EQU表达式/符号•EQU伪指令的左移是将表达式的值或表达式赋给EQU左边的符号•例:用符号标识常数、数值表达式NUMEQU10HCO

UNEQU1234+34-67VARDBNUM…MOVAX,NUM符号定义后可在表达式中使用第6页,共86页。五、汇编语言程序设计•例:用字符代表地址表达式、变量名和标号ADREQUES:[BX][SI]

VBEQUDATA_BYTE+1L1EQUFARPTRSUB1…MOVADR,ALADDBL,VBJMPL1•例:用符号代表寄存器、指令助记符AREGEQUAXMEQUMOV…MOVAREG,1234HMCX,BX•等值伪指令语句仅在汇编源程序时,作为替代符号用,不产生任何目标代码,

也不分配存储单元。•在同一源程序中,同一符号不能用EQU伪指令重新定义。例如:第7页,共86页。五、汇编语言程序设计•MEQUMOV…•MEQUMUL•第二条语句在汇编时,会产生符号重新定义的语法错误。•2、等号伪指令•格式:符号=表达式•这种伪指令的含义和作用与EQU等值伪指令相同。但有

如下差异:•(1)等号伪指令可以重新定义符号。例如:CONT=10M=100…CONT=CONT+10M=30•(2)等号伪指令不可以重新定义汇编指令,EQU可以第8页,共86页。五、汇编语言程序设计•5.

3.2数据定义语句•数据定义伪指令语句格式如下:DB•变量名DW表达式1,表达式2,…DD•DB:为定义的变量分配字节单元•DW:为定义的变量分配字单元•DD:为定义的变量分配4个字节单元/双字单元数据定

义语句必须出现在某个逻辑段中•例:在DATA1数据段中定义了3个变量:DATA1SEGMENTVAR1DB10HVAR2DW1234HVAR3DD12345678H•经过定义后的每个变量都有3个属性:标识符条件伪指令符第9页,共86页。五、汇编

语言程序设计•(1)段属性(SEG)表示变量存放在哪一个逻辑段中,它是用变量所在段的段基值来表示的。例如上面的DATA1数据段定义的VAR1、VAR2、VAR33个变量段属性就是DATA1段的段基值。•(2)偏移量属性(OFFSET)该

属性表示变量在逻辑段中相距段起始地址(段基址)的字节数。例如:VAR1的偏移量为0,VAR1的偏移量为1,VAR1的偏移量为2•上述段和偏移量2个属性就构成了变量的逻辑地址。•(3)类型属性(TYPE)该

属性表示变量所占存储单元的字节个数:字节数据、字数据、双字数据。DB将变量定义为字节型(1个字节),DW将变量定义为字型(2个字节),DD将变量定义为双字型(4个字节)。•数据定义语句按照伪指令DB,DW和DD所确定的数据大小来给变量(或存储单元)分

配相应数量的存储单元,同时给这些存储单元预置由表达式确定的初值。它们通常有以下几种形式:•1、数值表达式•例如:DATA数据段定义了字节、字、双字变量第10页,共86页。五、汇编语言程序设计•DATASEGMENT•VARB1DB10H•VARB2DB10,11,12DB0FF

H,0•VARWDW1234H,5678H•VARDDD12345678H•DATAEND•VARB1…10HVARB20AH0BH0CHFFH00H34H12H78H56H78H56H34H12H…VARWVARD字字双字第11页,共86页。五、汇编语言程序设计•2、字符串表达式•例如:

以下是3个字符串变量的定义•DATA_SSEGMENT•STRING1DB‘ABCD’•STRING2DW‘AB’,‘CD’,‘A’•STRING3DD‘AB’•DATA_SEND•A、用DW伪指令定义字符串时,每一个字符串只能由1~2个字符组成,

并分配2个字节存储单元。如果是两个字符组成,则前一个字符的ASCII码放在高字节单元中,后一个放在低字节单元。•B、DD定义字符串时,每一个字符串只能由1~2个字符组成,并分配4个字节存储单元。其中1~2

个字符的ASCII码存储在两个低字节(顺序和DW伪指令相同)中,两个高字节放00H。•C、DB伪指令定义字符串时,每个字符串中字符个数不得超过256个。第12页,共86页。五、汇编语言程序设计•3、地址表达式(只适用

DW和DD两个伪指令)•4、?表达式•5、带DUP的表达式DB•变量名DW表达式1DUP(表达式2)DDDUP操作符允许嵌套使用,即表达式2又可以是一个带DUP的表达式STRING1…41HSTRING242H43H44H42

H41H44H43H41H00H42H41H00H00H…STRING3字字双字字第13页,共86页。五、汇编语言程序设计•例如:BUFDB100DUP(0)•以上语句定义了以BUF为首址,大小为100个字节,初值为0的数据存储单元。•5.3.3数据•一、常数•1、数值常

量•第14页,共86页。五、汇编语言程序设计•2、字符串常量•字符串常量是用单引号或双引号引起来的一个或多个字符。字符串常量是以各字符的ASCⅡ码表示的。如‘A’用41H表示,字符串‘A1B2’用41H,31H,42H,32H表示。•3、常数的使用•(1)在指令语句的源操作数中作立即数。如

:ADDAL,0F5H;常数作源操作数MOVAX,’AB’;字符串作源操作数MOVCX,’12’;字符串作源操作数•(2)在指令语句中,常数可作为存储器操作数寻址方式中的位移量。如:MOVAX,DS:[1000H];直接寻址方式ADD10H[DI

],CX;变址寻址方式MOVAL,0ABH[BX];基址寻址方式SUBDX,1234H[BP][SI];基址变址寻址方式•(3)在数据定义伪指令中,可作为分配单元的初值。如:DW1234H;定义一个字数据DB‘ABCD’;定义4个字符的字符常量第15页,共8

6页。五、汇编语言程序设计•二、变量•1、变量•(1)段属性•(2)偏移地址属性•(3)类型属性•2、变量的使用•在一个逻辑段中,用数据定义语句定义并预置数据初值后,变量名就作为存储单元的符号地址,代表了存放在存储单元的数据。引用变量名就是使用变量。其他语句

中,使用分为两种情况:•(1)在指令语句中一个地址表达式的值表示了存放操作数的存储单元偏移量。a、直接引用变量名对变量进行存取操作例如:VAR1DB0FFHVAR2DB?STRINGDB‘ABCD’…MOVAL,VAR1;直接寻址方式MOVVAR2,AL;直接寻址方式MOVBL,STRING+

1;放B字符的ASCII码放到BL中第16页,共86页。五、汇编语言程序设计b、位移量部分使用变量名例:VAR3DB10HDUP(1)VAR4DW10HDUP(?)…MOVAL,VAR3[SI];变址寻址,用VAR3的偏移量作为源操作数的位移量MOVVAR4[BX][D

I],DX;基址变址寻址,用VAR4的偏移量作为目的操作数的位移量•(2)在用DW或DD的数据定义伪指令中分配的存储单元中,将预置被引用变量的地址部分--段基值和偏移量。如使用DW,则仅有被引用变量的偏移量;如使用DD,则前两个字节存放偏移量,后两个字节存放段基值。

在这种情况下,不能在DB数据定义语句中引用变量名。例:…VAR1DB10HDUP(0)VAR2DW10HDUP(‘AB’)ADR1DWVAR2ADR2DDVAR2…第17页,共86页。五、汇编语言程序设计•上述示例中,变量ADR1的内容(即

字存储单元内容)是变量VAR2的偏移量,而ADR2双字存储单元的内容是变量VAR2的偏移量和段基值。•三、标号•指令语句的名字字段上的名字叫标号,它是一条指令的符号地址。•标号是一条指令语句的符号地址。在汇

编源程序中,只有在需要转向一条指令语句时,才为该指令语句设置标号,以便在转移类指令(含子程序调用指令)中直接引用这个标号。因此,标号可作为转移类指令的操作数,即转移地址。例:符号地址表示。┆NEXT:MOVAL,[SI];带标号NEXT的指令┆DECCXJNEN

EXT;标号NEXT作转移指令的操作数第18页,共86页。五、汇编语言程序设计•和变量一样,每个标号也有3个属性:•(1)段属性(SEG)段属性表示标号所在指令在哪个逻辑段,用这个逻辑段的段基值表示。•(2)偏移量属性(OFFSET

)偏移量属性表示标号所在指令离段起始单元之间的字节数(准确地讲,是指这条指令目标代码的首字节单元与段起始单元之间相距的字节数)同样,上述两个属性就构成了这条指令的逻辑地址。•(3)类型属性(TYPE)类

型属性表明了它的转移特性,即是作为段内转移还是段间转移的目标地址。标号的类型属性有2中:NEAR(近):段内转移。本标号只能作为标号所在段转移类指令的目标地址。FAR(远):段间转移。本标号可作为其他段(不是标号所在段)转移类指令的目

标地址第19页,共86页。五、汇编语言程序设计•标号的类型属性可以用下面两个方法来设置:•1、隐含方式,某一指令选定一标号后,隐含为NEAR属性。例如:NEXT:MOVAX,1234H这时,标号NEXT就具有NEAR的类型属性。隐含方式不能设置FAR属性•2、用标识伪指令LABEL设置类型属性。

LABEL伪指令语句格式:名字LABEL类型LABEL伪指令的意义是:指定名字(如标号、变量名)的类型属性。通常与指令语句、数据定义语句配合使用,补充设置类型属性。其使用分2中情况:•A、LABEL语句与指令语句连用SUB1_FARLABELFARSUB1:MOVAX,789

H…第20页,共86页。五、汇编语言程序设计•SUB1_FAR和SUB1有相同的段和偏移量属性的标号,但属性类型不同,SUB1_FAR是FAR,SUB1是NEAR。如果这一指令是某程序段的入口,则段内转移时可用SUB1作为入口,而其他段

转移到此程序段时,就要用SUB1_FAR作入口。•B、LABEL语句与数据定义语句连用例:DA_B1LABELBYTEDA_W1DW10HDUP(1234H)上述变量DA_W1的数据类型是字,因此每次对它的存取是按字(两个字节)进行。

如:“MOVAX,DA_W1+4”指令就是把DA_W1起始的第5,6个字节组成的3个字节送AX。欲想取出第5个字节的内容,这时可用“MOVAL,DA_B1+4”。•5.3.4表达式与运算符•1.算术运算符•2.逻辑运算符

•3.关系运算符•4.属性与分离字节运算•5.数值返回运算符第21页,共86页。五、汇编语言程序设计•1.算术运算符•算术运算符包括:+(加)、-(减)、*(乘)、/(除)、MOD(求模)、[](下标运

算)、SHL(左移)、SHR(右移)几种,它既可以用于数值表达式又可用于地址表达式。•【例3.4】用算术运算符进行数值表达式运算。┆NUM1EQU25*4–50;NUM1=50NUM2EQUNUM1/7;NUM2=7N

UM3DBNUM1MOD7;NUM3=1VAR1DB1,2,3,4,5VAR2DB‘12345’NUM4EQUVAR2-VAR1;NUM4=5NUM5EQU0FH┆MOVAL,NUM5SHL4;(AL)=11110000BMOVBL,NUM5SHR4;(BL)=000000

00B第22页,共86页。五、汇编语言程序设计•移位运算符与移位指令是完全不同的。移位运算符是对某一具体数(常数)在汇编时完成移位的,而移位指令是对一个寄存器操作数或存储器操作数,在程序允许时完成的。•下标运算符[]只用于地址表达式,它表示地址相加,常用于存取数

组元素。如:下面两条指令语句是等价的。MOVAX,ARRAY[3]MOVAX,ARRAY+3•2.逻辑运算符•逻辑运算符包括:逻辑乘(AND)、逻辑加(OR)、按位加(XOR)、逻辑非(NOT)四种运

算。由于逻辑运算是按位操作,且在汇编过程中完成,因而运算的结果仍为整数常量。【例】用逻辑运算符进行运算。MOVAL,34HAND0FH;04H→ALMOVBL,05HOR30H;35H→BL第23页,共86页。五、汇编语言程序设计MOVCX,NOT00FFH;0FF00H→CXMOVDX

,789AHXOR000FH;7895H→DX•3.关系运算符•关系运算符包括:相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。•对2个表达式比较要求2个表达式表示方

法/性质相同,例同为数值表达式或地址表达式。当关系成立时,结果为全1;不成立时,为全0。【例】用关系运算符进行数值表达式运算。•NUM1DB10LT5;NUM1=0•NUM2DB0AAAAHGT7FFFH;NUM2=0FFFFH•MOVAX,‘A‘EQ41H;0FFFFH→AX•MOVBX,

NUM2LTNUM1;0→BX第24页,共86页。五、汇编语言程序设计•4.数值返回运算符•(1)SEG运算符•(2)OFFSET运算符•(3)TYPE运算符•(4)LENGTH运算符•(5)SIZE运算符•(1)SEG运算符•格式:SEG

变量或标号•功能:分离出其后变量或标号所在段的段首址。例如:MOVAX,SEGARRMOVDS,AX•(2)OFFSET运算符•格式:OFFSET变量或标号•功能:分离出其后变量或标号的偏移地址。例如:MOVBX,OFFSETBUF第25页,共86页。

五、汇编语言程序设计•例:设DATA数据段是从物理地址20000H开始,其定义如下:DATASEGMENTVAR1DB10,15,20VAR2DW0FFFFH,100HDATAENDS┆MOVAX,SEGVAR1MOVSI,OFFSETVAR1MOVBX,S

EGVAR2MOVDI,SEGVAR2•上述4条指令汇编后就分别是:MOVAX,2000HMOVSI,0MOVBX,2000HMOVDI,3第26页,共86页。五、汇编语言程序设计•(3)TYPE运算符•格式:TYPE变量或标号•功能:分离出其后变量或标号的类型。如果是变量,将

返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。它们之间的关系见表3.2所示。第27页,共86页。五、汇编语言程序设计•例如:VAR1DB12H,13HVAR2DW10H,DUP(0)VAR3DDVAR1┆MOVAL,TYPEVAR1

;AL=1MOVCX,TYPEVAR2;CX=2MOVBL,TYPEVAR3;BL=4•(4)LENGTH运算符和SIZE运算符•格式:LENGTH变量•功能:取出变量所含的数据存储单元个数。•格式:SIZE变量•功能:取出变量所含的数据存储区大小

。其返回值为:LENGTH变量*TYPE变量第28页,共86页。五、汇编语言程序设计•LENGTH和SIZE运算符的具体运算规则是:如果变量是用重复操作符DUP定义的,那么运算符LENGTH的运算结果是外层DUP的给定值(即外层重复次数),如

果没有用DUP定义的变量,运算结果总是1。而运算符SIZE是LENGTH和TYPE两个运算结果的乘积。【例】取出变量占存储单元个数。DATASEGMENTADB‘ABCDEF’BDW10DUP(1,2DUP(2))

CDB3,20DUP(0)DATAENDS┆MOVAX,LENGTHA;1→AXMOVBX,LENGTHB;10→BXMOVCX,LENGTHC;1→CX┆第29页,共86页。五、汇编语言程序设计SI

ZEA=LENGTHA*TYPEA=1SIZEB=LENGTHB*TYPEB=20SIZEC=LENGTHC*TYPEC=1•SIZE只能加在变量前面,对于一维数组,正好是数则所占的存储单元的字节数。•5、属性与分离字节运算•1、属性运算符这

种运算符的运算对象只能是变量、标号或存储器地址。其功能是在汇编过程中,为存储器操作数指定一个新的类型属性。•格式:类型PTR地址表达式其中,类型可以为BYTE、WORD、DWORD、NEAR和FAR,地址表达式是指要

修改类型属性的变量、标号或存储器操作数。这种类型属性的设定只在含有这运算符的语句内有效。•PTR与EQU连用,可定义与PTR右边地址表达式类型不同的新变量名或新标号,但不另分配存储单元。例如:第30页,共86页。五、汇编语

言程序设计VRW1DW1234HVRB1EQUBYTEPTRVRW1┆MOVAX,VRW1MOVBL,VRB1;•不会为VRB1重新分配新的存储单元,VRB1和VRW1具有相同的段属性和偏移量。即逻辑

地址相同。•在指令中也可使用PTR,临时修改变量或标号属性仅在此指令中存放,其他指令无效。•例如:VBDB10HDUP(0)VWDW20HDUP(0)┆MOVAX,WORDPTRVB[6]ADDBYTEPTRVW[1],0FHINCWORDPTR[SI]JM

PFARPTRSUB1AX是16位,临时修改按字访问0FH是8位,临时修改按字节访问第31页,共86页。五、汇编语言程序设计•2、分离字节运算符•字节分离运算符包括:HIGH和LOW。•格式:HIGH常量或地址表达

式LOW常量或地址表达式•功能:HIGH用来分离出其后16位常量或地址表达式的偏移量的高字节;LOW用来分离出其后16位常量或地址表达式偏移量的低字节。•运算符优先级:见课本P187表5-5•5.4伪指令语句•5

.4.1段定义语句•编制一个8086/8088汇编语言程序,段是基础。一是必须按照段来构造程序,二是程序的执行,根据DS、ES、CS、SS分别访问不同段对应的单元。•一、段定义伪指令SEGMENT/END•二、段寻址伪指令ASSUME•三、段寄存器的装入第32页,共86页。五、汇编语言程

序设计•一、段定义伪指令SEGMENT/END•定义段名、起始边界•其语句格式为:段名SEGMENT定位类型组合类型‘类别名’┆(段内的语句序列)┆段名ENDS•1.段名•2.定位方式•3.类别•4.组合方式•1、段

名•段名是为该段起的名字,用来指出汇编程序为该段分配的存储区起始位置。由用户自定,且必须满足标识符的条件。如STACK、CODE、DATA第33页,共86页。五、汇编语言程序设计•2.定位类型•定位类型是一个选项,它表示对段起始边界的要求,可以有4种选

择:•(1)PAGE(页):表示本段要从一个页的边界开始,即能被256整除的地址处开始存放,即起始地址的最低八位必须是0。•(2)PARA(节):表示本段必须从一个节的边界开始,即必须从能被16整除的地址处开始存放,即段起始地址最低四位必须是0。如果未选择定位类

型,则隐含PARA。•(3)WORD(字):表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。•(4)BYTE(字节):表示本段起始地址可以从任一地址处开始存放。•3、组合类型组合类型也是一个可选项,它表示本段是否与其它段进行连接,有六种类

型可供选择。•(1)NONE“不选择”•(2)PUBLIC•(3)STACK•(4)COMMON•(5)MEMORY•(6)AT表达式第34页,共86页。五、汇编语言程序设计•(1)NONE这是隐含选择,表示本段与其他段

在逻辑上无连接关系,本段有自己的段基址。•(2)PUBLIC在满足定位类型的条件下,将本段与其他段名相同的段邻接在一起形成一个段,共用一个段基址,并相对这个段基址调整段内变量的偏移量。•(3)COMM

ON当连接多个程序模块时,为各模块中段名相同且用COMMON说明的段指定相同的段起始地址,并产生一个覆盖段。该段的长度取决于最长的COMMON段的长度。•(4)STACK将同段名的段连接成一个连续段,并且自动初始化堆栈寄存器SS和堆栈指针SP,SS中为这个段的段基值,SP中为该段的字节长

度。•(5)MEMORY表示本段连接在其它所以段的后面,即分配在存储器的高址址端。•(6)AT表达式表示本段的起始地址由表达式的值指定。表达式的值只能为16位二进制数。如“AT1001H”表示本段从主存地址10010H开始。(表示本段可定位在表达式所指示的

小节边界上)第35页,共86页。五、汇编语言程序设计•4、类别名•用‘’(单引号)引起来,通常同类型的段可用相同的类别名。当链接程序对这些段进行连接的时候,将它们临接放在一起。•例下面是一个源程序的分段结构:DATA1SEGMENTPARA‘DATA’┆DATA1ENDSSTACK1SE

GMENTPARA‘STACKD’┆STACK1ENDSDATA2SEGMENTBYTE‘DATA’┆DATA2ENDSSTACK2SEGMENTPARA‘STACKD’┆STACK2ENDSCODESEGMENTPARAMEMORYASSUMECS:CODE,D

S:DATA1,SS:SISTART:…….CODEENDSENDSTART组合类型NONE数据段类别名组合类型NONE相同,与第一个段临接的放在一起组合类型STACK相同,两个段临接的放在一起第36页,共86

页。五、汇编语言程序设计•DATA1和DATA2在内存中装在一起,但是有各自不同的逻辑地址,逻辑上不相关。DATA2的定位类型是BYTE,所以与DATA1无间隔。STACK1从一个节的边界开始的,STACK2与前一个STACK1有相同的类别名。由于STACK2使用节边界,所以可能与STA

CK1有间隔。CODE段放在所以段的后面,起始边界是节边界,所以可能与前面的有间隔。主存DATA1DATA2STACK1STACK2CODE……FFFFFH00000H通过汇编连接在内存中的情况第37页,共86页。五、汇编语言程序设计•通常练习用的程序,通常只需分三个段,其结构如下:•DATA

SEGMENT┆DATAENDSSTACK1SEGMENTPARASTACK┆STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:……┆CODEENDSENDSTART•DATA无定位类型和组合类型

,表明其它定位类型为节边界。组合类型为NONE;STACK1,节边界,组合类型STACK;CODE,代码段,无定位类型、组合类型。第38页,共86页。五、汇编语言程序设计•二、段寻址伪指令ASSUME•格

式:ASSUME段寄存器:段名[,段寄存器:段名]•功能:建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。•【例3.21】用ASSUME伪指令建立代码段、堆栈段与CS和SS的对应关系。•DATA1SEGMENT•DA1DB?•DATA1ENDS•DATA2SGEM

ENT•DB2DB?•DATA2ENDS•CODESEGMENT•ASSUMECS:CODE,DS:DATA1,ES:DATA2•START:……•DA3DB?•MOVDS,AX;DATA1→DS•MOVAX,DATA3•MOVES,AX

;DATA3→ES•┆•CODEENDS•ENDSTART第39页,共86页。五、汇编语言程序设计•变量所在的段是由哪个段寄存器指定的。DA1所在段DATA1由DS段寄存器提供,DA2所在段DATA2是由ES段寄存器提供,DA3所在CODE段是由CS提供。•在汇编

程序在汇编每条指令时,如有需要访问存储器的操作,就要进行逻辑地址到物理地址的转换,这时应该知道使用哪个段寄存器。•ASSUME只指明段和段寄存器之间的关系,而不产生任何目标代码。•三、段寄存器的装入•4个

段寄存器的装入方法有所不同,下面分别介绍:•1、DS和ES的加载•在程序中,必须使用MOV指令才能将对应段的段基值装入。因为在程序中,引用段名就是以立即数形式获取该段的段基值,而立即数又不能直接传送给段寄存器,所以要借助通用寄存器传送段基值给DS、ES。

•例如:DADSSEGMENTVAR1DB10HDADSENDSDAESSEGMENTVAR2DB20H第40页,共86页。五、汇编语言程序设计DAESENDSCODESEGMENTASSUMECS:CODE,DS:DADSSTRAT:MOVAX,DADSMOVDS,AXMOVAX,

DAESMOVES,AXINCVAR1DECES:VAR2┆CODEENDSENDSTART•2、SS的加载•SS是堆栈段寄存器,对它加载就是设置堆栈。2种方法:•(1)自动加载•在段定义伪指令时,SEGMENT语句中的组合类选择“STACK”,表明这个段是堆栈段。

DADS的段基值是立即数,因立即数不能直接送段寄存器,故通过AX送入DS第41页,共86页。五、汇编语言程序设计•当含有这个段的目标代码装入存储器后,SS就自动设置STACK1段的段基值,同时堆栈指针SP自动初始化为这个段最大地址+1单元的偏移量。•(2)执行程序的方法加载•3、

CS的加载•当源程序经过汇编,连接后,由DOS系统将其装入存储器中,同时将程序要执行的第一条指令地址装入CS,IP中,然后从这条指令开始执行。对CS和IP的设置、修改通常有两个途径:•(1)由结束伪指令END加载程序的起始地址。END伪指令的语句格式:END地址表达式地址表达式是一

个已定义的标号或一个标号加减一个常数。地址表达式是这个程序执行的第一条指令语句的地址。•例:┆CODESEGMENTASSUMECS:CODE,…STRATMOVAX,DATAMOVDS,AX┆第42页,共86页。五、汇编语言程序设计CODEE

NDSENDSTRAT•结束伪指令END有2个作用:(1)源程序到此结束,后面的任何语句均被略去。(2)将地址表达式所确认的存储单元的段基值和偏移量分别自动装入CS和IP中。•(2)在程序允许期间,如

执行程序转移类指令,实现从一个段转移到另一个段时,它的指令功能就是修改CS和IP。•5.4.2过程定义语句•使用格式:•过程名PROC[NEAR/FAR]………RET……..过程名ENDPRET:子程序返回指令第43页,共86页。五、汇编语言程序设计•5.4.3定位语句和位置计数器•符

号“$”代表位置计数器的现行值。定位伪指令ORG就是对位置计数器的现行值进行修改与设置。定位伪指令语句格式如下:ORG表达式•语句功能:把表达式的值赋给位置计数器。在这语句下面的目标代码(指令代码或数据)以表达式给定值

作为起始偏移量。•5.4.4偶地址控制语句•偶地址伪指令EVEN也是对位置计数器的一个控制指令,他把位置计数器调整为偶数。EVEN伪指令格式如下:EVEN•对存储器字单元(16位)进行存取时,如是偶地址,速度较快(例如8086CPU)。所以EVEN伪指令主要应用

于定义字数据前,用以调整位置计数器为偶数。•5.4.5程序标题语句•标题伪指令TITLE的格式是:TITLE文本•TITLE伪指令是指定一个标题,以便在列表文件中每一页的第一行都显示这个标题。可以是用户任选的名字或字符串,字符个数≤60个。第

44页,共86页。五、汇编语言程序设计•5.5宏指令语句•1.宏定义•2.宏调用•3.宏展开•程序设计方法•概述•4.2顺序程序设计•4.3分支程序设计•4.4循环程序设计•4.5子程序设计•4.6模块化程序设计•4.7高级汇编语言技术第45页,共86页。五、汇编语言程序设计-程序设

计方法概述•汇编语言程序设计的一般步骤•汇编语言程序设计一般有以下几个步骤:•1.分析问题,确定算法•2.绘制流程图•3.根据流程图编制程序•4.调试程序•流程图•1、流程图的概念•流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,

形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。第46页,共86页。五、汇编语言程序设计•2.流程图符号表示•(1)起止框:表示程序的开始和结束。起止框•(2)判断框➢(3)处理框➢(4)调用框•(5)指向线

/流向线➢(6)连接框返回第47页,共86页。五、汇编语言程序设计-顺序结构程序设计•5.6顺序结构程序设计•顺序结构程序从开始到结束,一直是按指令序列的在主存的存放顺序来执行指令的,且每条指令只执行一次。例子:课本P197例5-2•5.7分支程序设计•在实际应用中,常需要在程序运行过程中,依

据不同情况,在几个程序,需要根据情况在程序段中选择其一,这就是分支程序。为了实现分支程序,有很多程序流向控制和转移的指令。转移指令是实现分支的必要条件。•1、转移指令在程序中,指令的执行顺序由CS和IP的内容决定,转移指令通过

改变CS和IP的内容,使程序改变执行顺序。在同一个段内转移,只需修改IP,不同段之间转移,则CS和IP都需要修改。•按功能分为无条件转移指令和条件转移指令。都不影响任何标志位。•(一)无条件转移指令指令格式:JMP目

标地址•执行JMP指令后,就到“目标地址”指向的指令执行,而不执行下一条指令。无论是段内转移还是段间转移,目标地址都有两种表示方法:第48页,共86页。五、汇编语言程序设计-分支程序设计•(1)直接寻址方式:JMP指令直接给出目标地址,通常用目标处

的标号表示;•①段内直接寻址转移•执行的操作是:IP(IP)+RD,RD是相对位移量,不影响标志位。•②段间直接寻址转移:执行JMP指令时,将目标处指令地址的段基值和偏移量直接送入CS和IP中。•CODE1SEGMENT•┆•JMPFARPTRLABF•┆•CODE1E

NDSJMPL1MOVAX,0┆L1:ADDAX,0FFH┆RD1L2:INCCX┆JMPL2SUBAX,0┆RD2(a)正向移动(b)负向移动将LABF所在段段基值和LABF标号的偏移量送入CS和IP中。第49页,共86页。五、汇

编语言程序设计-分支程序设计CODE2SEGMENT┆LABF:MOVAX,0┆CODE2ENDS•(2)间接寻址方式•①段内间接寻址转移JMP指令的目标地址放在一个16位通用寄存器/字存储单元中。JMPBX;IP(BX)JMPWORDPTR[SI];IP(SI指

向字单元)用PTR表明[SI]所指向的单元按字访问•②段间间接寻址转移(需修改CS和IP内容):•这种寻址转移的目标地址是存放在一个作地址指针的双字单元中。JMPDWORDPTRADR1;IP(ADR1),

CS(ADR1+2)•存放在双字单元的前2个字单元的偏移量送入IP,后2个字单元的段基值送CS,实现段间的程序转移。第50页,共86页。五、汇编语言程序设计-分支程序设计•(二)条件转移指令•8086/8088

指令系统中条件共18条。条件转移指令基本格式为:JXX目标•其中,XX表示转移条件,目标地址通常使用标号。执行的操作是:条件满足时,则IP(IP)+RD;否则,顺序执行下一条指令。•受影响的状态标志位:无。┆JZOKMOVAX,1┆OK:MOVAX,0•条件转移的范围只能是

段内,且RD只能是一个用补码表示的8为二进制的带符号数,因此转移范围是-128~127个字节。条件转移指令的目标代码均是2字节长。•条件转移指令可分为三大类:•(1)简单条件转移指令将单个标志位的状态作为条件来判断,以决定是

否转移。这种指令共RD第51页,共86页。五、汇编语言程序设计-分支程序设计有5对,分别对5个标志位CF、ZF、SF、OF、PF的两种状态进行判断。•例:编写程序段判断字节变量DB1内容是正还是负,若为正,将AL置0,否则,将AL置1。•程序段1如下:第52

页,共86页。五、汇编语言程序设计-分支程序设计•TESTDB1,10000000BJZL1MOVAL,0FFHJMPL2L1:MOVAL,00HL2:……•程序段2如下:MOVBL,DB1SHLBL,1JNCL1MOVAL,0FFHJMP

L2L1:MOVAL,00HL2:…………•第53页,共86页。五、汇编语言程序设计-分支程序设计•(2)无符号数条件转移指令•这组常用于判断两个无符号数的大小,其判断条件是CF、ZF的状态组合。假设有两个无符号数A、B,在条件转

移指令前用CMP指令比较A、B,即按A-B设置各位标志。•例如:编写一程序,找出三个字变量DW1、DW2、DW3中的最大数,并送入AX中。程序段如下:MOVAX,DW1CMPAX,DW2JAEBIGERMOVAX,DW2第54页,共8

6页。五、汇编语言程序设计-分支程序设计BIGER:CMPAX,DW3JAENEXTMOVAX,DW3NEXT:...┆•(3)带符号数条件转移指令假设有两个带符号数A、B,在条件转移指令前用CMP指

令比较A、B,即按A-B设置各标志位。这组转移指令的判断条件是SF、OF、ZF状态的组合,其功能如下:第55页,共86页。五、汇编语言程序设计-分支程序设计•例如:对11111111B和00000000B两个8位二进制数进行比较,若将它们看作无符号数,则前者>后者(255>0);

若将它们看作带符号数,则前者<后者(-1<0)。•5.7.2分支程序设计一、用条件转移指令实现程序分支二、用跳转表实现多路分支•一、用条件转移指令实现程序分支•【例5-4】编写计算下面函数值的程序:•1X>0•Y=0X=0•-1X•设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如图5-7所

示。•程序如下:第56页,共86页。五、汇编语言程序设计-分支程序设计DATASEGMENTXDB-10YDB?DATAENDSSTACKSEGMENTSTACKDB20HDUP(0)STACKENDSCODESEGMEN

TASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXCMPX,0;与0进行比较JGEA1;X≥0转A1,JGE:A>=BMOVY,-1;X<0时,-1→YJMPEXIT第57页,共86页。五、汇编语言程序设计-分支程序设计A1

:JGA2;X>0转A2MOVY,0;X=0时,0→YJMPEXITA2:MOVY,1;X>0,1→YEXIT:MOVAH,4CHINT21HCODEENDSENDSTART•二、用跳转表实现多路分支•【例5-6】设某程序有

8路分支,试根据给定的N值(1~8),将程序的执行转移到其中的一路分支。程序流程如下图所示。第58页,共86页。五、汇编语言程序设计-分支程序设计第59页,共86页。五、汇编语言程序设计-分支程序设计•程序如下:DATASEGMENTTABD

WP1,P2,P3,P4,P5,P6,P7,P8NDB5DATAENDSSTACKSEGMENTDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART

:MOVAX,DATAMOVDS,AX┆MOVAL,NDELAL第60页,共86页。五、汇编语言程序设计-分支程序设计ADDAL,ALMOVBM,ALMOVBH,0JMPTAB[BX]P1:……┆JMPEXITP2:……

┆JMPEXITP3:……┆JMPEXIT┆P8:……┆第61页,共86页。五、汇编语言程序设计-分支程序设计EXIT:MOVAH,4CHINT21HCODEENDSENDSTART上述程序中的无条件转移指令的转移地址采用的是变址寻址。同理,转移地址也可以用寄存器间接寻址或基址加变址寻址,见课本2

10页例5-7。•5.8循环程序设计•5.8.1循环控制指令•5.8.2循环程序的结构及循环控制方法•5.8.3单重循环程序设计•5.8.4多重循环程序设计第62页,共86页。五、汇编语言程序设计-循环程序设计•5.8循环程序设计

•5.8.1循环控制指令•循环控制指令属于转移类指令,其功能类似于条件转移指令。这组指令有3条,均为两个字节指令,并使用CX作循环次数计数器。执行的操作是:•1)CX(CX)-1•2)循环控制条件满足时,则IP(IP)+RD;否则,顺序执行。•1、LOOP指令•指令格式:LOOP目标地址•执

行步骤是:•1)CX(CX)-1•2)若(CX)不等于0,则转移到标号代表的指令地址;否则,顺序执行。•受影响的标志位无。第63页,共86页。五、汇编语言程序设计-循环程序设计•例如:要求从ARRAY数组的10个无符号数中找出最大者送MAX单元。如用LOOP指令实现循环,则源程序如下:DATAS

EGMENTARYDB17,5,40,0,67,12,34,78,32,10MAXDB?DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCODESEGMENTASSUMEC

S:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXMOVSI,OFFSETARYMOVCX,9MOVAL,[SI]第64页,共86页。五、汇编语言程序设计-循环程序设计LOP:INCSICMPAL,[SI]JAEBIGERMOVAL,

[SI]BIGER:LOOPLOPMOVMAX,ALMOVAH,4CHINT21H•2、LOOPE/LOOPZ指令•指令格式:LOOPE目标地址LOOPZ目标地址•1)CX(CX)-1•2)若(CX)不等于0且ZF=1,则转移到

标号代表的指令地址;否则,顺序执行。•受影响的标志位:无。•例如:例5-9,见P214。第65页,共86页。五、汇编语言程序设计-循环程序设计•3、LOOPNE/LOOPNZ指令•指令格式:LOOPNE目标地址LOOPNZ目标地址•1)CX(CX)-1•2)若

(CX)不等于0且ZF=0,则转移到标号代表的指令地址;否则,顺序执行。•受影响的标志位:无。•例如:例5-10,见P215。•4、JCXZ指令•指令格式:JCXZ•指令首先测试CX的内容,如(CX)=0,则转移到目标处,否则顺序执行下一条指令。•这条指

令实际上是条件转移指令,但它转移有用在循环程序中,所以我们把他作为循环程序控制指令之一。•为什么会有这条指令呢?•当某一循环程序的循环次数初值(在CX中)是0时,那么不应该执行循环,否则将产生非常大的循环次数(因为第一

次逆向计数是:(CX)-1=0-1=0FFFFH)。为了避免这种情况,对循环次数进行测试。第66页,共86页。五、汇编语言程序设计-循环程序设计•5.8.2循环程序的结构及循环控制方法•一、循环程序的

结构(通常由5部分组成)•1、初始化部分设置循环的初始值,如地址指针和计数器的初值,其它循环参数起始值等。只执行一遍。•2、工作部分循环程序完成具体操作、运算的主体,也是设计循环程序的目的体现。•3、修改部分为执行下一次循环而修改的某些参数,如地址指针、计数器等。要修改的参数通

常是有一定的规律的,如+1,-1,+2,-2……•4、控制部分判断条件是否成立,控制循环是否结束。常用的是计数和条件控制循环。•5、结束处理部分处理循环结束后的结果。有的程序结束循环有几种可能情况,这时就要判断循环是在哪种情况下结束的,再分别给予处理,或存储结果。

•图5-12给出了典型的两种循环程序结构形式“先工作后判断”和“先判断后工作”。即“”第67页,共86页。五、汇编语言程序设计-循环程序设计初始化部分工作部分修改部分结束处理部分循环结束Y初始化部分工作部分修改部分结束处理部分循环结束NNY建立循环的初始状态循环体控制部分(

a)‘先工作后判断’循环结构(b)‘先判断后工作’循环结构DO[循环体]UNTIL[条件]WHILE[条件]DO[循环体]第68页,共86页。五、汇编语言程序设计-循环程序设计•二、循环控制方法单重循环程序设计•1、计数控制循环

要求:循环的次数已知。选用CX作计数器,且是递减,可选用LOOP/LOOPE/LOOPNE指令,否则应选用INC/DEC和条件转移指令进行计数。•例如:5-12,见课本P220。•2、条件控制循环•不知道循环次数时,可以用。知道也可以用条件简化程序。•例:试编写一程序,将字单元VAR

W中含1的个数放入CONT单元中。•循环的结束本可以用计数到16来控制,但由于VARW中的低位可能为0,为了减少循环次数,更好地方法是以判断移位之后的数是不是为0作为循环结束的条件。(甚至有可能VARW为0)•DATASEGMENTVARWDW1101010010001000BCONTDB?DAT

AENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDS第69页,共86页。五、汇编语言程序设计-循环程序设计CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS

,AXMOVDL,0MOVAX,VARWLOP:CMPAX,0JENEXTJNSSHIFXTINCDLSHIFXT:SHLAX,1JMPLOPNEXT:MOVCONT,DLMOVAH,4CHINT21HCOD

EENDSENDSTART第70页,共86页。五、汇编语言程序设计-循环程序设计开始初始化:DL0,AX(VARW)AX=0计1个数:DL(DL)+1AX左移一位存结果CONT(DL)结束(AX)

15=1NY•三、多重循环程序设计•见课本。第71页,共86页。五、汇编语言程序设计-子程序设计•5.9子程序设计•子程序的定义•子程序的调用与返回•子程序设计要求•子程序设计举例•一、子程序的定义•过程定义伪指令语句格式如下:•

过程名PROCNEAR/FAR┆RET过程名ENDP•过程必须设置在一个代码段内。•过程名必不可少,为标识符•过程名有3个属性:段基值、偏移量、类型属性(不指定,默认为NEAR)。•一个过程至少要有一个RET

指令句。第72页,共86页。五、汇编语言程序设计-子程序设计•二、子程序的调用与返回•例:图5-17•一、调用指令•指令格式:CALL过程名/子程序名•过程名/子程序名就是子程序的入口处的符号地址。执行CALL指令时,首先保留断点

地址于堆栈中,然后程序转移到指定的子程序入口地址。•调用指令在寻找目标地址(子程序入口地址)时有两种寻址方式:直接寻址方式(直接调用)和间接寻址(间接调用)。•执行调用指令CALL时,CS:IP总是指向CALL指令的下一条指令(即返回

地址),所以在堆栈中保留返回堆栈就是把IP的值(段内调用)或CS与IP的值(段间调用)压入堆栈。•1、段内直接调用•返回地址的偏移量压栈,即(IP)→栈顶字单元•形成子程序入口地址→IP•不影响标志位•2、段内间接

调用•子程序的入口地址放在16位通用寄存器或存储单元中。第73页,共86页。五、汇编语言程序设计-子程序设计•例如:CALLBX;(IP)→堆栈,(BX)→IP•CALLWORDPTR[SI];(IP)→堆栈,(SI指向

字单元)→IP指令指针的内容子程序入口•3、段间直接调用•例如:CALLFARPTRPROCB;返回堆栈压栈(CS)→堆栈CS(IP)→堆栈子程序入口地址→IP•4、段间间接调用子程序的入口地址存放在一个双字存储单元中,低字节偏移量,高字节存

段基值。•例:CALLDWORDPTRADDR;返回地址(CS):(IP)→堆栈子程序入口堆栈(ADDR)→IP(ADDR+2)→CS•二、返回指令•子程序的类型属性与返回指令属性要求一致。第74页,共86页。五、汇编语言程序设计-子程序设计•1、段内返回•指令格式:RET•机器

指令编码:C3H•功能:(栈顶字单元)→IP(SP)+2→IP不影响标志位•段内返回指令执行前后堆栈变化情况图:返回地址偏移量××××××××返回地址偏移量SPSPIP(a)执行RET指令前(b)执行RET指令后第75页,共86页。五、汇编语言程序设计-子程序设计•2

、段间返回•指令格式:RET•机器指令代码:CBH•功能:返回地址偏移量→IP返回地址段基值→CS不影响标志位段间返回指令执行前后堆栈变换情况图:返回地址段基值××××SP(a)执行RET指令前返回地址偏移量返回地址段基值××××SP(a

)执行RET指令后返回地址偏移量IPCS第76页,共86页。五、汇编语言程序设计-子程序设计•3、带参数的返回指令•例:段内带参数返回指令RETn;返回地址偏移量→IP,(SP)+2→SP(SP)+n→SP•5.9.2子程序的设计要求•编写子程序时

要满足以下要求:•1、具有一定的通用性•2、主、子程序之间的参数传递方式:•通用寄存器简单、直接,但是可传递参数的数量受限制。•存储单元传送可传递参数的数量不受限制,但是段之间传送麻烦•堆栈传送不会受上面两种方法的限制,

但是需特别注意在堆栈中参数存放的顺序。•3、注意保存信息第77页,共86页。五、汇编语言程序设计-子程序设计•保存信息的方法:•(1)在调用程序中保存信息例:主程序中用到BX、DI、SI,子程序用到SI、DI,则主程序调用子程序的形式为:

┆PUSHSIPUSHDICALLPROC_NAMEPOPDIPOPSI┆•(2)在子程序中保存信息•例如:子程序中使用BP、CX,子程序形式为:SUB1PROCPUSHBPPUSHCX┆POPCXPOPBPRETSUB1ENDP第78页,共86页。五、汇编

语言程序设计-子程序设计•4、正确使用堆栈执行调用指令中,返回地址压栈;如果子程序中,又使用堆栈的话,则堆栈内容多,则返回时,应将SP指向正确的返回地址。•5、编写清晰的子程序文本一个文本包括:•文本

说明1、子程序名2、子程序功能描述3、子程序的入口参数与出口参数4、使用哪些寄存器、存储单元5、本子程序是否又调用其它子程序6、子程序的调用形式举例•子程序本身•5.9.3子程序设计举例•例:将8/16位二进制按位转换成它的ASCII码串,并将转换结果存放到指定的存储单元中。采用主、

子程序结构。第79页,共86页。五、汇编语言程序设计-子程序设计•主程序:提供被转换的数,存放转换后的ASCII码串首址。•子程序:完成将二进制数转换成ASCII码串,从高位到低位以此转换。•入口参数:将转换数据、位数,存放ASCII码结果首址。•出口参数:无该程

序的数据段和堆栈段安排如下:DATASEGMENTBIN8DB53H;01010011BBIN16DW0A84BHASCBUFDB20HDUP(0)DATAENDSSTACK1SEGMENTPARASTACKDW

20HDUP(0)STACK1ENDS•流程图见P232,图5-18•1、用寄存器传递参数•入口参数:待转换数在DX中,待转换位数在AX中,存放结果ASCII码首址在DI中。第80页,共86页。五、汇编语言程序设计-子程序设计•信息保存由主程序定义。程序代码编制如下:见课本P231。•2、用堆栈传

递参数•在调用子程序前,将待转换数、位数,存放ASCII码首址先后压入堆栈中,保存信息的工作由子程序完成。程序代码段编制如下:•见P233页•3、用地址表传递参数•见P234•5.9.4系统功能子程序的调用•1、DOS功能子程序的

调用•DOS系统功能调用的方法一般可分为以下几步:•①设置所要调用功能的入口参数。•②在AH寄存器中存入所要调用功能的功能号。•③INT21H指令自动转入中断子程序入口。•④相应中断子程序运行完毕,可按规定取得出口参数。第81页,共86页。五、汇编语言程序设计-常用的DOS系统功能调用•主要功能:

实现实现键盘输入、屏幕显示、磁盘读写、文件读写等。•工作人员可以在不熟悉I/O设备功能情况下,DOS功能程序调用I/O设备实现I/O操作。•调用时需要使用软中断指令:INTn•n为中断类型类型码,值为00H~

0FFH•执行的操作:•将FR内容,返回地址(CS和IP)压入堆栈。•按类型码n,从中断向量表中取出功能子程序入口地址→CS:IP,执行子程序。•功能子程序结束时,用中断返回指令IRET返回调用程序。•DOS功能子程序调用

格式为:•送入口参数到指定寄存器•AH功能号•INT21H•DOS提供的系统功能子程序,是以中断类型码21H表示的。下面列举部分DOS功能子程序的功能和调用:第82页,共86页。五、汇编语言程序设计-常用的DOS系统

功能调用1.带显示的键盘输入(1号功能)•格式:MOVAH,01HINT21H•功能:从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。•等待从键盘输入下一个键,把字符的ASCII码送入AL,并在屏幕上显示该字符。•如果按Ctrl

+C组合键,则停止程序运行。•按下TAB制表键,使光标到相应位置上。2.不带显示的键盘输入(7号、8号功能)•调用格式:MOVAH,7H/AH,8HINT21H•功能与1号基本类同,差异在于键盘输入的字符在屏幕上不显示。7号功能对按Ctrl+C组合键和TAB制表键无反应

。3.字符串输入(0AH号功能)•建立一个缓冲区,将要输入的一串字符串的ASCII码存入。•要求使用DS和DX指向缓冲区首址。第83页,共86页。五、汇编语言程序设计-常用的DOS系统功能调用4、单字符显示(2号功能)•在屏幕上显示单个字符。要显示字符的ASC

II码(入口参数)存放在DL中。•注意:2号功能可以显示任一字符,例如可显示“$”符号,而9号功能不能。5、单字符打印(5号功能)•将DL中的字符(ASCII码)送打印机接口,打印输出。6、字符串显示(9号功能)•在屏幕上显示字符串。要显示

的字符串必须先放在一数据区,且字符串以“$”符号作为结束编址。非显示字符可以用它的ASCII码插入字符串中间。•进行9号功能调用,应先把待显示的字符串首地址的段基值和偏移量分别送入DS和DX中。第84页,共86页。五、汇编语言程序设计-程序示例•例如:要求从键盘输入一串小写字母,转换成大写

字母后在屏幕上显示。源程序如下:DATASEGMENTPMT1DB‘Inputsmallletter:$’STR1DB40H,0,40HDUP(0)PMT2DB0AH,0DH,’Displaycapitalletter:’STR2DB40HDUP(0),’$’DATAENDSSTACK1S

EGMENTPARASTACKDW20HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXMOVDX,OFFSETPMT1MOV

AH,9第85页,共86页。五、汇编语言程序设计-程序示例INT21HMOVDX,OFFSETSTR1MOVAH,10INT21HLEASI,STR1+2LEADI,STR2MOVCL,STR1+1MOVCH,0LOP1:MOVAL,[SI]SUBAL,20HM

OV[DI],ALINCSIINCDILOOPLOP1MOVDX,OFFSETPMT2MOVAH,9INT21HMOVAH,4CHINT21H第86页,共86页。

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?