df汇编语言程序设计_第1页
df汇编语言程序设计_第2页
df汇编语言程序设计_第3页
df汇编语言程序设计_第4页
df汇编语言程序设计_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

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

文档简介

会计学1df汇编语言程序设计2上机环境硬件系统软件

应用软件

操作系统:DOS系统编辑器:

EDIT.exe编程序:MASM.exe连接程序:LINK.exe调试程序:DEBUG.exe用户开发的程序:ABC.exe等CPU、存储器(ROM、RAM)、I/O接口、输入、输出设备第1页/共77页3第一节汇编语言上机过程D:>EDITABC.asmD:>MASMABC;

有语法错,回EDIT下改该程序D:>LINKABC;

有错,回在EDIT下改程序D:>ABC

运行结果错,回EDIT下改程序或在DEBUG下调试,找原因。D:>DEBUGABC.exe编辑源程序

EDITABC.ASM汇编源程序

MASM

ABC.ASM形成目标程序ABC.OBJ连接目标程序

LINKABC.OBJ有连接错误信息?形成可执行程序

ABC.EXE装入可执行程序到内存,并执行D:\>sub>ABC下一程序用DEBUG调试可执行程序D:\>sub>DEBUG

ABC.EXE找到原因YNYNNYN有汇编错误信息?Y运行结果正确?用DEBUG调试程序查错?第2页/共77页4第二节汇编语言程序结构一、程序结构二、语句结构第3页/共77页5一、程序结构程序由数条语句构成,每条语句占一行。指令性语句(指令语句)

指示性语句(伪指令语句)

分段结构程序按段编写,与8088内存分段编址相对应。每段由伪操作SEGMENT开始、由ENDS结束。程序最后为END结束语句,后跟一启动地址。启动地址指示程序开始执行的第一条语句。程序中设有返回DOS的功能。使程序执行完后返回DOS系统的命令接受状态。

程序中用到内存操作数时,

应按操作数的寻址方式,给相应的段寄存器赋值;汇编语言程序结构例一movs.asm;实现数据传送功能aaSEGMENT

;数据段1str1DB'Hello!’aaENDSbbSEGMENT

;数据段2str2DB6dup(?)bbENDSccSEGMENT

;代码段

ASSUMECS:cc,DS:aa,ES:bbstart:CLDMOVAX,aaMOVDS,AXLEASI,str1MOVAX,SEGstr2MOVES,AXMOVDI,OFFSETstr2MOVCX,6REPMOVSB

MOVAH,4CHINT21H

;返回DOSccENDS

ENDstart;指示程序结束第4页/共77页6程序可由多个段构成,至少有一个代码段;汇编语言程序结构例二(子程结构)scans.asm;用二进制显示中断向量表中(0:0~0:3FFH)数据D0H的个数keyEQU0D0H;用符号表示常量(关键字)codeSEGMENT;代码段开始

ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0MOVAL,keynext:CMP[SI],ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;调用显示子程

MOVAH,4CH;返回DOS

INT21H;用二进制显示BX内容子程displayPROC

MOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDP

codeENDS;代码段结束

ENDbegin;指示程序结束和

;程序入口第5页/共77页7二、语句结构

dataSEGMENT;数据段varDB?dataENDScodeSEGMENT;代码段

ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回DOScodeENDS

ENDstart例:第6页/共77页81.名字项

据语句功能的不同,

名字项可用来表示段名、变量名、标号、过程名以及常量名等。dataSEGMENT;数据段varDB?dataENDScodeSEGMENT;代码段

ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回DOScodeENDS

ENDstart第7页/共77页9

名字项用一个符号表示。

对符号的规定:①

由字符A~Z,a~z,0~9及符号@、$、下划线_等组成,最长31个字符,超出部分忽略。②不能用数字打头,以免与十六进制数相混。③不使用汇编程序中的保留字。(如指令的助记符等)④

对定义的符号不区分大小写。第8页/共77页102.助记符项助记符可以是指令、伪操作中的助记符。对于指令,汇编程序将其翻译成机器语言指令。

MOVAX,100→B80001对于伪操作,汇编程序据其要求的功能进行处理。

dataSEGMENT

→data与一段值对应

