微机接口 第五章汇编语言功能_第1页
微机接口 第五章汇编语言功能_第2页
微机接口 第五章汇编语言功能_第3页
微机接口 第五章汇编语言功能_第4页
微机接口 第五章汇编语言功能_第5页
已阅读5页,还剩141页未读 继续免费阅读

下载本文档

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

文档简介

微机接口第五章汇编语言功能第1页,共146页,2023年,2月20日,星期六汇编语言程序的格式汇编语言程序的上机过程伪指令语句汇编语言程序设计的基本方法本章内容第2页,共146页,2023年,2月20日,星期六了解汇编语言程序的基本格式,及其上机过程。熟练掌握数据定义伪指令、段定义伪指令、符号定义伪指令、过程定义伪指令。熟练掌握汇编语言程序设计的一般步骤以及顺序程序、分支程序、循环程序、子程序设计的方法。学习目的第3页,共146页,2023年,2月20日,星期六4.1汇编语言与汇编程序4.1.1汇编语言的基本概念1机器语言与汇编语言(MachineLanguageandAssemblyLanguage)

由二进制代码0,1表示的指令称为机器指令,相应的程序称为机器语言程序。用指令助记符表示的指令称为汇编语言指令,对应的程序称为汇编语言程序。第4页,共146页,2023年,2月20日,星期六

例4-1将4位二进制数转换为ASCII码字符。当数在0000B-1001B时,对应的ASCII码为‘0’~‘9’;当数在1010B~1111B时,对应的ASCII码为‘A’~‘F’。设待转换的数据已在累加器AL中(低4位)。编制的机器语言程序与汇编语言程序如下表所示。第5页,共146页,2023年,2月20日,星期六地址机器代码对应的汇编指令E380:0000240FANDAL,0FHE380:00023C0ACMPAL,0AHE380:00047202JBNUME380:00060407ADDAL,07HE380:00080430NUM:ADDAL,30HE380:000AC3RET第6页,共146页,2023年,2月20日,星期六2.汇编语言与高级语言(AssemblyLanguageandComputer-independentLanguage)

汇编语言是一种依赖于计算机微处理器的语言

汇编语言一般不具有通用性和可移植性

进行汇编语言程序设计必须熟悉机器的硬件资源和软件资源

高级语言是面向过程的语言

高级语言具有很好的通用性和可移植性

第7页,共146页,2023年,2月20日,星期六学习汇编语言的必要性

利用汇编语言可以设计出效率极高的核心底层程序。用汇编语言编写的程序一般比用高级语言编写的程序执行得快,且所占内存较少。汇编语言程序能够直接有效地利用机器硬件资源。学习汇编语言对于理解和掌握计算机硬件组成及工作原理是十分重要的。

第8页,共146页,2023年,2月20日,星期六4.1.2汇编语言源程序的组成1.汇编语言源程序的结构(ProgramStructure)例6-2完整的汇编语言源程序示例。NAMEHEXTOASC;*****************************************************DATASEGMENT;数据段定义开始HEXDB5AHASCDB2DUP(?)DATAENDS;数据段定义结束;*****************************************************第9页,共146页,2023年,2月20日,星期六;*************************************************STACKSEGMENT

;堆栈段定义开始

DB256DUP('S')TOPEQU$-STACKSTACKENDS;堆栈段定义结束;*************************************************;************************************************CODESEGMENT;代码段定义开始

ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATA;主程序开始第10页,共146页,2023年,2月20日,星期六

MOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,TOPMOVBX,OFFSETASCMOVAL,HEXMOVAH,ALMOVCL,4SHRAL,CLCALLNEAR

PTRCONVERT

…HLT;主程序结束第11页,共146页,2023年,2月20日,星期六CONVERTPROC;过程(子程序)定义开始

ANDAL,0FHCMPAL,10JBNUMADDAL,7NUM:ADDAL,'0'RETCONVERTENDP;过程(子程序)定义结束CODEENDS;代码段定义结束;*************************************************

ENDSTART;程序结束第12页,共146页,2023年,2月20日,星期六要点总结:汇编语言源程序由段结构组成。一个段由

“SEGMENT”(段定义开始)和“ENDS”(段定义结束)语句来定义。每个段都有唯一的段名,前后一致。不同段的段名不能相同。数据段、堆栈段和代码段的作用各不相同。各个段都由一系列语句组成。语句包括指令语句和伪指令语句。第13页,共146页,2023年,2月20日,星期六2.汇编语言的语句格式(StatementFormats)汇编语言程序的每行语句由1~4个部分组成。指令语句和伪指令语句在格式上稍有区别,指令语句的标号后有冒号“:”,而伪指令语句的标号后则没有冒号。指令语句的格式为[LABEL:]OPERATION[OPERAND][;COMMENT]标号域指令助记符域操作数域注释域第14页,共146页,2023年,2月20日,星期六伪指令语句的格式为[LABEL]OPERATION[OPERAND][;COMMENT]标号域伪指令助记符域操作数域注释域一行最多可有132个字符注:

