针中后2个字节(段地址)传送到ES段寄存器,而不是DS段寄存器。 3)标志位传送指令
用于传送标志位,共有4条。 (1) LAHF指令功能:将标志寄存器F的低字节(共包含5个状态标志位)传送到AH寄存器中,双操作数,固定寻址,所以被隐藏。
(2)SAHF指令功能:将AH寄存器内容传送到标志寄存器F的低字节。
(3)PUSHF指令功能:将16位标志寄存器F内容入栈保护。其操作过程与前述的PUSH指令类似。
(4)POPF指令功能:将当前栈顶和次栈顶中的数据字弹出送回到标志寄存器F中。 4)I/O数据传送指令 (1)IN累加器,端口号
端口号可以用8位立即数直接给出;也可以将端口号事先安排在DX寄存器中,间接寻址16位长端口号(可寻址的端口号为0~65535)。IN指令是将指定端口中的内容输入到累加器AL/AX中。
(2)OUT 端口号,累加器
与IN指令相同,端口号可以由8位立即数给出,也可由DX寄存器间接给出。OUT指令是将累加器AL/AX中的内容输出到指定的端口。
OUT PORT,AL ;端口PORT←AL,即将AL中的字节内容输出到由PORT直接指定的端口。PORT:符号地址,表示端口直接地址。
OUT DX,AX ;端口(DX)←AX,即将AX中的字内容输出到由DX所指定的端口。
I/O指令只能用累加器作为执行I/O数据传送的机构,直接寻址范围为0~255,寻址大于255的端口地址时,必须用间接寻址的I/O指令。例如,在IBM PC/XT微机系统中,既用了0~255范围的端口地址,也用了255~65535范围的端口地址。 2.算术运算指令 1)加法指令
(1) ADD d,s ;d←d+s
指令功能:将源操作数与目标操作数相加,结果保留在目标中。并根据结果置标志位。 源操作数可以是8/16位通用寄存器、存储器操作数或立即数;目标操作数不允许是立即数,其他同源操作数。且不允许两者同时为存储器操作数。 (2)ADC d,s;d←d+s+CF
带进位加法(ADC)指令的操作过程与ADD指令基本相同,惟一的不同是进位标志位CF的原状态也将一起参与加法运算,待运算结束,CF将重新根据结果置成新的状态。 ADC指令一般用于16位以上的多字节数字相加的软件中。 (3)INC d;d←d+1
指令功能:将目标操作数当作无符号数,完成加1操作后,结果仍保留在目标中。 目标操作数可以是8/16位通用寄存器或存储器操作数,但不允许是立即数。 2)减法指令
(1)SUB d,s;d←d-s
指令功能:将目标操作数减去源操作数,其结果送回目标,并根据运算结果置标志位。 (2)SBB d,s;d←d-s-CF 本指令与SUB指令的功能、执行过程基本相同,唯一不同的是完成减法运算时还要再减去进位标志CF的原状态。运算结束时,CF将被置成新状态。 (3)DEC d; d←d-1
减1指令功能:将目标操作数的内容减1后送回目标。
11
目标操作数可以是8/16位通用寄存器和存储器操作数,但不允许是立即数。 (4)NEG d; d←d+1
NEG是求补码的指令,简称求补指令。指令功能:将目标操作数取负后送回目标。 (5)CMP d,s;d-s,只置标志位
指令功能:将目标操作数与源操作数相减但不送回结果,只根据运算结果置标志位。 不允许两个操作数同时为存储器操作数,也不允许做段寄存器比较。 3)乘法指令
乘法指令用来实现两个二进制操作数的相乘运算,包括两条指令:无符号数乘法指令MUL和有符号数乘法指令IMUL。 (1) MUL s MUL s是无符号乘法指令,被乘数(目的操作数)隐含在累加器AL/AX中;由s指定的源操作数作乘数,相乘所得双倍位长的积,分别存放到DX与AX中。 (2)IMUL s有符号乘法指令 4)除法指令
除数、商:8位,被除数可以是16位,目的操作数被隐含。 (1) DIV sDIV s
被除数隐含在累加器AX(字节除)或DX、AX(字除)中。指令中由s给出的源操作数作除数。 字节除法,商存于AL,余数存于AH。 字除法,商存于AX,余数存于DX。
(2) IDIV s该指令完成将两个带符号的二进制数相除的功能。 (3) CBW和CWD
5)十进制调整指令 (1) DAA
DAA是加法的十进制调整指令,它必须跟在ADD或ADC指令之后使用。
功能:将存于AL(目的操作数)寄存器中的2位BCD码加法运算的结果调整为2位压缩型十进制数,仍保留在AL中。
AL寄存器中的运算结果在出现非法码(1010B~1111B)或本位向高位(指BCD码)有进位(由AF=1或CF=1表示低位向高位或高位向更高位有进位)时,由DAA自动进行加6调整。AF标志寄存器可知进位。
(2) DAS减法的十进制调整指令,减6调整 (3) AAA加法的ASCII码调整指令 (4) AAS减法的ASCII码调整指令 (5) AAM乘法的ASCII码调整指令 (6)AAD除法的ASCII码调整指令。
3.逻辑运算和移位循环类指令:分为3种类型:逻辑运算;移位;循环 1)逻辑运算指令
(1)AND d,s;d←d∧s,按位“与”操作,有一个是0,结果是0。
(2) OR d,s;d←d∨s,按位“或”操作,有一个是1,结果是1。 (3) XOR d,s;d←d⊕ s,按位“异或”操作,不同,相同0。
(4) NOT d;d← d ,按位取反操作。 (5) TEST d,s;d∧s,按位“与”操作,
12
不送回结果,测试指令,影响标志位。 2)移位指令与循环移位指令
移位指令分为算术移位和逻辑移位。
循环移位分为不带进位位(小循环)与带进位位循环移位(大循环) 4.串操作类指令
(1)指令使用规则::串操作类指令是惟一地在存储器内的源与目标之间进行操作的指令,即源操作数与目标操作数都可以是存储器操作数。 (2)源操作数地址:DS(段寄存器)、IS(源变址寄存器) (3)目标操作数地址:ES(段寄存器)、DI(目标变址寄存器) (4)串长度存放在CS寄存器中 (5)采用隐含寻址方式。
(6)地址变化方向——方向标志位DF,DF=0,用指令CLD实现,地址指针增1或2; DF=1,用指令STD实现,地址指针减1或2。
(7)串指令功能:执行指令规定操作,然后SI和DI自动修改+-1(字符串)或+-2(字)。 (8)重复指令功能:添加重复前缀REP等,指令实现自动循环,自动修改循环计数计功能,并判断0
(9)循环计数计——使用CX 5种基本的串操作指令: 1) MOVS目标串,源串 2)CMPS目标串,源串 3)SCAS目标串 4) LODS源串 5) STOS目标串
5.程序(转移)控制指令 1)无条件转移指令 (1)JMP 目标标号
根据目标地址的位置与寻址方式的不同,JMP指令有4种基本格式。 ① 段内直接转移
操作数:目标地址的偏移量,偏移量是8位(短转移)或16位(近转移)的带符号数。 目标标号偏移地址=(IP)+指令中位移量 有条件转移只能用短转移。 段内短转移:位移量1个字节 段内近转移:位移量2个字节 ②段内间接转移
操作数:目标地址的偏移地址,寄存器间接寻址 目标标号偏移地址=操作数-(IP) 目标段=源段=CS SHORT段内短转移 NIAR段内近转移 ③段间直接转移
新的段地址:CS,新的偏移地址:IP,操作数:目标地址的逻辑地址。 目标地址的段地址和偏移地址存放于存储器的4个连续地址中
低字位:IP,高字位:CS,操作数是双字的存储器地址用DWORD PTR表示。 (2) CALL 过程名
13
无条件调用过程指令。“过程”即“子程序”。子程序名即子程序入口地址,子程序段第一条指令的地址,用符号表示。
CALL指令将迫使CPU暂停执行调用程序(或称为主程序)后续的下一条指令(即断点,用堆栈保存),转去执行指定的过程;待过程执行完毕,再用返回指令RET将程序返回到断点处继续执行。
RET:识别程序终点。
CALL指令4种不同的寻址方式和4种基本格式: ① CALL N_PROC
N_PROC是一个近过程名,采用段内直接寻址方式。 ②CALL BX段内间接寻址的调用过程指令 ③CALL F_PROC
F_PROC是一个远过程名,它可以采用段间直接和段间间接两种寻址方式来实现调用过程。 ④RET 弹出值:从过程返回(RET)指令应安排在过程的出口,即过程的最后一条指令处。 2)条件转移指令
条件转移指令共有18条,标志寄存器的标志位(9个,用6个状态)作为转移的条件。 所有的条件转移指令都是短转移,目标地址(8位)的字节距离在-128~+127范围以内。 一个标志位的状态或几个标志的状态组合作为测试的条件。
另外的一种替换形式,功能等效。 3)循环控制指令:CX中存放着循环次数,短转移
(1)LOOP 目标标号
(2)LOOPE/LOOPZ 目标标号 (3)LOOPNE/LOOPNZ 目标标号 (4)JCXZ 目标标号
6.中断指令,中断指令只有3条。
(1)INT 中断类型,8086/8088系统中允许有256种中断类型(0~255) (2)INTO (3)IRET
7.处理器控制类指令,处理器控制指令只完成对CPU的简单控制功能。 1) 对标志位操作指令
(1) CLC、STC、CMC指令用来对进位标志CF清“0”、置 “1”和取反操作。 2) 同步控制指令:多处理器系统 (1) ESC外部操作码,源操作数 (2) WAIT (3) LOCK
3)其他控制指令
(1) HLT 暂停指令,当CPU发生复位或来自外部的中断时,CPU脱离暂停状态。 (2) NOP 空操作指令,占用3个时钟周期的时间(IP+1),常用来作延时。 五、8086编程基础
汇编语言是用指令的助记符、符号地址、标号等书写程序的语言,简称符号语言。
14
1.汇编语言格式 (1)指令分类
汇编语言有3种基本语句:指令语句、伪指令语句、宏指令语句 。
指令语句是一种执行性语句,它在汇编时,汇编程序将为之产生一一对应的机器目标代码。 伪指令语句是一种说明性语句,它在汇编时只为汇编程序提供进行汇编所需要的有关信息,如定义符号,分配存储单元,初始化存储器等,而本身并不代表生成目标代码。不执行,翻译时用。
宏指令语句是以某个宏名字定义的一段指令序列。宏指令可以有多段,子程序有一段。 (2)语句格式 1)指令语句格式
[标号:][前缀] 指令助记符 [操作数表] [;注释] 2)伪指令语句的格式
[名字]伪指令[参数表][;注释] (3)汇编语言的语法
段定义伪指令指示汇编程序应如何按段来组织程序和使用存储器。 汇编程序3种设计结构:顺序结构、分支结构、循环结构。 2.汇编语言编程运行环境 第五章 计算机存储器 一、存储器的结构 1.基本概念
① 位 (bit):信息量单位,每一个0或1就叫做1位信息。 ② 字节 (byte):存储量单位,8位二进制代码作为一个字节。 ③ 字 (word):2个字节组成一个字,标识16位数据的长度。 ④ 字长:计算机一次处理数据的位数(存储器,寄存器)。字长是随计算机发展变化的(8086型字长=16位)。
⑤地址:每个单元的编号,各存储单元的地址与该地址中存放的内容完全不同。 物理地址(20位,220=1024K=1M)=段地址*10H+偏移地址 逻辑地址(16位,216=64K)=段地址(16位):偏移地址(16位) ⑥ 存储单元:每个单元存储8位二进制信息,即字长为8位。 ⑦字地址:低地址单元的地址作为低地址,偶数。 ⑧段:分段方法:段起始地址(段基址),段长简化问题。 2.8086存储器管理方式
1)存储器信息分类管理:程序信息,数据信息,保护(堆栈)信息。
2)存储器空间分段使用:将内存空间分成若干个逻辑段使用,每个逻辑段存放一种信息,每个段称逻辑段,当前正在使用的逻辑段称作当前段。
逻辑信息按照存放信息的类别分为:代码(程序)段,堆栈段,数据段,附加段。 逻辑段:逻辑段长度=后起始地址-前起始地址,一类信息可以使用1个至多个逻辑段。 地址指针:程序指针:CS:IP,堆栈指针:SS:SP,数据指针:DS或ES:EA(有效地址) 段地址来源于4个段寄存器,偏移地址来源于IP、SP、EA(由BP、SI、DI计算)。 段地址默认时,偏移地址称作逻辑地址。 3.8086存储器堆栈技术
1.堆栈的定义:在存储器设置专用区(堆栈段),临时存放需要保护的信息。
15