stringDB‘Tsinghua’→string与一内存地址对应第9页/共77页113.操作数项操作数给出参与操作的数或数所在的地方。操作数多于一个时,用逗号分开。操作数可以是常数、寄存器、存储器操作数、标号名、过程名或表达式等。第10页/共77页12常数给出具体的数据。可以是数字常量或字符常量。◢◢

数字默认十进制,也可加D表示十进制数。如

1234D,1234◢

数字后加B表示二进制数。如

1010B◢

数字后加H表示十六进制数。如1234H◢

字符常量,用单引号表示。如‘1234’

汇编时,用字符对应的ASCII表示。如

31H,32H,33H,34H例

data1DB12,34,56;十进制

data2DB12H,34H,56H;十六进制

MOVAL,‘G’;字符

stringDB‘1234’;字符串第11页/共77页13A、B、C、D、E、F开头的十六进制数前面加0,与H结尾的标识符区别。如寄存器名AH、BH、CH、

DH

变量名abcdH等例

movAL,0AHmovAL,AHmovBX,0abcdH第12页/共77页144.注释项由分号引出,用来说明语句或程序的功能。汇编程序对分号后的内容不做处理。作用:①注释程序,增强程序可读性。

②可放在语句最前,暂时注释某语句,调试程序用。例

、、、

;MOVAH,2;显示提示信息

;MOVDL,’A’

;INT21H

、、、第13页/共77页15第三节指示性语句/第四节汇编语言程序举例一、程序开始和结束二、段定义三、变量定义四、ASSUME语句汇编语言程序举例一

了解DOS的返回,装入功能

五、表达式及表达式中的操作符汇编语言程序例二六、过程定义(第五节程序设计介绍)七、等值定义(第五节程序设计介绍)

汇编语言程序例三(第五节程序设计介绍)第14页/共77页16指示性语句与指令性语句:指令性语句是用指令系统中的指令构成的语句。

MOVAX,BX指示性语句是指示汇编程序进行汇编的操作。

MOVAX,4+8中的+codeSEGMENT中的SEGMENTMOVBX,OFFSETstring中的OFFSET第15页/共77页17指示性语句与指令性语句区别一个程序经汇编,连接和装入内存后,在执行程序之前:

◢指示性语句的功能已经完成,故又称伪操作。

◢而指令性语句的功能尚未完成,需控制CPU去执行,才能完成。第16页/共77页18aaSEGMENT;数据段1

str1DB'Hello!’aaENDSbbSEGMENT;数据段2

str2DB6dup(?)bbENDSccSEGMENT;代码段

ASSUMECS:ccASSUMEDS:aa,ES:bbstart:CLDMOVAX,aa

MOVDS,AXLEASI,str1MOVAX,bb

MOVES,AXLEADI,str2MOVCX,6REPMOVSBMOVAH,4CHINT21HccENDSENDstart

D:\masm>DEBUGhello2.exe-U:查看代码段12A0:0000FCCLD12A0:0001B89E12MOVAX,129E12A0:00048ED8MOVDS,AX12A0:00068D360000LEASI,[0000]12A0:000AB89F12MOVAX,129F12A0:000D8EC0MOVES,AX12A0:000F8D3E0000LEADI,[0000]12A0:0013B90600MOVCX,000612A0:0016F3REPZ12A0:0017A4MOVSB12A0:0018B44CMOVAH,4C12A0:001ACD21INT21、、、-D129E:0L10;查看数据段1的内容129E:000048656C6C6F210000-0000000000000000Hello!..........-D129F:0L10;查看数据段2的内容129F:00000000000000000000-0000000000000000................-数据传送源程序hello2.asm程序经汇编、连接后,装入内存的情况如下:第17页/共77页19常用伪操作介绍一、程序开始和结束二、段定义三、变量定义四、ASSUME语句五、表达式中的操作符六、过程定义七、等值定义第18页/共77页20一、模块定义和程序结束伪操作1.NAME和TITLE伪操作

格式

NAME

模块名

格式

TITLE

模块名在源程序开始可用NAME或TITLE为模块命名,

模块名的作用是指示给连接程序进行连接用。源程序中可无模块定义,此时源文件名作为模块名。