指令助记符前面还可以有[前缀]。汇编语言程序语句中的四项,均可以用大写、小写或混合编写。语句的各部分之间至少用一个空格分开第15页,共146页,2023年,2月20日,星期六3.标号(Label)(含数据变量标号和程序位置标号)标号是一个自行设计的标识符或名称,最多可由31个字母、数字和特别字符(?、@、-、$)等组成。但 不能用数字开头。不能为汇编语言的保留字。注:保留字指有专门用途的字符或字符串,如CPU的寄存器名、指令助记符、伪指令助记符等。第16页,共146页,2023年,2月20日,星期六(1)数据变量标号的三种属性①段值:即所在段的段地址。②偏移量:即数据变量所在位置的地址与其段地址之差值。③类型:指该数据变量是字节、字还是双字。(2)程序位置标号的两种属性①

NEAR——段内调用或转移标号。②

FAR——段间调用或转移标号。第17页,共146页,2023年,2月20日,星期六4.操作数域(OperandFields)操作数可以是常数、变量、标号、寄存器名或表达式(1)常数:二进制、八进制、十进制、十六进制或ASCII码字符串。(2)寄存器名、标号、变量指令:MOVAL,HEX中,AL为寄存器名,HEX为变量名。第18页,共146页,2023年,2月20日,星期六(3)表达式:由运算符连接起来的式子叫表达式,按一定的规则对表达式进行运算后得到一个数值或一个地址。

表达式可分为算术表达式、逻辑表达式、关系运算表达式、分析运算表达式和合成运算表达式。第19页,共146页,2023年,2月20日,星期六用算术运算符+、-、*、/和MOD连接的表达式。①算术表达式用逻辑运算符AND、OR、XOR和NOT连接的表达式。②逻辑表达式例如:5*8+30,128/100,206MOD128等算术表达式。

第20页,共146页,2023年,2月20日,星期六逻辑表达式的结果可能为8位或16位二进制数,视参加运算的数的字长而定。

逻辑运算指令中可以包含有逻辑表达式,如指令ANDAL,10101010BAND0FH

左边第一个AND为逻辑运算指令,第二个AND为逻辑运算符,10101010BAND0FH为逻辑表达式,其结果在汇编时即已确定,为00001010B,故上述指令等价于ANDAL,00001010B第21页,共146页,2023年,2月20日,星期六用EQ、NE、LT、GT、GE和LE连接的表达式。若条件成立,其值为1,否则为0。③关系运算表达式分析运算表达式把存储器操作数分解为几个组成部分;而合成运算式是把这些组成部分综合为存储器操作数。④分析运算表达式和合成运算表达式例如:指令MOVBX,5GT3

等价于MOVBX,0FFFFH

第22页,共146页,2023年,2月20日,星期六

分析运算表达式和合成运算表达式的操作对象都为存储器操作数。

存储器操作数表示变量、符号地址、存储单元等与存储器地址有关的量。

分析运算表达式把存储器操作数分解为几个部分,如分解出段值、偏移量、类型等;合成运算表达式则把这些组成部分综合为存储器操作数。幻灯片77第23页,共146页,2023年,2月20日,星期六4.2伪指令指令语句:汇编程序把它们翻译成机器代码,命令8086执行对应操作。伪指令语句:汇编程序并不把它们翻译成机器代码,只是用来指示、引导汇编程序在汇编时做一些操作,它本身不占用存储单元。第24页,共146页,2023年,2月20日,星期六*变量定义及存储器申请幻灯片43*程序分段及存储器分配*过程定义*符号定义*程序模块定义与通信*宏定义及宏调用*条件汇编*格式控制,列表及其他功能伪指令主要分为下列几类:第25页,共146页,2023年,2月20日,星期六段定义伪指令SEGMENT/ENDS1.SEGMENT和ENDS定义方式:

[段名]SEGMENT[定位方式][组合方式][类别名]

语句1

语句2…[段名]ENDS第26页,共146页,2023年,2月20日,星期六

段名是赋予该段的一个名称,SEGMENT与ENDS成对出现,且前面的段名要相同,段名的取法与文件名、标号及变量名等相同。段名第27页,共146页,2023年,2月20日,星期六基本源程序结构段的定义

一般方法

使用特点

先定义数据段DS、附加段ES、堆栈段SS后编写代码段CS代码段CS——必要数据段DS——充分附加段ES——重叠(与数据段DS同段)堆栈段SS——省缺第28页,共146页,2023年,2月20日,星期六基本源程序结构数据段(DS)的定义DATASEGMENT

TABLEDB01H,0ABH,‘AB2’

CNTEQU$-TABLE X1DBDUP(?,1,2DUP(0FFH))

X2DW12ABHX3DDX1 X4DWSEGX1 X5DD12345678HDATAENDS段名段定义伪指令变量名常量名第29页,共146页,2023年,2月20日,星期六基本源程序结构过程定义法(CS段)

CODESEGMENT;CODE为代码段名

