8086的体系结构课件_第1页
8086的体系结构课件_第2页
8086的体系结构课件_第3页
8086的体系结构课件_第4页
8086的体系结构课件_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言程序设计基础3.1

基本概念1.机器指令和代码指令

机器指令------是能为计算机所能接受的一组代码。它指出计算机所要进行的操作及其操作对象。机器指令是由二进制代码组成的。代码指令------用“0”或“1”形式表示的机器指令,是机器指令的数据表示形式,是能被计算机直接识别和执行的二进制代码串。机器语言程序------用机器语言或代码语言编写的程序。指令系统------计算机全部指令的集合。

优点:能被计算机直接理解和执行;缺点:编程繁琐,不直观,难记忆,易出错,难查错。

2.汇编指令汇编指令----用来表示机器指令的助记符。每一条机器指令对应一条汇编指令。汇编语言(AssemblyLanguage)----由助记符构成的指令系统。汇编语言源程序----用汇编语言编写的程序。“汇编”(Assemble)----将汇编语言程序和高级语言程序翻译成机器语言程序的过程。汇编程序----完成汇编的程序(MASM.EXE)优点:编写的程序生成的目标代码精简,占内存少,执行速 度快;缺点:程序所要解决的问题与数学模型之间的关系不直观, 程序设计和调试的时间也比较长,可移植性较差。

适应场合:内存容量和速度要求比较高3.编语言程序建立及处理过程A.ASM文件编辑程序EDITA.OBJ文件汇编程序MASMA.EXE文件连接程序LINK计算机上运行汇编语言程序的步骤是:1)用编辑程序建立.ASM源文件;2)用MASM程序把.ASM文件转换成.OBJ文件;3)用LINK程序把.OBJ文件转换成.EXE文件;4)在操作系统环境下直接键入文件名就可执行该程序。 3.28086指令系统8086/8088的指令系统按功能可以分为六类:数据传送算术运算逻辑运算与移位字符串处理控制转移以及处理器控制第一节数据传送类这类指令用于实现存储器与寄存器、寄存器与寄存器,AL/AX与I/O端口、立即数到寄存器或存储器的字节或字的传送,共有14条指令,可分为四组。1、通用数据传送指令

MOV(move)传送PUSH(pushintothestack)进栈POP(popfromthestack)出栈XCHG(exchange)交换2、累加器专用指令

IN(input)输入OUT(output)输出XLAT(translate)换码

3、地址传送指令

LEA(loadeffectiveaddress)有效地址送寄存器LDS(loadDSwithpointer)指针送寄存器和DSLES(loadESwithpointer)指针送寄存器和ES

4、标志寄存器传送指令

LAHF(1oadAHwithflags)标志送AHSAHF(storeAHintoflags)AH送标志寄存器PUSHF(pushtheflags)标志进栈POPF(poptheflags)标志出栈

第二节算术运算类1、加法指令

ADD(add)字节或字相加ADC(addwithcarry)带进位的字节或字相加INC(increment)字节或字加1AAA(ASCIIadjustforaddition)加法的ASCII码调整DAA(decimaladjustforaddition)加法的十进制调整

2、减法指令

SUB(subtract)字节或字相减SBB(subtractwithborrow)带借位的字节或字相减DEC(decrement)字节或字减1NEG(negate)字节或字求补CMP(compare)字节或字的比较AAS(ASCIIadjustforsubtraction)减法的ASCII码调整DAS(decimaladjustforsubtraction)减法的十进制调整4、除法指令

DIV(unsigneddivide)无符号二进制数相除IDIV(signeddivide)带符号二进制数相除AAD(ASCIIadjustfordivision)除法的ASCII码调整CBW(convertbytetoword)字节变换为字CWD(convertwordtodoubleword)字变换为双字3、乘法指令

MUL(unsignedmultiple)无符号二进制数相乘IMUL(signedmultiple)带符号二进制数相乘AAM(ASCIIadjustformultiplication)乘法的ASCII码调整

第三节逻辑运算和移位类1、逻辑运算指令

NOT(not)字节或字求反AND(and)字节或字逻辑与OR(or)字节或字逻辑或XOR(exclusiveor)字节或字逻辑异或TEST(test)字节或字的测试2、移位和循环移位指令

SHL(shiftlogicalleft)逻辑左移SAL(shiftarithmeticleft)算术左移SHL(shiftlogicalright)逻辑右移SAR(Shiftarithmeticright)算术右移ROL(rotateleft)循环左移ROR(rotateright)循环右移RCL(rotateleftthroughcarry)带进位循环左移RCR(rotaterightthroughcarry)带进位循环右移第四节字符串处理类8086/8088指令系统为文件处理提供了一组强有力的指令(字符处理指令)。文件处理----对一系列含有字母数字代码的字节(也称字符串)进行处理,例如传送、比较、查找、插入、删除等,字符串指令为这些处理提供了很大方便。