第19页/共77页212.END伪操作

格式

END启动地址作用是指示源程序到此结束。汇编程序对END之后的语句不进行处理。程序中所有有效语句应放在END语句之前。源程序中必须有END结束语句。汇编程序对无END语句的源程序不进行处理,

只给出无END语句错误信息。第20页/共77页22假设TEST.asm是一个无END语句的汇编语言源程序。其汇编结果如下:D:\MASMTEST;↙Microsoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.EndoffileencounteredoninputfileEndoffileencounteredoninputfile49968+421181Bytessymbolspacefree

0WarningErrors

0SevereErrorsD:\由于没有END语句,汇编程序根本没对源程序进行汇编,此时显示警告性错误总数为0,严重性错误总数为0,用户不要被此值的误导。第21页/共77页23启动地址可是一个标号或过程名,指示程序的入口。程序装入内存后,系统跳转到入口处,开始执行程序。aaSEGMENT;数据段1

str1DB'Hello!’aaENDSbbSEGMENT;数据段2

str2DB6dup(?)bbENDSccSEGMENT;代码段

ASSUMECS:ccASSUMEDS:aa,ES:bbstart:CLDMOVAX,aa

MOVDS,AXLEASI,str1

MOVAX,SEGstr2

MOVES,AXMOVDI,OFFSETstr2

MOVCX,6REPMOVSBMOVAH,4CHINT21HccENDSENDstartD:\masm>DEBUGhello.exe-U:查看代码段129F:0000FCCLD129F:0001B89D12MOVAX,129D129F:00048ED8MOVDS,AX129F:00068D360000LEASI,[0000]129F:000AB89E12MOVAX,129E129F:000D8EC0MOVES,AX129F:000FBF0000MOVDI,0000129F:0012B90600MOVCX,0006129F:0015F3REPZ129F:0016A4MOVSB129F:0017B44CMOVAH,4C129F:0019CD21INT21、、、-D129d:0l10;查看数据段1的内容129D:000048656C6C6F210000-0000000000000000Hello!..........-D129e:0l10;查看数据段2的内容129E:00000000000000000000-0000000000000000................-第22页/共77页24二、段定义伪操作

格式

段名SEGMENT

、、、、、、段名ENDS

段定义由伪操作SEGMENT开始、ENDS结束。其中:SEGMENT和ENDS必须成对出现,且语句前必须有段名,段名必须相同。

SEGMENT和ENDS语句之间可以有指令和其他伪操作,

表示存放在该段内存的变量、指令或其他伪操作对该段内存的处理程序中可以定义多个段。程序经汇编、连接及装入内存后,段名为一具体的段值。第23页/共77页25aaSEGMENT;数据段1

str1DB'Hello!’aaENDSbbSEGMENT;数据段2

str2DB6dup(?)bbENDSccSEGMENT;代码段

ASSUMECS:ccASSUMEDS:aa,ES:bbstart:CLDMOVAX,aa

MOVDS,AXLEASI,str1MOVAX,bb

MOVES,AXLEADI,str2MOVCX,6REPMOVSBMOVAH,4CHINT21HccENDSENDstart

D:\masm>DEBUGhello2.exe-U:查看代码段12A0:0000FCCLD12A0:0001B89E12MOVAX,129E12A0:00048ED8MOVDS,AX12A0:00068D360000LEASI,[0000]12A0:000AB89F12MOVAX,129F12A0:000D8EC0MOVES,AX12A0:000F8D3E0000LEADI,[0000]12A0:0013B90600MOVCX,000612A0:0016F3REPZ12A0:0017A4MOVSB12A0:0018B44CMOVAH,4C12A0:001ACD21INT21、、、-D129E:0L10;查看数据段1的内容129E:000048656C6C6F210000-0000000000000000Hello!..........-D129F:0L10;查看数据段2的内容129F:00000000000000000000-0000000000000000................-数据传送源程序:程序经汇编、连接后,装入内存的情况如下:第24页/共77页26三、变量定义伪操作

格式

变量名类型助记符操作数[,操作数,...]

用来定义程序中所用的内存操作数。其中变量名指示内存操作数的地址(符号地址)