ASSUMECS:CODE,DS:DATA

STARTPROCFAR

;START为过程名

PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AX

;上述为固定写法第30页,共146页,2023年,2月20日,星期六基本源程序结构

程序正文(指令集合)

RET

;过程返回

STARTENDP

;结束过程定义

CODEENDS;结束代码段

ENDSTART;结束汇编

幻灯片41固定写法第31页,共146页,2023年,2月20日,星期六基本源程序结构主程序定义法(CS段)

CODESEGMENT;CODE为代码段名

ASSUMECS:CODE,DS:DATAMAIN:MOVAX,DATA;从MAIN开始汇编

MOVDS,AX

程序正文(指令集合)

MOVAH,4CHINT21H;21H号中断退出

CODEENDS;

结束代码段

ENDMAIN;结束汇编

第32页,共146页,2023年,2月20日,星期六基本源程序结构段说明与段赋值

仅说明了DS段(CS段必须说明)

ASSUMECS:CODE,DS:DATA幻灯片36

DS段赋值

MOVAX,DATAMOVDS,AX

说明了DS段、ES段

ASSUMECS:CODE,DS:DATA,ES:EATA

DS段、ES段赋值

MOVAX,DATAMOVDS,AXMOVAX,EATAMOVES,AX第33页,共146页,2023年,2月20日,星期六位置计数器$和定位伪指令ORG1.位置计数器$汇编程序专门设置了一个表示当前位置的计数器,称位置计数器$。正常情况下,汇编程序每扫描一个字节,位置计数器的值便加1。

语句:TOPEQU$-STACK含义:当前位置计数器的值$减去STACK代表的起始位置的值,然后把两者的差值赋予符号常量TOP。语句:JMP$

含义:程序跳转到本条指令执行。第34页,共146页,2023年,2月20日,星期六格式:ORG[数据表达式]功能:把位置计数器的值设置为表达式的值。ORG后面的一条指令性语句或数据区定义命令即从指定的位置处进行汇编。2.ORG伪指令第35页,共146页,2023年,2月20日,星期六格式:ASSUME[段寄存器]:[段名],

[段寄存器]:[段名],…功能:用于告知汇编程序,段寄存器CS、DS、ES和SS的内容将被设定为那些段或组的段址。段寻址伪指令ASSUME第36页,共146页,2023年,2月20日,星期六注:(1)段名可以是已定义过的任何段名或组名,也可以是表达式SEG[变量]或SEG[标号],还可以是NOTHING。

(2)除CS外,DS、ES、SS的设置必须通过指令性语句来完成。第37页,共146页,2023年,2月20日,星期六例CODE SEGMENTASSUMECS:CODE,DS:DATA,

SS:STACK,ES:NOTHINGMOV AX,DATA MOV DS,AX;设置DS MOV AX,STACK MOV SS,AX;设置SS

CODE ENDS幻灯片33第38页,共146页,2023年,2月20日,星期六过程定义伪指令PROC/ENDP

过程即是子程序。汇编语言规定必须对过程进行定义,以确定过程的三种属性。过程的属性确定之后,就可对调用指令CALL进行正确汇编,决定是产生近调用指令还是远调用指令。

1.过程的三种属性①段属性:过程所在段的段地址。

②偏移量属性:过程所处位置的段内偏移地址。③类型属性(NEAR或FAR)。过程为NEAR或FAR类型。第39页,共146页,2023年,2月20日,星期六使用格式:过程名PROCNEAR/FAR RET

过程名ENDP…NEAR---近过程。该过程与调用指令CALL处在同一个代码段中(段名相同)。FAR---远过程。该过程与调用指令CALL处在不同的代码段中(段名不同)。2.过程的定义第40页,共146页,2023年,2月20日,星期六功能:把具有一定功能的程序段设计成为一个过程(子程序),便于实现模块化的程序设计。注:(1)CALL指令中过程名起着标号的作用。有段属性、偏移量属性和类型属性(NEAR和FAR)。

(2)子程序中至少有一个RET。过程名是为该过程指定的一个名称,与变量、标号的定义法相同。第41页,共146页,2023年,2月20日,星期六任何变量均有下列三种属性。(1)段属性即变量所使用的段;(2)段内偏移属性;(3)变量的类型:字节、字、双字等。数据定义伪指令与存储器分配1.变量的三种属性DB—定义字节型变量,每个变量分配1个存储单元DW--定义字型变量,每个变量分配2个存储单元DD--定义双字型变量,每个变量分配4个存储单元第42页,共146页,2023年,2月20日,星期六2.变量定义及存储器申请伪指令DB/DW/DD

(1)格式1:[变量名]{DB/DW/DD}表达式功能:定义一变量,并为其分配一定数量的存储单元,变量的初值由表达式的值指定。若初值可任意,则用问号(?)表示。变量名可省。HEXDB

5AH;定义字节变量VWORDDW

1234H;定义字变量第43页,共146页,2023年,2月20日,星期六注:在存放字变量时,低字节在前,高字节在后。BUFFERDW1,0,-1