MOVS/MOVSB/MOVSW(MoveBytestringormovewordstring)传送字节串或字串。CMPS/CMPSB/CMPSW(compareByteorWordString)比较字节或字串。SCAS/SCASB/SCASW(scanbyteorwordstring)搜索字节串或字串。STOS/STOSB/STOSW(storebyteorwordstring)存字节串或字串。LODS/LODSB/LODSW(loadByteorWordString)取字节串或字串。以上各条指令前均可使用重复前缀指令,与上述基本指令配合使用的前缀有:REP(repeat)重复REPE/REPZ(repeatwhileequal/zero)相等/为零则重复REPNE/REPNZ(repeatwhilenotequal/notzero)不相等/不为零则重复

格式为:重复前缀串操作指令目的串,源串第五节控制转移指令类8086/8088指令系统中有一组指令用于控制程序的转移,这些指令有的只修改IP的内容,有的则同时修改IP和CS的内容。这组控制程序转移的指令可再分为三组。

1、无条件转移指令

CALL(CALLaProcedure)调用一个过程指令(转子指令)。RET(RETurnfromprocedure)从过程返回。(从子程序返回)。JMP(JUMP)转移

2、条件转移指令

其中“高于和低于”适用于操作数为无符号数的判别。例如0FFH高于05H。而‘大于和小于”是用于操作数为带符号数的判别。例如0FFH小于05H。因为前者为-1。条件指令常在比较或减法指令之后使用。

1)判断无符号数大小的条件转移指令①

JA/JNBE(jumpifnotbloworequal,orabove)

JA指令(高于转移)

JNBE指令(不低于等于转移)②

JBE/JNA(jumpifbloworequal,ornotabove)

JBE指令(低于或等于转移)

JNA指令(不高于转移)③JAE/JNB(jumpifnotblow,oraboveorequal)

JAE指令(高于等于转移)

JNB指令(不低于转移)④JB/JNAE(jumpifblow,ornotaboveorequal)

JB指令(低于转移)

JNAE指令(不高于等于转移)

2)判断带符号数大小的条件转移指令①

JG/JNLE(jumpifgreater,ornotlessorequal)

JG指令(大于转移)

JNLE措令(不小于等于转移)②

JGE/JNL(jumpifgreaterorequal,ornotless)

JGE指令(大于等于转移)

JNL指令(不小于转移)③JL/JNGE(jumpifless,ornotgreaterorequal)

JL指令(小于转移)

JNGE指令(不大于等于转移)④JLE/JNG(jumpiflessorequal,ornotgreater)

JLE指令(小于等于转移)

JNG指令(不大于转移)3、测试某个标志的条件转移指令

①JE/JZ(jumpifzero,orequal)

JE指令(相等则转移)

JZ指令(等于0转移)②JNE/JNZ(jumpifnotzero,ornotequal)

JNE指令(不相等则转移)

JNZ指令(不等于0转移)1)测试ZF①JC(jumpifcarry):当满足CF=1时,转移到目标地址。

②JNC(jumpifnotcarry):当满足CF=0时,转移到目标地址。

2)测试CF3、测试某个标志的条件转移指令

①JS(jumpifsign)指令(为负转移)

②JNS(jumpifnotsign)指令(为正转移)

3)测试SF①JP/JPE(jumpifparity,orparityeven)指令(为偶转移)②JNP/JPO(jumpifnotparity,orparityodd)(为奇转移)4)测试PF①JO(jumpifoverflow)指令(溢出转移)

②JNO(jumpifnotoverflow)指令(未溢出转移)

5)测试OF4、迭代控制指令

这些指令用来完成循环控制的判断转移操作。其转移的目的地址必须在相对该指令的下一指令所在地址位移-128~+127范围内.格式:LOOP循环标号LOOPE/LOOPZ(LOOPifequal/zero)若相等/为0,则循环。LOOPNE/LOOPNZ(LOOPifnotequal/notzero)若不相等/不为0,则循环。JCXZ(JumpifregisterCX=0)若寄存器(CX)=0,则转移。3.3

源程序典型结构本节的目的在于告诉读者,如何书写一个完整的汇编语言源程序。一个标准的单模块汇编语言源程序

书写形式示例段寄存器初值的设置DOS下汇编语言程序的正常结束

第一节标准单模块汇编语言程序书写形式示例DATASEGMENT;定义数据段……;DATAENDSSTACKSEGMENTSTACK;定义堆栈段……;STACKENDSCODESEGMENT;定义代码段

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

MOVDS,AXMOVES,AX……MOVAH,4CH;返回操作系统