类型助记符指示内存操作数的类型(字节、字、双字等)

操作数指示内存操作数的内容汇编程序将定义的操作数,按其类型分配内存单元数,

顺序存入变量名指向的内存单元中。常用的类型助记符有:DB

指示其后的操作数为字节类型DW

指示其后的操作数为字类型DD

指示其后的操作数为双字类型第25页/共77页27例1:定义赋初值的变量

dataSEGMENT

xxDB1,-1,0fcH

yyDW1,-1,0fcH

zzDD1,-1,0fcHdataENDS第26页/共77页28例2:定义字符串变量(只能用DB定义)dataSEGMENT

str1DB'TsingHua'

str2DB'INPUT:',0dH,0aH,'$'dataENDS注意:3个及其以上的字符,只能用DB定义str1DW‘abcd’str2DD‘abcd’str1str25473696e67487561494e5055543a0d0a24‘T’‘s’‘i’‘n’‘g’‘H’‘u’‘a’‘I’‘N’‘P’‘U’‘T’‘:’0dH0aH‘$’第27页/共77页29操作数可以是用常量、表达式和?表示。常量和表达式表示内存操作数的初始值,

其值应在其定义的类型范围内,否则汇编出错。例

aaDB270bbDW80000

用?

表示不置初始值的内存操作数。

ccDB?

可用DUP复制操作符定义相同的操作数,其格式为

重复次数DUP(操作数)

eeDB3DUP(4)

等价于eeDB4,4,4第28页/共77页30dataSEGMENTxxDB1,-1,0FCHyyDW1,-1,0FCHzzDD1,-1,0FCHstrDB'TsingHua'bufDB4,?,4DUP(?)DB‘dataend’dataENDScodeSEGMENTASSUMECS:codeASSUMEDS:datastart:MOVAX,dataMOVDS,AXLEABX,xxLEASI,yyLEADI,zzMOVAH,4CHINT21HcodeENDSENDstart例4:

在DEBUG下查看变量存放情况。第29页/共77页31四、ASSUME伪操作

格式

ASSUME段寄存器:段名[,段寄存器:段名,…]

其中段寄存器为CS、DS、ES、SS中的一个

段名为用伪操作SEGMENT定义过的段名例

ASSUMECS:cc,DS:aaASSUME伪操作的作用指示汇编程序指令中用到的标号、过程及变量所在的段。其中对标号、过程必须用CS段寄存器指示

对变量可用CS、DS、ES、SS段寄存器指示第30页/共77页32

若未用ASSUME语句指示指令中用到的标号、过程和变量所在的段,汇编程序将给出错误信息。

ASSUME语句只起指示作用,并无实际的操作。在程序中引用定义的变量做内存操作数时,需按寻址方式用传送指令(如MOV)给相应的段寄存器赋值。第31页/共77页33例

用程序实现1234H+5678H

dataSEGMENTvalueDW1234H,5678HresultDW?

dataENDS

codeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;给DS赋值

MOVDS,AXMOVAX,value;取数

ADDAX,value+2;两数相加

MOVresult,AX;保存结果

MOVAH,4CH;返回DOSINT21H

codeENDSENDstart第32页/共77页34注释掉ASSUME语句,其汇编结果:

dataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGMENT;ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVAX,value

ADDAX,value+2

MOVresult,AXMOVAH,4CHINT

21HcodeENDSENDstartD:\MASM>MASMassume;Microsoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.assume.ASM(8):MissingorunreachableCSassume.ASM(10):Cannotaddresswithsegmentregisterassume.ASM(11):Cannotaddresswithsegmentregisterassume.ASM(12):Cannotaddresswithsegmentregister49872+421341Bytessymbolspacefree0WarningErrors

4SevereErrorsD:\MASM>第33页/共77页35程序中有ASSUME语句,经汇编,连接和装入内存后的情况:dataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;给DS赋值

MOVDS,AXMOVAX,value;取数

ADDAX,value+2;两数相加

MOVresult,AX;保存结果