;定义了三个字单元

STRDB‘Program’;定义了一个字符串

注:在存放字符串时,存储的是字符的ASCII码。HEX_OFFDWHEX;定义了一个字单元,其初值为已定义变量HEX的偏移量。

DVARDD12345678H;定义了一个双字单元

第44页,共146页,2023年,2月20日,星期六ASCDB2DUP(?)功能:分配2个字节单元,初值任意BUFDW100DUP(0)功能:分配100个字单元,初值为0ZIPDB3DUP(0,2DUP(1))功能:存储单元依次初始化为:0,1,1,0,1,1,0,1,1。(2)格式2:[变量名]{DB/DW/DD}DUP

表达式第45页,共146页,2023年,2月20日,星期六变量经过定义及存储器申请之后,在程序中即可像高级语言一样使用。

MOVAL,HEX;取变量HEX的内容送 AL寄存器。MOVASC[BX],AL;取变量ASC的偏移 地址,再与BX寄存器的内容相加,得到 存储器操作数的有效地址EA,再将AL寄 存器的内容送入该单元。幻灯片253.变量的使用第46页,共146页,2023年,2月20日,星期六1.EQU伪指令格式:符号名EQU数值表达式功能:为常量、变量、表达式或其他符号定义一个名字,但不申请分配内存。如:THREEEQU3TOPEQU$-STACK符号定义伪指令(EQU、LABEL)第47页,共146页,2023年,2月20日,星期六“=”伪操作与EQU相似,其区别是前者可重复定义而后者不能。使用EQU可使程序简单明了和便于修改。注:EQU可用PURGE解除。第48页,共146页,2023年,2月20日,星期六2.LABEL伪指令格式:变量名/标号LABEL[类型]功能:为当前存储单元定义一个指定类型的变量名或标号,其类型为BYTE、WORD、DWORD、结构名、记录名、NEAR和FAR。第49页,共146页,2023年,2月20日,星期六BYTE_ARRAYLABELBYTE;定义字节型数组标号WORD_ARRAYDW50DUP(?);定义字型数组如定义不同类型的数组:程序中的用法:

MOVAL,BYTE_ARRAY[2];将2号字节单元内容送ALMOVAX,WORD_ARRAY[0];将0号字单元内容送AX第50页,共146页,2023年,2月20日,星期六又如:TRANS_NLABELNEARTRANSPROCFAR这样TRANS不仅适合远程调用和转移,也可用新名TRANS_N适合近程调用和转移。

幻灯片25

第51页,共146页,2023年,2月20日,星期六汇编语言程序可划分为许多模块,对每个模块独立地进行汇编及调试(见下图),一般从低层到高层逐步进行。程序模块定义伪指令(NAME/END、PUBLIC/EXTRN)第52页,共146页,2023年,2月20日,星期六PUBLIC二级子模块1PUBLIC二级子模块2PUBLICPUBLIC二级子模块n-1二级子模块n…PUBLICPUBLICPUBLIC一级子模块1EXTRN一级子模块2EXTRN一级子模块mEXTRN…主模块EXTRN主模块EXTRNPUBLIC二级子模块1PUBLIC二级子模块2PUBLICPUBLIC二级子模块n-1二级子模块n…PUBLICPUBLICPUBLIC一级子模块1EXTRN一级子模块2EXTRN一级子模块mEXTRN…汇编语言程序的模块结构第53页,共146页,2023年,2月20日,星期六1.NAME和END伪指令功能:定义一个模块,作为一个独立的汇编单位,NAME缺省时模块若使用了TITLE语句,则TITLE语句中前6个字符为模块名,否则源文件名将作为模块名。格式:NAME模块名

END标号…注:一个模块是一个独立的汇编单位,汇编处理只进行到模块结束语句END为止。第54页,共146页,2023年,2月20日,星期六注:符号必须用“,”分开,且均在本模块中定义过。注:2.PUBLIC伪指令格式:PUBLIC[符号表]功能:用来说明该模块中被定义的那些常量、变量和标号(含过程名)可以被其他模块所引用。如:PUBLICABC,BCD,CDE第55页,共146页,2023年,2月20日,星期六3.EXTRN伪指令格式:EXTRN[符号:类型,…]功能:指出本模块中需要引用但却在其他模块中定义并说明为PUBLIC属性的符号(含常量,变量,标号和过程)。被引用符号的类型说明:BYTE、WORD、DWORD、NEAR、FAR、ABS(符号常量)。如:EXTRNABC:WORD,BCD:ABS,CDE:NEAR