INT21HCODEENDSENDSTART说明:

一个汇编语言源程序由若干逻辑段组成,一般由数据段、堆栈段、代码段组成。程序中数据段、堆栈段根据实际情况可以有也可以没有,但是任何一个源程序至少必须有一个逻辑代码段和一条作为源程序文件结束的伪指令END。如果没有堆栈段,那么,连接(LINK)时将产生一个警告性的错误:

LINK:warningL4201:nostacksegment

这对于没有堆栈操作的用户来说并不是错误。但是如果用户程序用到堆栈的话,则最好设置自己的逻辑堆栈段。伪指令----源程序中附加的一些指示信息,它们本身不被汇编成代码指令,只是用来协助汇编程序(MASM.EXE)完成汇编工作。

源程序格式1、SEGMENT/ENDS

SEGMENT和ENDS用来定义一个逻辑段,作为一段的开头和结束,必须成对出现。 格式为:

<段名>SEGMENT[STACK] …… <段名>ENDS

其中,<段名>是由用户自己给出的,SEGMENT和ENDS前的<段名>必须一致。 功能:为一个逻辑段命名,并指出以<段名>命名的逻辑段从何处起到何处止。如果有可选项STACK,则该逻辑段为用户定义的逻辑堆栈段。源程序格式2、ASSUME

用来指示定义的各段用哪个段寄存器寻址。但它本身不对段寄存器装填内容,除CS外,DS、SS、ES的值必须由用户通过MOV指令装填。 格式为:

ASSUME<段寄存器名>:<逻辑段名>[,…]

例中ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK指明代码段CODE通过段寄存器CS寻址,数据段DATA通过段寄存器DS、ES寻址,堆栈段STACK通过段寄存器SS寻址。源程序格式3、END

表示一个程序模块的结束。若为主程序模块,必须加起始标号。起始标号是程序运行的起始地址。我们在本章编写的程序都是主程序模块,END后必须加起始标号。 格式为:

END[<起始标号>]

4、EQU

格式为:

<标识符>EQU<表达式或字符串>

功能:表示该标识符与对应的表达式或字符串等价,即在汇编时以该表达式或字符串替代对应的标识符。例如:AEQU20H

……MOVAL,A;等价于MOVAL,20H例如:MOVEEQUMOV

……MOVEAX,BX;等价于MOVAX,BX源程序格式5、EXTRN

格式:EXTRN外部符号说明 其中外部符号说明是指本程序文件中所用到的外部模块中的过程名、标号或变量名。 功能:供连接程序遇到相应外部符号时从其它模块中查找。6、$地址计数器

功能:用来直接引用地址计数器的值。在汇编程序对源程序汇编的过程中,地址计数器用来存放正在汇编的指令的偏移地址。当它用在数据定义当中时,表示的是地址计数器的当前值。 例如:

D1DB23H,24H,25H COUNTDW$-OFFSETD1

假如汇编时为D1分配的偏移地址是0000,这里$的值为0003,COUNT的值为0003。源程序格式7、ORG

格式为:ORG常数表达式 功能:把当前地址计数器的值设为表达式的值。 例如:

DATASEGMENT ORG10 D1DW1234H … DATAENDS

则D1的偏移地址为0AH。

源程序格式一个较为完整的汇编语言源程序书写形式如下:

用EQU定义的等价语句(可有可无)用EXTRN定义的外部说明(如果用到外部模块的话)

代码段名SEGMENTASSUME定义的寻址关系过程名PROC……;程序逻辑代码段过程名ENDS

起始标号:……;程序代码段名ENDSEND起始标号或过程名

堆栈段名SEGMENTSTACK逻辑堆栈段……;用变量定义预置的堆栈空间堆栈段名ENDS(如果用户设置自己的堆栈的话)

(如果用户设置自己的堆栈的话)

数据段名SEGMENT逻辑数据段……;用变量定义预置的数据空间数据段名ENDS第二节段寄存器初值的设置 ASSUME指令仅仅是指定了某逻辑段应通过四个段寄存器中的哪一个进行寻址,但并没有给段寄存器设置初值。也就是ASSUME并没有使段寄存器指向具体的哪个段。要完成对段寄存器的初值设定,需要通过一定的指令予以实现。这里唯有CS是特殊的,只有它无需用户专门处理。而DS、ES、SS则必须由用户在程序代码段的起始处自己设定初值。 一般方法是:

MOVAX,<逻辑段名> MOVDS,AX;对SS、ES的初值设定也一样