MOVAH,4CH;返回DOSINT21HcodeENDSD:\MASM>DEBUGassume.exe-R;查看程序执行前各寄存器AX=0000BX=0000CX=0023DX=0000SP=0000BP=0000SI=0000DI=0000DS=1295ES=1295SS=12A5CS=12A6IP=0000NVUPEIPLNZNAPONC12A6:0000B8A512MOVAX,12A5-U;查看在内存的程序12A6:0000B8A512MOVAX,12A512A6:00038ED8MOVDS,AX12A6:0005A10000MOVAX,[0000]12A6:000803060200ADDAX,[0002]12A6:000CA30400MOV[0004],AX12A6:000FB44CMOVAH,4C12A6:0011CD21INT21、、、、、-注意:

程序装入内存后,执行程序前,当前的DS值并非程序定义的data段值,1295不等于

12A5第34页/共77页36思考:

如果上例中没有

MOVDS,AX程序执行的结果会怎样?D:\MASM>DEBUGassume.exe-R;查看程序执行前各寄存器AX=0000BX=0000CX=0023DX=0000SP=0000BP=0000SI=0000DI=0000DS=1295ES=1295SS=12A5CS=12A6IP=0000NVUPEIPLNZNAPONC12A6:0000B8A512MOVAX,12A5-U;查看在内存的程序12A6:0000B8A512MOVAX,12A512A6:0003A10000MOVAX,[0000]12A6:000603060200ADDAX,[0002]12A6:000AA30400MOV[0004],AX12A6:000DB44CMOVAH,4C12A6:000FCD21INT21、、、、、dataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;给DS赋值

;MOVDS,AXMOVAX,value;取数

ADDAX,value+2;两数相加

MOVresult,AX;保存结果

MOVAH,4CH;返回DOSINT21HcodeENDS第35页/共77页37结论:1.ASSUME语句只起指示作用,没有赋值作用2.

程序中用到内存操作数时,应按操作数的寻址方式,给相应的段寄存器赋值。第36页/共77页38第三节指示性语句/第四节汇编语言程序举例一、程序开始和结束二、段定义三、变量定义四、ASSUME语句汇编语言程序举例一

了解DOS的返回,装入功能

五、表达式及表达式中的操作符汇编语言程序例二六、过程定义(第五节程序设计介绍)七、等值定义(第五节程序设计介绍)

汇编语言程序例三(第五节程序设计介绍)第37页/共77页39汇编语言程序举例一第38页/共77页40例将BL寄存器的内容按二进制形式显示出来(BL)

MOVCX,8;显示字符个数为8next:SHLBL,1;将显示位移至CF中

JCone;CF=1?

MOVDL,30H

;CF=0,将0的ASCII放在DL中

JMPexitone:MOVDL,31H

;CF=1,将1的ASCII放在DL中exit:MOVAH,2INT21H;调用DOS功能显示

DECCX;循环次数减1

JNZnext;判断是否结束、、、3130313030313130第39页/共77页41codeSEGMENTASSUMECS:codestart:

............codeENDS

ENDstartMOVCX,8;显示字符个数为8next:SHLBL,1;将显示位移至CF中

JCone;CF=1?

MOVDL,30H

;CF=0,将0的ASCII放在DL中

JMPexitone:MOVDL,31H

;CF=1,将1的ASCII放在DL中exit:MOVAH,2INT21H;调用DOS功能显示

DECCX;循环次数减1

JNZnext;判断是否结束第40页/共77页42D:\>MASMSBL;

汇编成ShowBL.objMicrosoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.48912+447243Bytessymbolspacefree0WarningErrors0SevereErrorsD:\>LINKSBL;

连接成ShowBL.exeMicrosoft(R)OverlayLinkerVersion3.61Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.LINK:warningL4021:nostacksegmentD:\>SBL

装载并执行ShowBL.exe请猜想执行的结果?第41页/共77页43D:\>DEBUGSBL.exe

;用DEBUG装入程序-U

0B5E:0000B90800MOVCX,00080B5E:0003D0E3SHLBL,10B5E:00057205JB000C0B5E:0007B230MOVDL,300B5E:0009EB03JMP000E0B5E:000B90NOP0B5E:000CB231MOVDL,310B5E:000EB402MOVAH,020B5E:0010CD21INT210B5E:001249DECCX0B5E:001375EEJNZ00030B5E:001509E8ORAX,BP0B5E:001796XCHGSI,AX0B5E:001800F8ADDAL,BH0B5E:001AB262MOVDL,620B5E:001CFFFF???DI