第56页,共146页,2023年,2月20日,星期六4.3汇编语言属性操作符1.分析操作符(数值返回操作符)4.3.1分析操作符(SEG、OFFSET、TYPE、LENGTH、SIZE)返回的是变量或标号的段地址,偏移地址及类型的属性值。格式:分析运算符变量或标号其运算的结果为一常数第57页,共146页,2023年,2月20日,星期六(1)SEG——取段址算符(2)OFFSET——取偏移地址算符功能:分离出该变量或标号的段址如:MOVAX,SEGBUF功能:分离出该变量或标号的偏移地址如:MOVSI,OFFSETBUF第58页,共146页,2023年,2月20日,星期六(3)TYPE——取类型算符(4)LENGTH——取变量所含存储单元的个数功能:分离出该变量所含存储单元的个数。功能:分离出该变量或标号的类型的字节数。变量类型为BYTE、WORD和DWORD时,返回的值分别为1、2和4;标号类型为NEAR或FAR时,则返回-1或-2。第59页,共146页,2023年,2月20日,星期六注意:在定义该变量时,数据定义伪指令后面的第一个表达式的形式为“nDUP(表达式)”时,取值为n,否则为1。如:BUF1DB100DUP(0)

BUF2DW10,5DUP(2)

BUF3DD5DUP(1,2DUP(0))则LENGTHBUF1=100,LENGTHBUF2=1LENGTHBUF3=5。第60页,共146页,2023年,2月20日,星期六(5)SIZE——取变量所含存储区的总字节数。功能:SIZE=LNGTH*TYPE SIZEBUF1=100(因为TYPEBUF1=1)

SIZEBUF2=2(因为TYPEBUF2=2)

SIZEBUF3=20(因为TYPEBUF3=4)第61页,共146页,2023年,2月20日,星期六格式:类型PTR表达式类型:表达式:是变量、标号或数值变量的类型有:BYTE、WORD和DWORD;标号的类型有:NEAR和FAR;结构名称4.3.2属性修改操作符(PTR、THIS、SHORT)1.PTR操作符PTR操作符用于暂时修改变量或标号的原有属性。

第62页,共146页,2023年,2月20日,星期六功能:PTR把它左边的属性指派给它右边的变量、标号或数值,使之产生一个新的存储器地址操作数。如:(1)INCBYTEPTR[BX](2)ADDDX,WORDPTRFOOB[20]

新存储器操作数的段地址和段内偏移量与PTR运算符右边的操作数的对应量相同。PTR给已分配的存储器一个另外的定义但并不重新分配存储器。第63页,共146页,2023年,2月20日,星期六2.SHORT操作符SHORT用于条件转移、转移和调用指令中,指出其转移的相对位移量不超过一个字节所能表达的范围。第64页,共146页,2023年,2月20日,星期六3.THIS操作符

THIS操作符与PTR操作符有类似的功能,但新的属性放在THIS的右边。格式:THIS类型/距离其中类型是BYTE、WORD和DWORD,距离是NEAR和FAR属性。功能:与PTR类似建立一个新的存储器地址操作数,但不分配存储器,其类型由THIS指定。(1)FOOBEQUTHISBYTE(2)FAR-OUTEQUTHIS幻灯片25FAR如:第65页,共146页,2023年,2月20日,星期六

4.4汇编语言程序的上机过程

4.4.1汇编语言程序上机运行的软件环境

DOS操作系统下,编辑、修改和运行汇编语言程序,需要用文本编辑软件、宏汇编程序、连接程序和调试程序。

①文本编辑软件:EDIT.EXE等②宏汇编程序:MASM.EXE,TASM.EXE等③连接程序:LINK.EXE,TLINK.EXE等④调试程序:CV.EXE,TD.EXE等第66页,共146页,2023年,2月20日,星期六编程者编辑源程序XXX.ASM

指令伪指令写字板,记事簿等软件汇编连接MASM.EXELINK.EXEXXX.EXE可执行文件加载程序运行DOS磁盘文件DOS将磁盘文件读入内存从指定起始指令开始执行程序任务XXX.OBJ动态调试程序DEBUG.COMPC上汇编语言程序生成过程机器语言(模块代码)第67页,共146页,2023年,2月20日,星期六4.4.2源程序的编辑与汇编1.编辑源程序C:\ASM>EDITHEXTOASC.ASM(回车)2.汇编源程序C:\ASM>TASMHEXTOASC(回车)在汇编中,如果有语法错误,会给出提示信息,指出错误的类型、行号。当汇编无错之后,会自动生成目标文件(文件扩展名为OBJ)。注:待编辑的文件扩展名必须为ASM。第68页,共146页,2023年,2月20日,星期六汇编程序通过ASSUME语句了解到运行时各段寄存器的设定值后,就可以对被汇编的指令语句中的变量和标号作如下处理。3.汇编程序对变量和标号的处理第69页,共146页,2023年,2月20日,星期六

1.检查指令中所引用的变量和标号是否合理,即它们的段属性是否和某个段寄存器的段假设值相符。