源程序格式例3.1DATA1SEGMENTADB34HDATA1ENDSDATA2SEGMENTBDB56HDATA2ENDSCODESEGMENTASSUMECS:CODE,DS:DATA1,ES:DATA2;指明CODE段通过CS寻址;DATA1段通过DS寻址;DATA2段通过ES寻址START:MOVAX,DATA1;传送DATA1的基址给AXMOVDS,AX;把AX中的基址送段寄存器DSMOVAX,DATA2;传送DATA2的基址给AXMOVES,AX;把AX中的基址送段寄存器ESMOVAL,AADDAL,ES:BMOVA,ALMOVAH,4CHINT21HCODEENDSENDSTART源程序格式第三节DOS下汇编语言程序的正常结束

每个汇编语言程序在其代码段中都必须含有返回DOS操作系统的指令语句,以保证程序执行完后能自动返回DOS状态,可继续向计算机输入命令或程序。中止当前程序,使其正确返回DOS状态的方法通常有如下方式:

源程序格式1、采用DOS4CH功能调用

这种方法在代码段结束之前加调用语句:MOVAH,4CH;功能号4CH=>AHINT21H;中断调用这是返回DOS最有效且兼容性最好的一种方法。

2、主程序定义为远过程

这种方法在代码段按下述方式定义主程序:┇CODESEGMENTASSUME…主过程名PROCFARSTART:PUSHDSMOVAX,0PUSHAX┇RET主过程名ENDP┇CODEENDSENDSTART

3.4

变量、程序中数据组织程序中所涉及的数据除立即数、由指令产生的数、通过键盘等读入的数据外,其它大量初始数据、中间结果和结果要在程序设计时进行预置和分配。所谓预置和分配就是指在一定的逻辑段中,将这些数据一定的形式存放起来,并给出访问的原则,而对于那些结果单元则只需给出访问形式和预留出一定的空间就可以了。1、变量的定义和预置

在一个逻辑段中可以通过DB、DW、DD定义和预置以字节、字、双字为存储单位的变量。格式:<变量名>DB|DW|DD<表达式>|<表达式表>其中<变量名>应是一个非保留字的标识符,<变量名>可有可无,若有则该标识符作为该变量名;否则该变量为无名变量。DB、DW、DD只能任选其一,分别表示按字节、字、双字分配存储。<表达式>可以是以下六种之一:1)常数项表达式2)保留符号‘?’3)地址表达式(DB不用)4)二个以上的ASCII码字符串5)预置数据表格6)重复值(一个DUP子句)

1、变量的定义和预置

例:DATA

SEGMENT

DATA1

DB

20H,21H

DATA2

DW

0204H,1000H

DATA3

DD

12345H

DATA4

DB-1*3,15/3

DATA5

DB‘0123’

DATA6

DW‘AB’,‘C’、‘D’

DATA7

DB?

DATA8

DD?

DATA9

DB

2

DUP(0)

DATA10

DW

3

DUP(?)

DATA

ENDS这些变量在内存中的存储形式如下图所示。设DS值为18DB,则从地址18DB:0000开始依次存放。变量的定义和预置DATA1

DB

20H,21H

DATA2

DW

0204H,1000H

DATA3

DD

12345H

DATA4

DB-1*3,15/3

DATA5

DB‘0123’

DATA6

DW‘AB’,‘C’、‘D’

DATA7

DB?

DATA8

DD?

DATA9

DB

2

DUP(0)

DATA10

DW

3

DUP(?)DATA1

DB

20H,21H

DATA2

DW

0204H,1000H

DATA3

DD

12345H

DATA4

DB-1*3,15/3

DATA5

DB‘0123’

DATA6

DW‘AB’,‘C’、‘D’

DATA7

DB?

DATA8

DD?

DATA9

DB

2

DUP(0)

DATA10

DW

3

DUP(?)说明:

1)变量名是一个标识符,即是以字母开头的字母、数字和特殊字符组成的字符串。2)一个变量名的实质是一个地址,并不是“DATA1里存放了20H,21H”“DATA5里存放了‘0123’的ASCII码”而是“从DATA1处依次存放了20H,21H”“从DATA5处依次存放了‘0123’的ASCII码”。3)DB/DW/DD伪指令是在变量名所对应的地址开始的内存区域依次存入表达式中的各项值。4)变量实际上就是一块存放数据的内存区域,定义在某个段中。

变量的定义和预置2、变量的访问

1)访问变量的值 可以用如下方式访问:

MOVBL,DATA1;把地址为DATA1的字节20H=>BL MOVCL,DATA1[1];把地址为DATA1+1的字节21H=>CL,CL的值为21H MOVBX,DATA2[0];把地址为DATA2的字0204H=>BX,BX的值为0204H MOVBX,DATA2;同上

MOVBX,DATA2[1];把地址为DATA2+1的字0002H=>BX,;BX的值为0002H MOVBX,DATA2[2];把地址为DATA2+2的字节1000H=>BX,;BX的值为1000H

温馨提示

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

评论

0/150

提交评论