0B5E:001DEB0AJMP0029-hello.exe用户程序与用户程序相连的内存内容被看作程序时死机第42页/共77页44复习DOS系统的启动过程执行用户程序后,若要返回DOS状态,即在屏幕上出现DOS提示符,等待输入新的命令,应在用户程序的最后安排完成此功能的程序段。通常采用调用DOS系统功能完成。第43页/共77页45调用DOS系统的4CH功能,返回DOS方法:在要返回DOS处,安排指令:

MOVAH,4CHINT21H

执行完4CH的功能调用,即返回DOS。例

codeSEGMENTASSUMECS:codestart:

、、、;程序主体部分、、、、、、

MOVAH,4CH

;返回DOS

INT21HcodeENDS

ENDstart第44页/共77页46codeSEGMENTASSUMECS:codestart:

............MOVAH,4CH

;返回DOS

INT21H

codeENDS

ENDstartMOVCX,8;显示字符个数为8next:SHLBL,1;将显示位移至CF中

JCone;CF=1?

MOVDL,30H

;CF=0,将0的ASCII放在DL中

JMPexitone:MOVDL,31H

;CF=1,将1的ASCII放在DL中exit:MOVAH,2INT21H;调用DOS功能显示

DECCX;循环次数减1

JNZnext;判断是否结束MOVBL,53H;设置一个测试53h第45页/共77页47D:\>MASMShowBL;汇编成ShowBL.objMicrosoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.48912+447243Bytessymbolspacefree0WarningErrors0SevereErrorsD:\>LINKShowBL;连接成ShowBL.exeMicrosoft(R)OverlayLinkerVersion3.61Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.LINK:warningL4021:nostacksegmentD:\>ShowBL装载并执行ShowBL.exe01010011D:\masm>第46页/共77页48D:\>DEBUGShowBL.exe

;用DEBUG装入程序-U

0B5E:0000B90800MOVCX,00080B5E:0003D0E3SHLBL,10B5E:00057205JB000C0B5E:0007B230MOVDL,300B5E:0009EB03JMP000E0B5E:000B90NOP0B5E:000CB231MOVDL,310B5E:000EB402MOVAH,020B5E:0010CD21INT210B5E:001249DECCX0B5E:001375EEJNZ00030B5F:0015B44CMOVAH,4C0B5F:0017CD21INT21-第47页/共77页49codeSEGMENTASSUMECS:codestart:

…;程序主体部分

.........MOVAH,4CH

;返回DOS

INT21HcodeENDS

ENDstart一个完整汇编程序的基本框架:第48页/共77页50DOS的装入功能(又称EXEC系统功能)

可执行文件.exe,应装入内存方能执行。由DOS的装入功能完成。在DOS的提示符后输入可执行文件的文件名,按回车键,DOS系统即调用装入功能,

将可执行程序装入内存。第49页/共77页51第50页/共77页52完成以下操作:

确定内存可用部分,以便存放要执行的.exe文件。

建立程序段前缀PSP

(ProgramSegmentPrefix)

程序段前缀大小100H,即256个字节。

存放进程间的控制信息。

PSP最开始的两个字节CD20,是一条INT20H指令。

装入可执行程序.exeDOS的装入功能第51页/共77页53

修改以下寄存器的值◢

DS、ES设置为程序段前缀所在内存的段值;

(DS)=xxxxH(ES)=xxxxH◢

SS、SP设置为由连接程序传过来的值;◢

CS、IP设置为

程序的入口地址,即伪操作END后跟的符号名对应的物理地址;

此时CS:IP

指向用户程序,开始执行用户程序。第52页/共77页54D:\>DEBUGShowBL.exe-R

;查看当前寄存器内容AX=0000BX=0000CX=001BDX=0000SP=0000BP=0000SI=0000DI=0000DS=0B51ES=0B51SS=0B61CS=0B61IP=0000

NVUPEIPLNZNAPONC0B61:0000B353MOVBL,53-U