2.检查是否需要为所引用的变量和标号产生跨段前缀字节,即检查变量和标号的段属性是否与硬件为该指令所规定的段寄存器的假设值相符。第70页,共146页,2023年,2月20日,星期六4.4.3目标程序的连接C:\ASM>TLINKHEXTOASC(回车)连接成功后,将生成可执行程序HEXTOASC.EXE。6.4.4程序的调试与运行1.调试可执行程序利用TurboDebuger(TD)对可执行程序进行调试,以检查程序可能存在的各种错误:C:\ASM>TDHEXTOASC.EXE(回车)第71页,共146页,2023年,2月20日,星期六程序在存储区中存放的逻辑地址源程序部分程序执行后各寄存器、标志位的结果数据段中存放的40个“A”及对应的ASCII码DEBUG调试环境如下:第72页,共146页,2023年,2月20日,星期六2.运行可执行程序C:\ASM>HEXTOASC(回车)第73页,共146页,2023年,2月20日,星期六

4.5汇编语言程序与DOS的接口4.5.1DOS和BIOS的功能调用1.DOS系统功能调用的一般步骤

DOS为磁盘操作系统(DiskOperatingSystem)的简称。DOS提供了极为丰富的子程序,能够实现控制键盘、显示器、读写文件、串行通信等一系列功能。(课程设计中的数据显示,输入,响铃设计等)

第74页,共146页,2023年,2月20日,星期六使用DOS系统功能调用的一般过程:见下图所示。功能调用号AH置入口参数执行“INT21H”分析出口参数……系统功能调用的方法第75页,共146页,2023年,2月20日,星期六键盘功能调用

AH功能入口参数出口参数1从键盘输入一个字符,并在屏幕上回显,检查Ctrl+Bteak键

AL=字符6直接控制台输入/输出字符,回显,不检查Ctrl+Break键DL=0FFHAL=字符7直接键盘输入字符,无回显,不检查Ctrl+Break键

AL=字符8键盘输入一个字符,无回显,检查Ctrl+Break键

AL=字符0AH输入字符串到内存缓冲区DS:DX=缓冲区首址

0BH检查键盘输入状态

AL=FFH有键入AL=0无键入0CH清键盘缓冲区,调用键盘输入功能AL=键盘功能号(1,6,7,8,A)

第76页,共146页,2023年,2月20日,星期六(1)键盘输入(1号调用)格式:MOVAH,1 INT 21H功能:等待从键盘输入一个字符并将输入字符的ASCII码送入寄存器AL中,同时在显示器上显示该字符,碰到CTRL+Break则退出。2.DOS系统功能调用的一般步骤第77页,共146页,2023年,2月20日,星期六(2)显示单个字符(2号调用)格式:MOVAH,2 MOVDL,待显字符的ASCII码

INT21H功能:将DL中的字符送显示器显示,若为CTRL+Break的ASCII码则退出。(单个字符)第78页,共146页,2023年,2月20日,星期六(3)控制台输入(8号调用)格式:MOVAH,8INT21H功能:与1号调用相似,但只从键盘上输入而不显示。第79页,共146页,2023年,2月20日,星期六(4)显示字符串(9号调用)格式:LEADX,字符串首偏移地址

MOVAH,9INT21H功能:将当前数据区中以‘$’结尾的字符串送显示器显示。(字符串显示)第80页,共146页,2023年,2月20日,星期六例如,要显示下列DIS0数组变量中定义的字符串DIS0DB‘PRESSANYKEYTOQUIT’,0DH,0AH,‘$’程序如下:LEADX,DIS0MOVAH,09HINT21H0DH,0AH-换行回车,书上介绍第81页,共146页,2023年,2月20日,星期六(5)键盘输入字符串(10号调用)格式:LEADX,缓冲区首偏移地址

MOVAH,10INT21H功能:从键盘上往指定缓冲区中输入字符串并送显示器显示。第82页,共146页,2023年,2月20日,星期六如:BUFDB81DB?

DB80DUP(0)注:缓冲区应按规定的格式定。BUF第一字节规定了缓冲区的大小,从键盘输入的字符串从第三个字节存放,第二个字节存放实际输入的字符个数。第83页,共146页,2023年,2月20日,星期六3.常用BIOS调用

BIOS为基本输入输出系统(BasicInputandOutputSystem),它提供了最底层的控制程序。(1)设置显示器显示模式

功能:设置显示器显示模式。显示模式代码见附录E。格式:MOVAH,00HMOVAL,显示模式代码

INT10H第84页,共146页,2023年,2月20日,星期六(2)设置光标位置

功能:设置光标位置,使字符从该位置处开始显示。MOVAH,02HMOVBH,页号MOVDH,行号MOVDL,列号INT10H第85页,共146页,2023年,2月20日,星期六4.5.2用户程序与DOS的接口1.程序段前缀PSP程序段前缀PSP是一个256字节的区域,从页的边界开始存放有关信息。用户程序可从PSP中获得有关键盘输入参数等信息。

当DOS加载一个可执行文件的程序代码到内存中去时,它首先为该程序建立一个程序段前缀PSP,然后把可执行的程序代码加载到PSP后续的地址上。2.用户程序与DOS的接口在DOS操作系统下,用户程序的主程序,对于操作系统而言,也是一个过程,且必须说明为FAR属性。第86页,共146页,2023年,2月20日,星期六3.结束用户程序返回DOS的方法

