80868088CPU

    技术2022-05-11  10

    8086CPU:16位微处理器,内外数据总线为16位。

    8088CPU:准16位微处理器,内部数据总线为16位,外部数据总线为8位

    内部结构基本相同,指令系统安全相同内部包括两大部件:总线接口部件BIU 取指令、取操作数、存结果执行部件EU 执行指令

    8086/8088寄存器 8个16位通用寄存器AX AH AL  累加寄存器 AH为高8位,AL为低8位BX BH BL  基址寄存器CX CH CL  计数寄存器DX DH DL  数据寄存器SP 堆栈指针寄存器BP 基址指针寄存器SI 源变址寄存器DI 目的变址寄存器

    4个16位段寄存器CS 代码段寄存器DS 数据段寄存器SS 堆栈段寄存器ES 附加段寄存器

    2个16位控制寄存器IP  指令指针FR 标志寄存器

    标志寄存器FRFR用来记录程序执行时的状态FR有9个标志位6个状态标志、3个控制标志状态标志(1)进位标志位CF。算术运算:结果最高为有进位、借位置‘1’,移位操作:存放移出的位(2)奇偶标志位PF。结果低8为‘1’的个数为偶数置‘1’(3)辅助进位标志位AF。低8位中的低4位向高4位有进位、借位置‘1’(4)零值标志位ZF。运算结果为全0置‘1’,不为零置‘0’(5)符号标志位SF。运算结果为负置‘1’,为正置‘0’(6)溢出标志位OF。运算结果N发生溢出时,OF置‘1’ 字节运算:N<-128或N>127 字运算:N<-32768或N>32767

    控制标志(1)单步标志位TF TF=1时,CPU执行完一条指令后产生单步中断,进入单步中断程序。(2)中断标志位IF IF=1时,允许CPU响应可屏蔽中断请求(3)方向标志位DF 规定串操作指令中串地址的增减方向。DF=0时,SI或DI内容自动递增,反递减。

    8086/8088主存储器

    主存容量:1M字节单元,需20位地址主存空间划分为若干段,每个段<=64k字节;在CPU中设段寄存器以指示段的起始地址。段基址:一个段的起始地址,低4位必须是0。偏移量:一个存储单元与段基址之间的字节距离。段基值:20位段基址的高16位,放在段寄存器中。

    形成20位存储单元的物理地址CPU访问某个存储单元的20位物理地址,是由两个16位地址合成的;段寄存器提供段基值,EU或IP提供偏移量

     

    8086/8088指令系统8086/8088的指令采用变字节指令格式,指令长度1~6个字节,第一字节包含操作码。第二字节通常表示寻址方式,第3~6个字节表示位置量、立即数寻址方式,八种:1、寄存器寻址。特点:执行速度快,不需要总线周期。 在汇编指令中,寄存器地址直接用寄存器名表示,如AX、BX、CL、SI、DS等 例:MOV AX,BX2、立即数寻址。指令所需的操作数直接在指令代码中,随着取指令一起取到BIU的指令队列中。特点:执行速度快,常用来提供常数。 例: MOV AX,1234H

    在汇编语言程序中,存储单元地址使用逻辑地址:段基值:偏移量有效地址:按指令中存储器寻址方式计算得到的偏移量称为有效地址EA。有效地址EA是由三个地址分量的某种组合:(1)位移量:指令代码中的一个8/16位二进制数。(2)基地址:BX或BP的内容。(3)变址量:SI或DI的内容。根据三个地址分量的不同组合有4种不同的存储器寻址方式。3、直接寻址。指令所需的操作数在存储器中,操作数的有效地址EA直接由指令代码中的位移量提供。 例:MOV AX,DS:[1H]  DS表示数据段。必须只出哪个段寄存器。 (1)符号地址 在汇编语言程序中,常用符号地址表示存放操作数的存储单元,故汇编指令中,可用符号地址表示的直接寻址方式来存取操作数。 VAR DB 1000H MOV BX,VAR;BX<--1000H 说明:SRC为VAR 的地址的位移量,传入BX的是根据位移量和基址所得的物理地址上的数据。 如果为给出段基址的则默认使用DS4、寄存器间接寻址。指令所需的操作数在存储器中,操作数的有效地址EA直接从SI/DI/BX/BP中获得。 如以SI/DI/BX间接寻址时,隐含使用DS; 如以BP间接寻址时,隐含使用SS; 例:  MOV CH,[SI]  MOV [DI],AX  MOV AL,[BX]  MOV [BP],DX5、变址寻址。指令所需的操作数在存储器中,操作数的有效地址EA是两个地址分量之和。 操作数的EA是SI或DI内容与位置量之和。 6、基址变址寻址 操作数的EA是BX或BI内容与位移量之和。7、串操作寻址8、I/O端寻址方式

    指令类型8086/8088指令按操作数地址个数划分三种类型:双操作数指令:OPR DEST,SRC单操作数指令:OPR DEST,SRC无操作数指令:OPR

    六大块:传送类指令(1)数据传送指令 指令格式:MOV DEST,SRC 注:立即数和段寄存器无法直接传送(2)交换指令 指令格式:XDHG DEST,SRC 注:都不能为立即数(3)标志位置位传送指令 取标志指令  指令格式:LAHF  指令功能:AH<--(FR)7~0 存标志指令  指令格式:SAHF  指令功能:FR7~0<--(AH) 标志压栈指令  指令格式:PUSHF  指令功能:SP<(SP)-2     栈顶字单元<--(FR) 标志出栈指令  指令格式:POPF  指令功能:FR<--(栈顶字单元)     SP<--(SP)+2(3)地址传送指令 装入有效地址指令  指令格式:LEA DEST,SRC  指令功能:DEST<--SRC的EA

    算术运算类指令(1)加法运算指令 加法指令  指令格式:ADD DEST,SRC  指令功能:DEST<--(SRC)+(DEST) 带进位加法指令  指令格式:ADC DEST,SRC  指令功能:DEST<--(SRC)+(DEST)+CF 加1指令  指令格式:INC DEST  指令功能:DEST<--(DEST)+1(2)减法运算指令 减法指令  指令格式:SUB DEST,SRC  指令功能:DEST<--(DEST)-(SRC) 带借位减法指令  指令格式:SBB DEST,SRC  指令功能:DEST<--(DEST)-(SRC)-CF 减1指令  指令格式:DEC DEST  指令功能:DEST<--(DEST)-1 求负数指令  指令格式:NEG DEST  指令功能:DEST<--0-(DEST) 比较指令  指令格式:CMP DEST,SRC  指令功能:DEST-(SRC)  执行后,当ZF=1,表明相等。          当CF=1,表明DEST大,反之小。(3)乘法指令 无符号数乘法指令  指令格式:MUL OPRD  字节无符号数相乘   AX<--(OPRD)*(AL)  字无符号数相乘   DX:AX<--(OPRD)*(AX)(4)除法指令 无符号数除法指令  指令格式:DIV OPRD  字节无符号数相乘   (AL)<--(AX)/(OPRD)  字无符号数相乘   (AX)<--(DX:AX)/(OPRD)

    位操作类指令。包括逻辑运算指令、测试指令和移位指令(1)逻辑运算指令 逻辑与指令 AND DEST,SRC 指令功能 DEST<--(SRC)^(DEST) 逻辑或指令 OR DEST,SRC 指令功能 DEST<--(SRC)v(DEST) 逻辑异或指令 XOR DEST,SRC 逻辑非指令 NOT DEST(2)测试指令 指令格式:TEST DEST,SRC 指令功能:(SRC)^(DEST)(3)移位指令 算术移位指令  左移:SAL DEST,COUNT  右移:SAR DEST,COUNT 逻辑移位指令  左移:SHL DEST,COUNT  右移:SHR DEST,COUNT 循环移位指令(不带进位)  左移:ROL DEST,COUNT  右移:ROR DEST,COUNT 循环移位指令(带进位)  左移:RCL DEST,COUNT  右移:RCR DEST,COUNT 串操作类指令程序转移类指令处理器控制类指令

    汇编语言语句格式指令语句格式标号:指令助记符 操作数 ;注释

    伪指令语句格式。伪指令语句是指示汇编程序如何汇编源程序的命令语句,在汇编时,它不产生目标代码,由汇编程序解释它的意义并立即完成相应的操作。符号名 伪指令符 操作数 注释

    标识符:标识符是指令语句中的标号和伪指令语句中的符号名的统称,其组成规则如下: (1)字符个数1~31 (2)第一个字符必须是字母或者特殊字符。特殊字符有5个:? @ . _ $ (3)第二个字符开始,可以是字母、数字或特殊符号 (4)标识符不能与系统专用保留字相同。

    符号定义伪指令1、等值语句 符号 EQU 表达式。不可重新定义2、等号语句 符号 = 表达式。 可重新定义

    数据定义伪指令变量名 DB 表达式1,表达式2        表达式为初值 DW DD定义数据必须在一个逻辑段中定义后的每个变量均有三个属性:(1)段属性(SEQ)(2)偏移量属性(OFFSET)(3)类型属性(TYPE)

    初值可以由:(1)数值表达式(2)字符串表达式  加引号(3)?表达式 初值为零(4)带DUP表达式。格式:变量名 类型 次数 DUP(内容)  内容可以嵌套DUP

    常数1、数值常数二进制,末尾加B八进制,末尾加Q或者O十进制,末尾加D或者不加十六进制,末尾加H,且头非字母,如有字母前加0。

    2、字符串常数用引号引用,汇编时将翻译成ASCII

    3、常数的使用(1)作源操作数中的立即数(2)位移量(3)定义数据的初值

     

    表达式与运算符

    表达式分两种,数值表达式与地址表达式。

    运算符有五种1算术运算符 算术运算符有8个:+、-、×、/、MOD(求余)、SHL(算术左移)、SHR(算术右移)、[](下标运算)2逻辑运算符 AND、OR、XOR、NOT,只能用于算值表达式中。3关系运算符 EQ(相等)、 NE(不相等)、 LT(小于)、 LE(小于或者等于)、 GT(大于)、 GE(大于或者等于)。 关系运算符用于两个表达式进行比较。当关系成立时,其结果为全1;不成立时,为全0。4数值返回运算符 数值返回运算符有5个:SEG、OFFSET、TYPE、LENGTH、SIZE。只能对变量或者标号进行运算,用来运算变量或者标号的属性值。 使用格式是:运算符  变量名或标号  类型属性数字   类型属性  类型数字 变量 BYTE    1  WORD      2  DWORD     4 标号 NEAR    -1 段内  FAR       -2 段外 例: MOV AX,SEG VAR1  将VAR1的起始地址传入AX     MOV DI,OFFSET VAR2 将VAR2的偏移地址传入DI中。          A1 DB 20H DUP(0)     A2 DW 10,20,'ABCD'    MOV CX,LENGTH A1;CX<--20H  MOV AL,LENGTH A2;AL<--1  MOV BX,SIZE A1;BX<--20H*1  MOV DL,SIZE A2;DL<--1*2   5属性与分离字节运算符 PTR运算符 其使用格式是:类型 PTR 地址表达式。 例:VRW1 DW 1234H  VRB1 EQU BYTE PTR VRW1    MOV AX,VRW1  MOV BL,VRB1;BL<--34H THIS运算符 其使用格式是:THIS 类型。 例: DATAB EQU THIS BYTE DATAW DW 10H DUP(0) MOV AX,DATAW;AX<--1010H MOV BL,DATAB;BL<--10H HIGH 16位表达式 LOW  16位表达式

    程序的段结构

    一、SEGMENT/ENDS  段定义伪指令段名 SEGMENT 定义类型 组合类型 ‘类别名’   .   .   .   .段名 ENDS

    1 段名:由用户自定,且必须满足标识符的条件。

    2 定义类型:定位类型是一个选项,它表示对段起始边界的要求,可以有4种选择: (1)PAGE 表示本段必须从一个页的边界开始,主存储器可以按页划分,一页为256个字节单元。 (2)PARA 如果未选择定位类型,则隐含为PARA,它表示本段必须从一个小节的边界开始。一节为16个字节单元。起始地址低四位为零。 (3)WORD 表示本段起始地址从偶地址开始,即段首地址的最后一位二进制数一定是0。 (4)BYTE 表示本段起始地址可以从任何一地址开始。3 组合类型:组合类型也是一个选项,它表示本段是否与其它段进行连接,有6种类型可供选择: (1)NONE 这是隐含选择,表示本段与其它段在逻辑上无连接关系,本段有自己的段基址。 (2)PUBLIC 在满足定位类型的条件下,将本段与其它段名形同段邻接在一起形成一个段,共用一个段基址,并相对这个段基址调整段内变量的偏移量。 (3)COMMON 当连接多个程序模块时,为各模块中段名相同且用COMMON说明的段指定相同的段起始地址,并产生一个覆盖段,该段的长度取决于最长的COMMON段的长度。 (4)STACK 将同段名的连接成一个连续段,并且自动初始化堆栈段寄存器SS和堆栈指针SP,SS中为这个段的段基值,SP中为该段的字节长度。 (5)MEMORY 表示本段连接在其他所有段的后面,即分配在存储器的高地址端。 (6)AT 表达式  表示本段的起始地址由表达式的值指定,表达式的值只能为16位二进制数。

    二、段寻址伪指令ASSUME ASSUME 段寄存器名 段名,段寄存器名,段名。。。。  只表示段名和段寄存器的关系。三、段寄存器的装入1、DS和ES的装入 在程序中,必须使用MOV指令才能将对应段的段基值装入。2、SS装入段基值 定义堆栈时,SEGMENT语句中的组合类型选择“STACK”。3、CS的装入 当源程序经过汇编、连接后,由DOS系统将其装入存储器中,同时将程序要执行的第一条指令地址装入CS、IP中,然后从这条指令开始执行。这个程序执行的起始地址是由END伪指令提供。  END 伪指令的语句格式如下: END 起始地址

    顺序、分支程序设计一、顺序程序设计 顺序结构的程序从执行开始结束,一直是按指令序列的在主存的存放顺序来执行指令的,且每条指令只执行一次。 例如:试编写一程序计算以下公式的值,并将结果放在F1(商)和F2(余数)字单元中 F=[10*(X+Y)-3*(Z-1)]/(X-Y-Z)

     TITLE EXAMPLE PROGRAM DATA SEGMENT VARX DW 123H VARY DW 456H VARZ DW 789H F1 DW ? F2 DW ? DATA ENDS STACK1 SEGMENT PARA STACK;当返回DOS时需要堆栈段 DW 20H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 BEGIN: MOV AX,DATA;为DS附初值 MOV DS,AX MOV AX,VARX ADD AX,VARY MOV BX,10 MUL BX;AX<--AX*BX MOV BX,VARZ DEC BX MOV CX,BX SAL BX,1;算术左移1位就是×2 ADD BX,CX SUB AX,BX MOV BX,VARX SUB BX,VARY SUB BX,VARZ XOR DX,DX;余数保留在DX里,故先清空 DIV BX;AX<--AX/BX MOV F1,AX MOV F2,DX MOV AH,4CH;返回DOS INT 21H;中断指令 CODE ENDS END BEGIN 

     

     

    二、分支程序设计1、转移指令:在程序中,指令的执行顺序由CS:IP的内容确定。转移指令通过改变CS和IP的内容,是程序改变执行顺序。(一)无条件转移指令 指令格式为:JMP 目标地址 执行JMP指令后,就转移到“目标地址”指向的指令执行,而不执行下一条指令。无论是段内转移还是段间转移,目标地址都有两种表示方法: (1)直接寻址方式:JMP指令直接给出目标地址,通常用目标处的标号表示。  段内转移:执行的操作是IP<--(IP)+RD,RD是相对位移量。例:JMP L1;L1为段内的代码标号。  段间转移:执行JMP指令时,将目标处指令地址的段基值和便宜量直接送入CS和IP。例:JMP FAR PTR LABF;LABF为段间的代码标号。 (2)间接寻址方式  段内间接:JMP指令的目标地址放在一个16位通用寄存器、字存储单元中。   例:   JMP BX;IP<--(BX)   JMP WORD PTR [SI];IP<--(SI指向字单元)  段间间接:这种寻址转移的目标是存放在一个作地址指针的双字单元中。   例:JMP DWORD PTR ADR1;IP<--ADR1,CS<--(ADR1+2)(二)条件转移指令。8086/8088有18条条件转移指令。其汇编格式为:JXX 目标地址  其中,XX表示转移条件,目标地址通常使用标号。执行执行的操作是:条件满足时,则IP<--(IP)+RD;否则,顺序执行下一条指令。 条件转移指令可分为三大类 (1)简单条件转移指令  将单个标志位的状态作为条件来判断,以决定是否转移。这种指令共有5对,分别对5个标志位CF、ZF、SF、OF、PF的两种状态进行判断。  指令  转移条件  含义  JC  CF=1   有进位转移、有借位转移  JNC  CF=0   无进位注意、无借位转移  JE/JE  ZF=1   相等转移、等于0转移  JNE/JNZ ZF=0   不相等转移、不等于0转移  JS  SF=1   是负数转移  JNS  SF=0   是正数转移  JO  OF=1   有溢出转移  JNO  OF=0   无溢出转移  JP/JPE  PE=1   有偶数个‘1’转移  JNP/JPO PF=0   有奇数个‘1’转移 (2)无符号数条件转移指令  这组指令常用于判断两个无符号数的大小,其判断条件是CF、ZF状态的组合。  指令  转移条件  含义  JA/JNBE  CF=0 AND ZF=0  A>B  JAE/JNB CF=0 OR ZF=1  A>=B  JB/JNAE CF=1 AND ZF=0  A<B  JBE/JNA CF=1 OR ZF=1  A<=B (3)带符号数条件转移指令  这组指令常用于判断两个有符号数的大小,其判断条件是SF、OF、ZF状态的组合。  指令  转移条件  含义  JG/GNLE SF=OF AND ZF=0 A>B  JGE/JNL SF=OF OR ZF=1  A>=B  JL/JNGE SF=/=OF AND ZF=0 A<B  JLE/JNG SF=/=OF OR ZF=1 A<B

    (三)循环控制指令。循环控制指令属于转移类指令,其主要功能类似于条件转移指令,这组指令有三条,均为两字节指令,并使用CX作循环次数计数器。执行的操作是: 1)CX<--(CX)-1 2)循环控制条件满足时,则IP<--(IP)+RD,否则,顺序执行。1、LOOP指令 指令格式 LOOP 目标地址 执行步骤是: 1)CX<--(CX)-1 2)若(CX)=/=0,则转移到标号代表的指令地址,否则,顺序执行。2、LOOPE/LOOPZ指令 指令格式:LOOPE 目标地址    LOOPZ 目标地址 1)CX<--(CX)-1 2)若(CX)=/=0且ZF=1,则转移到标号代表的指令地址,否则,顺序执行。  2、LOOPNE/LOOPNZ指令 指令格式:LOOPNE 目标地址    LOOPNZ 目标地址 1)CX<--(CX)-1 2)若(CX)=/=0且ZF=0,则转移到标号代表的指令地址,否则,顺序执行。  

    (四)子程序的定义 过程定义伪指令语句格式为: 过程名 PROC NEAR/FAR  .  .  RET  .  . 过程名 ENDP 过程必须设置在一个代码段内。NEAR为默认属性,只能段内使用。 1、调用指令  段内直接调用   指令格式:CALL 过程名/子程序名   返回地址的偏移量压栈(IP)-->栈顶字单元   形成子程序入口地址-->IP   段内间接调用   子程序的入口地址放在16位通用寄存器或存储单元中  段间直接调用  段间间接调用 2、返回指令  段内返回 指令格式:RET 机器指令编码:C3H 功能:(栈顶字单元)-->IP (SP)+2-->SP  段间返回 指令格式:RET 机器指令编码:CBH 功能:返回地址偏移量-->IP 返回地址段基值-->CS  带参数的返回指令 指令格式:RET n;返回地址偏移量-->IP,(SP)+2-->SP (SP)+n-->SP  

    DOS功能子程序的调用 调用时需要使用软件中断指令: INT  n n为中断类型码,值为00H~0FFH 执行的操作 将FR内容,返回地址(CS和IP) 压入堆栈 按类型码n,从中断向量表中取出功能子程序入口地址-->CS:IP  都是使用INT 21H来调用的,所以先要将类型码放入AH

    1、带显示的键盘输入(1号功能),显示输入的一个字符,到AL寄存器调用格式: MOV AH,01H INT 21H   用CTRL+C 来中断输入

    2、不显示的键盘输入(7号、8号功能),输入一个字符,到AL寄存器调用格式 MOV AH,07H/08H  INT 21H3、字符串输入(0AH号功能),用DS:DX来确定缓存区的首址。 缓存区设置:第一字节:缓存区的最大长度,不能超过255,输入结尾符是回车键,也要包涵在内      第二字节:缓存区的现有长度      第三字节开始:存放数据  例:  CHAR_BUF DB 30H  DB 0  DB 30H DUP(0)4、单字符显示(2H号功能),显示DL中的数据5、字符打印(5H号功能),将DL中的数据送到打印机的接口6、字符串显示(9H号功能),字符串必须以‘$’结尾,用DS:DX来确定缓存区的首址。


    最新回复(0)