;查看程序代码0B61:0000B353MOVBL,530B61:0002B90800MOVCX,0008…...0B61:0017B44CMOVAH,4C0B61:0019CD21INT21-DDS:0L20

;查看此时数据段内容(程序段前缀)0B51:0000CD20FF9F009AF0FE-1DF04F035A058A030B51:00105A0517035A054905-0101010002FFFFFF-UDS:0L5

;反汇编当前数据段内容(程序段前缀)

0B51:0000CD20

INT200B51:0002FF9F009ACALLFAR[BX+9A00]-在DEBUG下查看ShowBL.exe的装入情况:第53页/共77页55-R

;查看当前寄存器内容AX=0000BX=0000CX=001BDX=0000SP=0000BP=0000SI=0000DI=0000DS=0B51ES=0B51SS=0B61CS=0B61IP=0000

NVUPEIPLNZNAPONCB353MOVBL,53

-UCS:0

;查看程序

0B61:0000B353MOVBL,530B61:0002B90800MOVCX,00080B61:0005D0E3SHLBL,10B61:00077205JB000E…….0B61:0017B44CMOVAH,4C0B61:0019CD21INT21…….-G;执行程序01010011Programterminatednormally-第54页/共77页56注意:不能破坏程序段前缀内容,否则无法返回DOS,造成死机。讲义中介绍的第二种返回DOS的方法不作学习要求。(在老的教材或参考书中使用该法,新版的书中很少使用,新版的教材P98的例程可以不看,采用的是第二种方法)。想要掌握的同学可自学。第55页/共77页57第二种DOS返回方法,调用20H类型的中断程序◢

20H中断程序的功能:处理程序结束,返回系统。◢调用20H中断程序是有条件的:要求当前的CS应为程序段前缀在内存的段值问题:如何保证执行到INT20H时,当前CS的值为程序段前缀在内存的段值?第56页/共77页58采用下面的程序框架,可保证执行INT20H时,当前的CS值为程序段前缀在内存的段值。codeSEGMENTASSUMECS:codemainPROCFAR

;使RET为远返回

start:PUSHDS

;入栈保存地址

MOVAX,0

;程序段前缀的首地址

PUSHAX

、、;程序主体部分、、

RET

;取程序段前缀首地址mainENDPcodeENDSENDstart第57页/共77页59注意:1.

不可在汇编语言程序的最后用INT20H返回DOS。

原因是20h中断子程的执行是有条件的。采用第二种返回DOS的程序结构,才能满足该条件,否则无法返回。2.

不可在程序的最后用INT3返回DOS。

原因是3类型的中断子程实现断点设置,只在DEBUG下起作用。第58页/共77页60五、表达式及表达式中的操作符

表达式由常量、标号、变量和一些操作符构成。汇编程序对表达式进行运算后,得到一个确定的数值,再把这个数值汇编到指令中。据表达式所表示的内容,分数字表达式、地址表达式。表达式是指令或伪操作的操作数;

表达式中的操作符由汇编程序完成例

MOVAX,12-4;MOVAX,8;数字表达式

LEABX,[string+4];地址表达式

第59页/共77页61表达式中的操作符有以下几类:1.算术运算符(+、-、*、/、MOD)2.逻辑运算符(AND、OR、NOT、XOR)3.关系运算符(EQ、NE、GT、GE、LT、LE)

真:FFFFH;假:04.

数值返回操作符(SEG、OFFSET)5.类型操作(PTR)6.地址记数器($)第60页/共77页62例:

1.算术运算符(+、-、*、/、MOD(取余数))MOVAX,6*8←MOVAX,482.逻辑运算符(AND、OR、NOT、XOR)MOVAX,80hOR70h←MOVAX,0F0h3.关系运算符(EQ、NE、GT、GE、LT、LE)

真:FFFFH;假:0MOVAX,1GE2←MOVAX,0第61页/共77页63

4.

数值返回操作符

(SEG、OFFSET)SEG取符号地址的段地址例MOVAX,SEGyyOFFSET取符号地址的偏移地址例MOVBX,OFFSETyybb SEGMENT

yy DB6dup(?)bb ENDScc SEGMENT ASSUMECS:cc,

温馨提示

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

评论

0/150

提交评论