(1)INT20H

说明:INT20H为系统“结束任务返回DOS”的子程序。(2)用户程序用RET指令返回说明:用户程序必须定义为一个FAR过程。(3)用DOS系统功能调用4CH返回格式:MOVAH,4CHINT21H第87页,共146页,2023年,2月20日,星期六明确任务,确定算法绘制流程图根据流程图编写汇编语言程序上机调试程序程序设计步骤:汇编语言程序设计程序基本结构:顺序结构、分支结构、循环结构及子程序结构第88页,共146页,2023年,2月20日,星期六模块化程序设计任务模块图小应用系统用简单程序编程完成大应用系统用多模块程序编程完成主模块MAIN.ASMAN1.ASMAN2.ASMAN3.ASMBN1.ASMBN1.ASMCN1.ASM第89页,共146页,2023年,2月20日,星期六程序的基本结构

顺序程序结构条件程序结构分支程序结构...YN一般语句If–else语句Switch语句第90页,共146页,2023年,2月20日,星期六程序的基本结构

循环控制结构1循环控制结构2YYNNwhile语句do--while语句第91页,共146页,2023年,2月20日,星期六基本程序设计顺序程序设计条件程序设计

循环程序设计

指令指针IP值线性增加,IP=IP+1IP值受标志位的影响而跳变影响标志的指令CMP、TEST、JXXIP值受计数器CX中的值不为零而循环影响标志的指令DEC第92页,共146页,2023年,2月20日,星期六标准流程图符号起始和终止框执行框判断框连接框第93页,共146页,2023年,2月20日,星期六6.6汇编语言程序设计的基本技术

6.6.1简单程序设计例6-3编写程序段,完成下面公式的计算(其中:变量X和Y是32位无符号数,变量A,B和Z是16位无符号数):(X-Y-29)/Z的商→A,(X-Y-29)/Z的余数→BDATASEGMENTXDD453921F0HYDD123A6825HZDW0A86CHADW?BDW?DATAENDS定义数据段:第94页,共146页,2023年,2月20日,星期六CODESEGMENT…MOVAX,WORDPTRX;取X的低位字

MOVDX,WORDPTRX+2;取X的高位字

SUBAX,WORDPTRY;与Y的低位字相减

SBBDX,WORDPTRY+2;与Y的高位字相减,并考虑低位的借位

SBBAX,29D;结果的低位与29D相减

SBBDX,0;可能产生借位,再减去借位

DIVZ;32位无符号数(DX:AX)除以16位无符号数Z

MOVA,AX;商在AX中,保存商

MOVB,DX;余数在DX中,保存余数

…CODEENDS定义代码段:第95页,共146页,2023年,2月20日,星期六例6-4编写程序段,完成下面公式的计算:A=(X+Y)-(W+Z),其中X,Y,Z,W均为用压缩BCD码表示的数。DATASEGMENTXDB39HYDB25HWDB86HZDB46HADB?

DATAENDS定义数据段:第96页,共146页,2023年,2月20日,星期六

MOVAL,WADDAL,Z;AL=(W+Z)DAA;加法的十进制调整

MOVA,AL;调整后的结果存到单元AMOVAL,XADDAL,Y;AL=(X+Y)DAA;加法的十进制调整

SUBAL,A;AL=(X+Y)-(Z+W)

DAS;减法的十进制调整

MOVA,AL

;结果送A程序如下:第97页,共146页,2023年,2月20日,星期六例6-5编写完整的汇编语言程序,用8086的16位无符号数乘法指令实现两个32位无符号数的乘法运算。算法分析:8086没有32位无符号数乘法指令,需借助于16位无符号数乘法指令做4次乘法,然后把部分积相加,如下图所示。ABB×DCDA×DB×CA×C+×部分积1部分积2部分积3部分积4最后乘积AB×CD第98页,共146页,2023年,2月20日,星期六完整的汇编语言程序如下:NAMEMULTIPLY_32BITDATASEGMENTMULNUMDW8000H,0001H,0FFFH,0001H;定义被乘数B、A与乘数D、CPRODUCTDW4DUP(?);定义乘积,低字在前DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDS例如,求:00018000H*00010FFFH=0000000197FE8000H

ABCD第99页,共146页,2023年,2月20日,星期六

CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARBEGIN:PUSHDS;DS中包含的是程序段前缀的段地址

MOVAX,0PUSHAX;设置返回至DOS的段值和偏移量

MOVAX,DATAMOVDS,AX;置段寄存器初值

MOVBX,0MULU32:MOVAX,MULNUM[BX];B→AXMOVSI,MULNUM[BX+4];D→SIMOVDI,MULNUM[BX+6];C→DI第100页,共146页,2023年,2月20日,星期六

MULSI ;B×DMOVPRODUCT[BX],AX ;保存部分积1MOVPRODUCT[BX+2],DXMOVAX,MULNUM[BX+2] ;A→AXMULSI ;A×DADDAX,PRODUCT[BX+2]ADCDX,0;部分积2的一部分与部分

