汇编记录笔记

8086/8088CPU

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 标志寄存器

标志寄存器FR
FR用来记录程序执行时的状态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,BX
2、立即数寻址。指令所需的操作数直接在指令代码中,随着取指令一起取到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的是根据位移量和基址所得的物理地址上的数据。
 如果为给出段基址的则默认使用DS
4、寄存器间接寻址。指令所需的操作数在存储器中,操作数的有效地址EA直接从SI/DI/BX/BP中获得。
 如以SI/DI/BX间接寻址时,隐含使用DS;
 如以BP间接寻址时,隐含使用SS;
 例:
  MOV CH,[SI]
  MOV [DI],AX
  MOV AL,[BX]
  MOV [BP],DX
5、变址寻址。指令所需的操作数在存储器中,操作数的有效地址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 21H
3、字符串输入(0AH号功能),用DS:DX来确定缓存区的首址。
 缓存区设置:第一字节:缓存区的最大长度,不能超过255,输入结尾符是回车键,也要包涵在内
      第二字节:缓存区的现有长度
      第三字节开始:存放数据
 例:
  CHAR_BUF DB 30H
  DB 0
  DB 30H DUP(0)
4、单字符显示(2H号功能),显示DL中的数据
5、字符打印(5H号功能),将DL中的数据送到打印机的接口
6、字符串显示(9H号功能),字符串必须以‘$’结尾,用DS:DX来确定缓存区的首址。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值