;积1的相应部分相加

MOVPRODUCT[BX+2],AXMOVPRODUCT[BX+4],DX;保存

MOVAX,MULNUM[BX];B→AXMULDI;B×CADDAX,PRODUCT[BX+2];与部分积3的相应部分相加

ADCDX,PRODUCT[BX+4]第101页,共146页,2023年,2月20日,星期六

MOVPRODUCT[BX+2],AXMOVPRODUCT[BX+4],DXPUSHF;保存后一次相加的进位标志

MOVAX,MULNUM[BX+2];A→AXMULDI;A×CPOPFADCAX,PRODUCT[BX+4];与部分积4的相应部分相加

ADCDX,0MOVPRODUCT[BX+4],AXMOVPRODUCT[BX+6],DXRETSTARTENDPCODEENDSENDBEGIN第102页,共146页,2023年,2月20日,星期六程序中根据各种可能出现的情况及相应的处理方法分成若干支路,运行时,根据不同情况有选择地执行相应处理程序。例6-6

试编写程序段,实现符号函数。

当x>0时当x=0时当x<0时6.6.2分支程序设计第103页,共146页,2023年,2月20日,星期六相应的程序段为;SIGN:MOVAX,BUFFER;(BUFFER)=XANDAX,A;做一次“与”运算,以把X

;的特征反映到标志位

MOVBX,0;预置X=0的标志0到BX JENEXT;若X确实为0,则转NEXT JNSPLUS;X为正数,则转PLUSMOVBX,-1;X为负数,则-1送BXJMPNEXTPLUS: MOVBX,1NEXT:…

…第104页,共146页,2023年,2月20日,星期六例6-7在数据段中定义了256个子程序的入口地址(段地址:偏移地址),试根据AL中的值,决定调用256个子程序中的哪一个。

分析:每个子程序的入口地址占用4个字节,需将AL的值乘以4,再加上入口地址表首的偏移地址,即可得到某子程序入口地址在表中的偏移地址,将该地址送入BX,利用段间间接调用指令实现子程序调用。这种处理方法,类似于第9章中将要介绍的中断向量表的处理。

BX=入口地址表首偏移地址+AL*4第105页,共146页,2023年,2月20日,星期六DATASEGMENTTABADDDDSUB0;0#子程序入口地址

DDSUB1;1#子程序入口地址

……DDSUB255;255#子程序入口地址DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDS第106页,共146页,2023年,2月20日,星期六CODE1SEGMENT;代码段CODE1实现查表转移的程序段

ASSUMECS:CODE1,DS:DATA,SS:STACK……XORAH,AH;AH清0MOVCL,2SHLAX,CL;AX左移2次相当于乘以4MOVBX,OFFSETTABADD;取表首的偏移地址

ADDBX,AX;加上AL*4CALLDWORDPTR[BX];段间间接调用子程序

……CODE1ENDS第107页,共146页,2023年,2月20日,星期六

;代码段CODE2定义256个子程序(过程):CODE2SEGMENTASSUMECS:CODE2SUB0PROCFAR……RETSUB0ENDPSUB1PROCFAR……RETSUB1ENDP……SUB255PROCFAR……RETSUB255ENDPCODE2ENDS第108页,共146页,2023年,2月20日,星期六一段程序有时重复执行多次,就牵涉到循环程序结构,其组成部分为:1.循环体即要求重复执行的程序段部分,包括循环工作部分和循环控制部分。2.循环初态循环开始时往往要置初态,赋初值,包括循环工作部分初态和结束条件初态。6.6.3循环程序设计第109页,共146页,2023年,2月20日,星期六3.循环结束条件在循环程序中必须给出循环结束条件,否则就会进入死循环,结束条件有好多种,最常见的有:(1)用计数器控制循环(2)按问题的条件控制循环(3)用开关量控制循环(4)多重循环第110页,共146页,2023年,2月20日,星期六例6-8

分类统计字数组ARRAY中正数、负数和零的个数,并分别存入内存字变量POST、NEGA和ZERO中,数组元素个数保存在数组的第一个字中。

分析:将字变量与0比较,然后判断是大于0(JG)、等于0(JE)还是小于0(JL),以分别对相应的计数器加1。第111页,共146页,2023年,2月20日,星期六

DATASEGMENTARRAYDW8;元素个数

DW230,-1437,26,-31,0,3458,0,10POSTDW0NEGADW0ZERODW0DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXXORAX,AX;用AX作为正数的计数器

XORBX,BX;用BX作为负数的计数器

XORDX,DX;用DX作为零的计数器第112页,共146页,2023年,2月20日,星期六

MOVCX,ARRAY;用CX来进行循环计数

JCXZDONE;考虑数组的元素个数为0的情况

LEADI,ARRAY+2;;用指针DI来访问整个数组AGAIN:CMPWORDPTR[DI],0;与0做比较

JGHIGH;大于0,为正数

J

温馨提示

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

评论

0/150

提交评论