Upload
conan-keith
View
44
Download
7
Embed Size (px)
DESCRIPTION
微机原理及接口技术. 主编 梁建武. 中国水利水电出版社. 3.1 汇编语言程序设计基础. 以助记符形式表示计算机指令 助记符( mnemonic )是便于人们记忆、并能描述指令功能和指令操作数的符号 助记符是表明指令功能的英语单词或其缩写 汇编格式指令以及使用它们编写程序的规则就形成汇编语言( Assembly Language ) 汇编语言程序:用汇编语言书写的程序 汇编程序:将汇编语言程序“汇编”成机器代码目标模块的程序. 3.1.1 汇编语言特点. 汇编语言的优点: 直接控制计算机硬件部件 编写“时间”和“空间”两方面最有效程序 汇编语言的缺点: - PowerPoint PPT Presentation
Citation preview
微机原理及接口技术
主编 梁建武
中国水利水电出版社
3.1 汇编语言程序设计基础
以助记符形式表示计算机指令 助记符( mnemonic )是便于人们记忆、并能描述指
令功能和指令操作数的符号 助记符是表明指令功能的英语单词或其缩写
汇编格式指令以及使用它们编写程序的规则就 形 成 汇 编 语 言 ( Assembly Language )
汇编语言程序:用汇编语言书写的程序 汇编程序:将汇编语言程序“汇编”成机器
代码目标模块的程序
3.1.1 汇编语言特点
汇编语言的优点: 直接控制计算机硬件部件 编写“时间”和“空间”两方面最有效程序
汇编语言的缺点: 与处理器密切有关 需要熟悉计算机硬件系统、考虑许多细节 编写繁琐,调试、维护、交流和移植困难
3.1.2 8086 指令系统概述
Intel 8086 指令系统共有 117 条基本指令 可分成 6 个功能组
数据传送类指令 算术运算类指令 位操作类指令 串操作类指令 控制转移类指令 处理机控制类指令
由 4 部分组成:
标号 :-- 标号表示该指令在主存中的逻辑地址
指令助记符 -- 代表一种指令
目的操作数,源操作数 -- 表示参与操作的对象
; 注释 -- 对该指令或程序段功能的说明
3.1.2 8086 指令系统概述
1. 数据传送类指令 数据传送指令是将源操作数传送到目标操作
数,即将数据、地址或立即数从一个位置传送到存储单元中。数据传送指令是最常使用的一类指令
除标志寄存器传送指令外,均不影响标志位 指 令 包 括 :
MOV , PUSH , POP , XCHG , LEA
, LDS/LES , XLAT , IN , OUT
(1) 传送指令 MOV
MOV reg/mem,imm 立即数送寄存器或主存
MOV reg/mem/seg,reg 寄存器送(段)寄存器或主存
MOV reg/seg,mem 主存送(段)寄存器
MOV reg/mem,seg 段寄存器送寄存器或主存 举例
演示演示
立即数
段寄存器CS DS ES SS
通用寄存器AX BX CX DXBP SP SI DI
存储器
MOV 举例
例: MOV 数据传送 MOV AL, 20H MOV AH, AL MOV SI, 200H MOV AX, [BX] MOV [DI], AX MOV AX, DS MOV ES, AX MOV BYTE PTR [SI],0AH Mov WORD PTR [SI+2],0BH
注意: 立即数、代码段寄存器 CS 只能作源操作数。 IP 寄存器不能作源操作数或目的操作数。 MOV 指令不能在两个存储器单元直接传送数据,
也不能在两个算寄存器之间直接传送数据。 两个操作数的类型属性要一致。
下列指令是非法的:MOV AX,BL ; 类型不一致MOV CS,AX ;CS 不能作目的操作数
(2) 堆栈指令 PUSH POP
堆 栈 : 后 进 先 出FILO , 位 于 堆 栈段; SS 段寄存器记录其段地址
堆栈只有一个出口,即当前栈顶;用堆栈指 针 寄 存 器 SP 指定,堆栈指针寄存器SP 的初值决定了所用堆栈的大小。
PUSH 格式: PUSH src ; src 是源操作数 操作: SP←SP - 2 , SS:[SP]←src ,将堆
栈指针 SP 减 2 ,再将 src 压入堆栈顶部, src为 16 位操作数
例: PUSH AX ; 将 AX 内容压入堆栈 ;(SP) - 1←AH, 高地址存入高字节 ; (SP) - 2←AL, 低地址存入低字节 ; (SP)←(SP) - 2 , SP 指向新栈顶由于堆栈操作都是以字为单位进行的,所以 SP 总是指向偶地址单元。
PUSH 压入堆栈指令
POP 格式: POP dest 操作: dest←SS:[SP] , SP←SP + 2 ,将
栈顶的一个字弹出传送到 dest ,再将 SP 加2 ,将 SP 指向新的栈顶, dest 的寻址方式是除立即寻址之外的所有存储器寻址方式和寄存器寻址方式。
例: POP BX ; 将栈顶内容弹出到 BX
; ( BL )←( SP ),低地址弹出到低字节 ; ( BH )←( SP )+ 1 ,高地址弹出到高字节 ; ( SP )←( SP )+ 2 , SP 指向新栈顶
POP 弹出堆栈指令
(3) 交换指令 XCHG把两个地方的数据进行互换。 格式为: XCHG OPR1 , OPR2 执行操作:( OPR1 ) < - > ( OPR2 ) 其中 OPR 表示操作数。指令允许字或字节操作, 386 及其后继机型还允许双字
操作。
XCHG 指令形式 XCHG reg , reg/mem ; reg <——> reg/mem 寄存器与寄存器之间对换数据。 寄存器与存储器之间对换数据。 不能在存储器与存储器之间对换数据。 不允许使用段寄存器,立即数不能作为一个操作数,不能在累加器之间进行。
(3) 交换指令 XCHG 举例 例:
MOV BX, 0ABCDH MOV AX,0ABCDH XCHG AX, BX ;AX 与 BX 交换内容, ; 结果: AX = 0ABCDH ;BX = 3412H
XCHG BX , [BP + SI] 如指令执行前: ( BX )= 6F30H ,( BP )= 0200H ,( SI )=0046H ,( SS )= 2F00H ,( 2F246H )=4154H OPR2 的物理地址= 2F000 + 0200 + 0046 =2F246 则指令执行后: ( BX )= 4145H ( 2F246H )= 6F30H
地址传送指令
(4) 有效地址传送指令 LEA
格式: LEA reg , mem操作 :(reg)←mem ,将指定内存单元的偏移(有效地址)送到指定寄存器。
LEA BX,BUFFER ;将符号地址为 BUFFER 的存储单元 ;的偏移地址送到 BX 中MOV BX,BUFFER ;将 BUFFER 存储单元中的内容 ;传送到 BX 中MOV BX,OFFSET BUFFER ; OFFSET BUFFER 表示存储 ;单元 BUFFER 的偏移地址。
(4) 有效地址传送指令 LEA 举例
例: 设:( SI ) =2000H
LEA BX , [SI + 3412H]
执行指令结果将偏移地址 5412H 传送到 BX , 即 BX=5412H
(5) LDS/LES 指针传送指令
LDS r16,mem; r16←mem ,; DS←mem+2 LDS 指令将主存中
mem 指 定 的 字 送至 r16 , 并 将mem 的下一字送DS 寄存器
LES r16,mem; r16←mem ,; ES←mem+2 LES 指令将主存中
mem 指定的字送至 r16 , 并 将mem 的下一字送ES 寄存器
例 3.42 LES DI , [BX] 如指令执行前( DS )= B000H ,( BX )= 080AH ,( 0B080AH )= 05AEH ,( 0B080CH )= 4000H , 则指令执行后( DI )= 05AEH ,( ES )= 4000H 。 BX 默认段寄存器为 DS.
累加器专用传送指令 :IN(input) 输入OUT(output) 输出XLAT(translate) 换码这组指令只限于使用累加器 EAX,AX 或 AL 传送信息 .
(6)XLAT 换码指令
格式: XLAT 或 XLAT table操作: AL←[(BX)+(AL)] ,将 AL 中存放的代码转换为另一
种代码。XLAT 换码指令又称查表转换指令,它可以根据表项的序号查处表中对应代码的内容,是将 BX 指定的表格中的 AL 指定位
移处的数据取出赋给 AL 。在使用该指令前,需要在存储器中建
立一个要转换成的目的代码表格 table ,将表格的首地址 table
存放在 BX 寄存器,待转换代码存放在 AL 寄存器中,待转换代
码须为相对表格首地址的偏移量,通过( BX ) +(AL) 地址将读取
的代码存放到 AL 中,实现代码转换。 XLAT 换码指令默认存储
器为数据段 DS 。
例:
设 TABLE首地址为 2000H ,连续区域中存放着
数 字 0~9 对 应 的 格 雷 码 :18H,34H,05H,06H,
09H,0AH,0CH,11H,12H,14H,(DS)=0F000H,
执行如下程序段:LEA BX,TABLE ; 将 TABLE 的有效地址传送给
;BX,BX=2000HMOV AL,8XLAT ; 执行后 (AL)=12H
2. 输入输出指令
输入输出指令为 I/O 传送指令,实现 CPU 与 I/O端口之间的通信。 CPU 只限于用累加器 AL 或AX来传送信息。
8086 用于寻址外设端口的地址线为 16 条,端口最多为 216 = 65536 ( 64K )个,端口号为0000H~ FFFFH ,当端口号大于 256 时,须将端口先装到 DX 寄存器中,后使用输入输出指令来传送信息。
每个端口用于传送一个字节的外设数据
(1)IN 输入指令
将外设数据传送给 CPU 内的 AL/AX长格式为: IN AL , PORT (字节) ;PORT端口号 0~255 IN AX , PORT (字) 执行的操作: ( AL )←( PORT )(字节) ( AX )←( PORT + 1 , PORT )(字) 格式为: IN AL , DX (字节) ;DX 表示的端口范围达 64K IN AX , DX (字) 执行的操作: ( AL )←(( DX ))(字节) ( AX )←(( DX )+ 1 ,( DX ))(字)
例: IN AL, 80H
;(AL)←(80H 端口 ) ,从 80H 端口读入字节信息存放在 AL 寄存器
IN AX, DX (AX)←[(DX+1 , DX)] 从 DX 中装载的端
口读入字信息存放在 AX 寄存器
(1)IN 输入指令 举例
(2)OUT 输入指令 将 CPU 内的 AL/AX 数据传送给外设
OUT PORT , AL (字节) OUT PORT , AX (字) (PORT )←( AL )(字节) (PORT + 1 , PORT )←( AX )(字) 短格式为: OUT DX , AL (字节) OUT DX , AX (字) 执行的操作: (( DX ))←( AL )(字节) (( DX )+ 1 ,( DX ))←( AX )(字)
举例
(2)OUT 输入指令 举例 例: OUT 5 , AL 从 AL 寄存器输出一个字节到端口 5 。 又如: in al,21h mov ah,al in al,20h ;直接寻址,字节量输入 或 in ax,20h ;直接寻址,字量输入 或 mov dx,20h in ax,dx ;间接寻址,字量输入
3. 算术运算指令
四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算
请注意算术运算类指令对标志的影响 指 令 包 括 :
ADD 、 ADC 、 INC 、 DAA 、 AAA 、 SUB 、 SBB 、 DEC 、 CMP 、 NEG 、 AAS/DAS 、 MUL 、 IMUL 、 DIV 、 IDIV 、CBW 、 CWD 、
加法指令 :ADD 加法ADC 带进位加法INC 加 1
(1) 不带进位的加法指令 ADD
格式: ADD dest,src
操作:目的操作数←目的操作数 + 源操作数,dest ←(src)+(dest), 源操作数可以是立即数、寄存器或内存单元,目的操作数不可是立即数,只可以为寄存器或内存单元。源操作数和目的操作数不能同时为存储器,而且他们的类型必须一致,即同为字或字节。
(1) ADD 加法指令 举例 例:
ADD AL, 12H ;AL 中内容和 12H相加,结果放在 AL 中 ADD SI, [BX + 20H] ;SI 中内容和 BX + 20H
;BX + 21H 所指两存储单元内容相加,结果在 SI 中 ADD SI, CX ;SI 和 CX 内容相加,结果在 SI 中 ADD [BX + SI], AX ;BX + SI 和 BX + SI + 1 两单元内容与 AX 中内容相加
; 结果在 BX + SI , BX + SI + 1 所指单元中
ADD 指 令 对 6 个状态标 志 均产生影 响 , 主 要 是CF 、 ZF 、 OF 、 SF 标志位。带符号数相加要考虑溢出,从
硬件角度:默认参与运算的操作数都是有符号数,当两数的符号位相同,而和的结果相异时有溢出,则OF=1 ,否则 OF=0.
例 3-4
已 知 ( BX ) =D75FH , 指 令 ADD BX,8046H
执行后,标志状态各是多少? D75FH=1110 0111 0101 1111
8046H=1000 0000 0100 0110 0110 0111 1010 0101结果: CF=1 、 ZF=0 、 PF=0( 运算结果的低 8 位
中的“ 1” 的个数为偶数时 PF=1 ,为奇数时, PF=0 。 )
、 OF=1 、 SF=0
(2) ADC 带进位的加法 ADC 指令将源与目的操作数相加,再加上进位 CF 标志,结 果送到目的操作数。 格式: ADC DST , SRC 执行的操作:( DST )←( SRC )+( DST )+ CF 其中 CF 为进位位的值。 ADC 指令按状态标志的定义相应设置。 ADC 指令主要与 ADD配合,实现多精度加法运算。
(2) ADC 带进位的加法 举例
例: ADC AL, 34H ;AL←(AL) + 34H + (CF) ADC AX, CX ;AX←(AX) + (CX) + (CF) ADC BX , [DI] ;BX←(BX) + [DI + 1][DI] +
(CF)
如指令执行前:( DX ) =0002H ,( AX ) =0F365H ,( BX )=0005H ,( CX ) =0E024H 。 指令序列为:ADD AX , CX ;( AX ) =0D389H , SF=1 ,ZF=0 , CF=1 , OF=0ADC DX , BX ;( DX ) =0008H , SF=0 , ZF=0 , CF=0 , OF=0 ,结果正确。
(3) INC 加 1 指令
INC 指令对操作数加 1 (增量) INC 指令不影响进位 CF 标志,按定义设置
其他状态标志 INC reg/mem
; reg/mem←reg/mem + 1 例:
INC BX INC BYTE PTR [BX] BX 所指的字节单元 +1
减法指令
SUB(subtract) 减法SBB(subtract with borrow) 带借位
减法DEC(decrement) 减 1NEG(negate) 求补CMP(compare) 比较
(4) SUB 不考虑借位的减法指令
SUB 指令将目的操作数减去源操作数,结果送到目的操作数。 格式: SUB DST , SRC 执行的操作:( DST )←( DST )-( SRC ) SUB 指令按照定义相应设置状态标志。 SUB 减法指令形式 :SUB reg , imm/reg/mem ; reg←reg - imm/reg/memSUB mem , imm/reg ; mem←mem -imm/reg
(4) SUB 不考虑借位的减法指令 举例
例: SUB AH, 0F0H
;AH ← (AH) - 0F0H
SUB [BX + 20H], DX
;[BX + 20H] ← ([BX + 20H]) - (DX )
SUB AX, CX
例 : SUB [SI+14H] , 0136H 如指令执行前( DS ) =3000H ,( SI ) =0040H ,( 30054H ) =4336H , 则指令执行后:( 30054H ) =4200H , SF=0 , ZF=0 , CF=0 , OF=0例 : SUB DH , [BP+4] 如指令执行前( DH ) =41H ,( SS ) =0000H ,( BP ) =00E4H ,( 00E8H ) =5AH 则指令执行后:( DH ) =0E7H , SF=1 , ZF=0 , CF=1 , OF=0
(5) SBB 考虑借位的减法指令
SBB 指 令将 目 的操作数减去源操作数,再减去借位CF (进位),结果送到目的操作数。
格式: SBB DST , SRC执行的操作:( DST )←( DST )-( SRC )- CFSBB 指令按照定义相应设置状态标志
SBB 指令主要与 SUB配合,实现多精度减法运算 SBB 指令形式 : SBB reg,imm/reg/mem
; reg←reg - imm/reg/mem - CF SBB mem,imm/reg
; mem←mem - imm/reg - CF
(5) SBB 考虑借位的减法指令 举例
例: MOV AX, 5678H
MOV DX, 1234H
SUB AX, 6789H ;CF = 1
SBB DX, 1122H ;DX = 0111H
(6) DEC 减 1 指令
DEC 指令对操作数减 1 (减量) 格式: DEC OPR
执行的操作:( OPR )←( OPR )- 1
DEC 指令不影响进位 CF 标志,按定义设置其他状态标志 DEC 减 1 指令形式 :
DEC reg/mem
; reg/mem←reg/mem - 1
(7) CMP 比较指令CMP 指令将目的操作数减去源操作数,按照定义相应设置状态标志格式 :CMP OPR1,OPR2执行的操作:( OPR1 )-( OPR2 ) CMP 指令执行的功能与 SUB 指令相同,但结果不回送目的操作数CMP比较指令形式 CMP reg , imm/reg/mem ; reg - imm/reg/mem
CMP mem , imm/reg ; mem - imm/reg
执行比较指令之后,可以根据标志判断两个数是否相等、大小关系等。
(7) CMP 比较指令 举例
例: CMP AL, 0AH
CMP CX, DI
CMP DI, [BX + 03]
(7) NEG 求补指令 NEG 指令对操作数执行求补运算:用零减去操作数,然后结果返回操作
数 格式: NEG OPR 执行的操作:( OPR )←-( OPR ) 求补运算也可以表达成:将操作数按位取反后加 1 NEG 指令对标志的影响与用零作减法的 SUB 指令一样 NEG reg/mem ; reg/mem←0 - reg/mem
(8) 乘法指令
MUL r8/m8;无符号字节乘法; AX←AL×r8/m8
MUL r16/m16;无符号字乘法; DX.AX←AX×r16/
m16
IMUL r8/m8;有符号字节乘法; AX←AL×r8/m8
IMUL r16/m16;有符号字乘法; DX.AX←AX×r16/
m16
( 1 )无符号数乘法指令 MUL
格式: MUL SRC 执行的操作: 字节操作数: ( AX )← AL*SRC 字操作数: ( DX , AX )← AX*SRC功能:完成字节与字节相乘、字与字想乘,且默认的操作数放在 AL 或 AX
中,而源操作数由指令给出。 8 位数相乘,结果为 16 位数,放在 AX 中; 16 位
数相乘,结果为 32 位数,高 16 位放在 DX 中,低 16 位放在 AX 中。注意:源
操作数不能为立即数。
( 2 ) IMUL 带符号数乘法
格式: IMUL SRC 执行的操作: 字节操作数: ( AX )← AL*SRC 字操作数: ( DX , AX )← AX*SRC
MUL 指令——若乘积的高一半( AH 、 DX )为 0 ,则OF=CF=0 ;否则 OF=CF=1 。
IMUL 指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0 ;否则均为 1 。
乘法指令对其他状态标志没有定义。 对标志没有定义:指令执行后,这些标志是任意的、不可预测(就是谁也不知道是 0 还是 1 )。
对标志没有影响:指令执行不改变标志状态。在乘法指令中,目的操作数必须是累加器,字运算为 AX ,字节运算为
AL,指令中的操作数可以使用除立即数方式以外的任何一种寻址方式。乘法指令对除 CF 和 OF 位以外的条件码位无定义。
(8) 乘法指令 举例
例 1 : 2AH × 3EH MOV AL, 2AH MOV BL, 3EH MUL BL ;AX=0A2CH , OF = CF = 1 ;AX 高 8 位含有有效数值例 2 0B4H × 011H MOV AL, 0B4H MOV BL, 11H IMUL BL ;AX = OBF4H=-1292 , OF = CF = 1 ;AX 高 8 位含有有效数值,非符号扩展
指令解说: MOV AL , 0B4H ;( AL ) =B4H MOV BL , 11H ;( BL ) =11H两条指令执行之后, AL 中的值是: 0xB4 , BL 中的值是: 0x11 ,当执行 IMUL 指令时,在处理数据前, CPU首先会查看两个寄存器的符号位, AL 的二进制形式是 ( AL=10110100 ) , BL 的二进制形式是 (BL=00010001 ) ,显然,是一正一负,结果肯定为负, CPU 将其记录下来,然后进行正常的补码运算,处理方法是,将补码转换成原码绝对值,计算得出结果,在转换成处理器所识别的补码形式:
AL 是负数,所以原码 =补码末尾减 1 ,其余全部取反 。 AL=10110100 末尾减 1 是 10110011 全部取反,得到原码绝
对值 01001100 ( 0x4B ) BL 是正数,正数的原码是什么?正数原码补码都是一样的,所以 BL
的补码形式还是 00010001 ( 0x11 ) AL * BL = 0x4B * 0x11 = 0x050B ( 有 IMUL 指 令 说 明 可知,结果保存扩展到 16 位,然后保存到 AX 寄存器中 )
现在我们得到了原码相乘的运算结果(注意,是绝对值), 0x050B 转换成二进制就是 0000 0101 0000 1100
0000 0101 0000 1100 为此时 AX 的原码绝对值,转换成补码的形式就是,全部取反得 : 1111 1010 1111 0011 ,再末尾加1 得到
1111 1010 1111 0100 也就是十六进制的 FAF4 ,保存到 AX寄存器中就是
AX = 0FAF4
除法指令DIV ( unsigned divide )无符号数除法 IDIV ( signed divide )带符号数除法 除法指令的功能
除法指令分无符号和有符号除法指令。 除法指令的除数显式给出,隐含使用另一个操作数 AX 、 DX 。
字节除法: AX 除以 r8/m8 , 8 位商存入 AL , 8 位余数存入 AH 。 字除法: DX.AX 除以 r16/m16 , 16 位商存入 AX , 16 位余数存入 DX 。
除法指令对标志没有定义。 除法指令会产生结果溢出,即除法中断错:当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器 AL/AX 不能表达,便产生溢出, 8086CPU 中就产生编号为 0 的内部中断——除法错中断。 对 DIV 指令,除数为 0 ,或者在字节除时商超过 8 位,或者在字除时商超过 16位。 对 IDIV 指令,除数为 0 ,或者在字节除时商不在 -128~ 127范围内,或者在字除时商不在 -32768~ 32767范围内则发生除法溢出。
除法指令 格式: DIV SRC
执行的操作: 字节操作:( AL )←( AX ) / ( SRC )的商 ( AH )←( AX ) / ( SRC )的余数 字操作: ( AX )←( DX.AX ) / ( SRC )的商 ( DX )←( DX.AX ) / ( SRC )的余数
商和余数均为无符号数。 DIV 除法指令形式 DIV r8/m8 ; al←ax÷r8/m8 的商, ; ah←ax÷r8/m8 的余数 DIV r16/m16 ; ax←dx.ax÷r16/m16 的商, ; dx←dx.ax÷r16/m16 的余数
IDIV 带符号数除法
格式: IDIV SRC 执行的操作: 字节操作: ( AL )←( AX ) / ( SRC )的商 ( AH )←( AX ) / ( SRC )的余数 字操作: ( AX )←( DX.AX ) / ( SRC )的商 ( DX )←( DX.AX ) / ( SRC )的余数 操作数必须时带符号数;商和余数均为带符号数;且余数的符号和被除数的符号相同。
例 : 设( AX ) =0400H ,( BL ) =0B4H 即 ( AX )为无符号数的 1024D ,带符号数的+ 1024D ( BL )为无符号数的 180D ,带符号数的- 76D 执行 DIV BL 的结果是: ( AH ) =7CH=124D 余数 ( AL ) =05H=5D 商 IDIV BL 的结果是: ( AH ) =24H=36D 余数 ( 与被除数符号相同 ) ( AL ) =0F3H= - 13D 商
(10) 其它算术指令CBW
; AL 的符号扩展至 AH;如 AL 的最高有效位是 0 ,则 AH = 00; AL 的最高有效位为 1 ,则 AH = FFH 。 AL
不变CWD; AX 的符号扩展至DX;如 AX 的最高有效位是 0 ,则 DX = 00; AX 的最高有效位为 1 ,则 DX = FFFFH 。 AX
不变
(10) 其它算术指令 举例
例: MOV AL, 0ABH
CBW
;AX = 0FFABH
MOV AX, 1234H
CWD ;DX = 0000H , AX = 1234H
例 3-6 计算:( V -( X*Y+Z - 540 )) /X 其中 X , Y , Z , V 均为 16 位带符号数,已分别装入 X , Y , Z , V 单元中,要求上式计算结果的商存入 AX ,余数存入 DX 寄存器。 编制程序如下: mov ax , x ; 取乘数 X 到 AX imul y ; 做 X*Y, 结果存 DX,AX mov cx , ax ; 保存结果低 16 位到 cx 中 mov bx , dx ; 保存结果高 16 位到 cx 中 mov ax , z ; 取 Z 到 AX cwd ; 把 Z 变成 32 位 , 因为现在是 32 位运算 add cx , ax ;X*Y 的低 16 位加上 Z 的低 16 位 , 放在 cx 中 adc bx , dx ;X*Y 的高 16 位加上 Z 的高 16 位加低位的进位 , 放在bx 中 sub cx , 540 sbb bx , 0 mov ax , v cwd sub ax , cx sbb dx , bx idiv x
4. 位操作指令
位操作类指令以二进制位为基本单位进行数据的操作
这是一类常用的指令,都应该掌握 注意这些指令对标志位的影响
逻辑运算指令 AND OR XOR NOT TEST
移位指令 SHL SHR SAR ROL ROR RCL RCR
(1) AND 逻辑“与”指令对两个操作数执行逻辑与运算,结果送到目的操作数。 格式: AND DST , SRC 执行的操作:( DST )←( DST )∧( SRC ) AND 指令设置 CF = OF = 0 ,根据结果设置 SF 、 ZF 和 PF状态,而对 AF未定义。 AND 指令可用于屏蔽某些位(同 0相与),不影响其他位。 AND 逻辑与指令形式 AND reg , imm/reg/mem ; reg←reg∧imm/reg/mem AND mem , imm/reg ; mem←mem∧imm/reg
例: AND AL, 10010011 ; 将 AL 中的第 0 、 1 、 4 、 7 位保留,其他位清零
(2) OR 逻辑“或”指令对两个操作数执行逻辑或运算,结果送到目的操作数。 格式: OR DST , SRC 执行的操作:( DST )←( DST )∨( SRC )
OR 指令设置 CF = OF = 0 ,根据结果设置 SF 、 ZF 和 PF状态,而对 AF未定义。 OR 指令可用于置位某些位(同 1相或),不影响其他位。
OR 逻辑或指令格式 OR reg , imm/reg/mem ; reg←reg∨imm/reg/mem OR mem , imm/reg ; mem←mem∨imm/reg
例: OR BL, 0F0H ; 将 BL 的高 4 为置 1 ,其他位不变
(3)XOR 逻辑“异或”指令对两个操作数执行逻辑异或运算,结果送到目的操作数。 格式: XOR DST , SRC (相同为 0 ,不同为 1 ) 执行的操作:( DST )←( DST ) ⊕ ( SRC )
XOR 指令设置 CF = OF = 0 ,根据结果设置 SF 、 ZF 和 PF状态,而对 AF未定义。 XOR 指令可用于求反某些位(与 1相异或),不影响其他位。 XOR异或指令形式 XOR reg , imm/reg/mem ; reg←reg ⊕ imm/reg/mem XOR mem , imm/reg ; mem←mem ⊕ imm/reg 例: XOR AL, 0A5H ; 将 AL 的第 0 、 2 、 5 和 7 位取反,其他位不变
(4) TEST 测试指令对两个操作数执行逻辑与运算,结果不回送到目的操作数。 格式: TEST OPR1 , OPR2 执行的操作:( OPR1 )∧( OPR2 )
TEST 指令设置 CF = OF = 0 ,根据结果设置 SF 、 ZF 和 PF状态,而对 AF未定义。 TEST 指令通常用于检测一些条件是否满足,但又不希望改变源操作数的情况。
TEST测试指令形式 TEST reg , imm/reg/mem ; reg∧imm/reg/mem TEST mem , imm/reg ; mem∧imm/reg
例: TEST AX, 0010H ;若 ZF = 0 ,则 AX第 4 位为 1 ,否则,第 4 位为 0
(5) NOT 逻辑“非”指令
对一个操作数执行逻辑非运算。 格式: NOT OPR 执行的操作:( OPR )←~( OPR ) NOT 指令是一个单操作数指令。 NOT 指令不影响标志位。
NOT 逻辑非指令形式 NOT reg/mem ; reg/mem←~reg/mem
例: MOV AL, 5FH NOT AL ;AL = 0A0H ,标志同上一条指令,不变
(6) 移位指令
将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作
SHL reg/mem,1/CL SAL reg/mem,1/CL ;逻辑 / 算术左移,最高位进入 CF ,最低位补 0
SHR reg/mem,1/CL ;逻辑右移,最低位进入 CF ,最高位补 0
SAR reg/mem,1/CL ;算术右移,最低位进入 CF ,最高位不变
移位指令对标志位的影响:按照移入的位设置进位标志 CF ;根据移位后的结果影响 SF 、 ZF 、 PF ;对 AF 没有定义。如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF :如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则 OF = 1 ;否则 OF = 0 。当移位次数大于 1 时,OF 不确定。
1) 逻辑左移指令格式 : SHL OPR , CNT (移位次数)
功能:将指定操作数左移 CNT 位,每次最高位移入CF ,空出的最低位补 0
例 : SHL AL , 1
逻辑左移 1 位相当于把无符号的操作数乘以2
CF
0
OPR
MOV CL , 3
SHL AL , CL
0CFOPR
逻辑右移一位相当于把无符号的操作数除以 2
功能:将操作数右移 CNT 位,每次最低位进入CF ,空出的最高位补 0
2) 逻辑右移指令格式 : SHR OPR , CNT (移位次数)例 : SHR AL ,1
MOV CL , 3
SHR AL , CL
功能:将指定操作数右移 CNT 位,每次移位最低位进入 CF ,空出的最高位填充原来的值,即原来为 0
填 0 ,原来为 1 ,填 1
CFOPR
3) 算术左移移位
格式 : SAL OPR , CNT
功能:执行操作与 SHL完全相同
4) 算术右移指令格式 : SAR OPR , CNT
例 : SAL AL ,1
(6) 移位指令 例 1 :已知 (SI) = 1230H
MOV CL, 2 SHL SI, 1;左移 1 位, (SI) = 2460H , CF = 0 , OF = 0 SAL SI, CL ;左移 2 位, (SI) = 9180H , CF = 0 , OF 值不确定 SHL SI, 1 ;左移 1 位, (SI) = 2300H , CF = 1 , OF = 1
例 2 : MOV DX, 9063H MOV CL, 4 SHR DX, 1 ;右移 1 位, (dx) = 4831H , CF = 1 , OF = 1 SHR DX, CL ;右移 4 位, (dx) = 0483H , CF = 0 , OF 不确
定 例 3 :
MOV DX, 9616 MOV CL, 3 SAR DX, 1 ;右移 1 位, (dx) = 0CB0BH , CF = 0 SAR DX, CL ;右移 3 位, (dx) = 0F961H
例: MOV CL , 3
0F4H
则指令执行后 ( SI )=
5140H
SAR AL , CL
指令执行前( AL ) =0A6H
则指令执行后( AL ) =
MOV AL , 0A6H
1 0 1 0 0 1 1 0AL
1 1 0 1 0 0 1 1AL
1 1 1 0 1 0 0 1AL
1 1 1 1 0 1 0 0AL
CF
11
0
MOV CL , 2
SAL SI , CL
指令执行前( SI ) =1450H
SI 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0
SI 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0
功能:将指定操作数左移 CNT 位,每次移位最高位进入 CF ,其它位顺序左移一位,空出的最低位由新的 CF 值填充。
CF OPR
5 )循环左移指令
格式 : ROL OPR , CNT
例: MOV CL , 3
ROL BL , CL
MOV BL , 0C6H
1 1 0 0 0 1 1 0BL
1
10 0 0 1 1 0 1 1 0
CF
1 0 0 0 1 1 0 1
0 0 0 1 1 0 1 1
功能:将指定操作数右移 CNT 位,每次最低位移入 CF ,其他位顺序右移,空出的高位由新的 CF 值填充。
CFOPR
(6) 循环右移指令
格式 : ROR OPR , CNT
例: MOV CL , 2
ROR DH , CL
MOV DH , 0C6H
功能:将指定的操作数连同进位位一起左移 CNT次,每次移位, CF 移入操作数的最低位,操作数的最高位移入 CF ,其他位顺序左移。
CF OPR
(7) 带进位的循环左移指令
格式 : RCL OPR , CNT
例: MOV CL , 2
RCL BH , CL
MOV BH , 0C6H
功能:将指定的操作数连同进位位一起右移 CNT次,每次移位, CF 移入操作数的最高位,操作数的最低位移入 CF ,其他位顺序右移。
(8) 带进位的循环右移指令
格式 : RCR OPR , CNT
例: MOV CL , 2
RCR BH , CL
MOV BH , 0C6H
CFOPR
例: MOV AX, 56ABH MOV CL, 4 ROL AX, 1 ;循环左移 1 位 ;(AX) = 0AD56H , CF = 0 , OF = 1 ROR AX, CL ;循环右移 4 位, (AX) = 6AD5H , CF
= 0 循环移位指令对标志的影响
按照指令功能设置进位标志 CF 不影响 SF 、 ZF 、 PF 、 AF 如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志 OF :如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则 OF = 1 ;否则 OF = 0 。当移位次数大于 1 时, OF 不确定
例 : ( AX ) =0012H ,( BX ) =0034H ,要求把它们装配在一起形成( AX ) =1234H ,可编制程序如下: MOV CL , 8 ROL AX , CL ADD AX , BX
5. 串操作指令
串操作指令是 8086 指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,常用在操作主存连续区域的数据时
指 令 包 括 :MOVS , LODS , STOS , CMPS , S
CAS
● 定义串——指存储器中地址连续的若干单元字符或数据。
串传送指令 串比较指令 串扫描指令串装入指令 串存储指令
8086提供的处理串的指令包含:
串处理指令只能处理单个字节或字,应用中需要串重复前缀配合使用。
由多个字节数据组成的数据串称为字节数据串,简称字节串;由多个字数据组成的数据串称为字数据串,简称字串。组成数据串的字节数据或字数据称为数据串元素。若对数据串元素作同样的操作,就称为串操作。把能完成串操作功能的指令称为数据串操作指令或简称为串操作指令。
5. 串操作指令
串重复前缀指令: REP(重复 ) 、 REPE/REPZ(相等 / 为零重复 ) 、 REPNE/REPNZ( 不相等 / 不为零重复 ) ;CX 寄存器存放重复操作的次数;一般源串存放在数据段 DS 中,偏移地址由 SI 指定;目的串存放在附加段 ES 中,偏移地址由 DI 指定;设置方向标志指令: CLD ( DF=0 )和 STD ( DF=1 )来设置SI 、 DI偏移地址在重复操作过程中的移动方向。
教学进程
基本的字符指令● 1.
(1) 串传送指令 MOVS
● 指令功能:把位于数据段 DS:SI 中一个字节或字的数据传送到
附加段 ES:DI 中。
● 指令格式: MOVSB ;传送字节数据
MOVSW ;传送字数据
● 指令操作:
字节操作: (DI) ←((SI)) , SI←(SI)±1 , DI←(DI)±1
字 操 作: (DI) ←((SI)) , SI←(SI)±2 , DI←(DI)±2
(方向标志 DF=0 时用+; DF=1 时用-)
● 本指令对标志位无影响
(1) MOVS 串传送指令 举例
例:把 DS 数据段 1000H 地址开始的 100 个字节内容顺序传送到扩展段 2000开始的单元中。使用字节串传送指令的程序如下:
MOV SI, 1000H ; 源串首地址 MOV DI, 2000H ; 目的串首地址 MOV CX, 100 ; 字节串长度 CLD ;清除方向标志 LOOP: MOVSB ; 传送一个字节数据 DEC CX ; 字节串长度减 1 JNZ LOOP ;CX 不为 0 ,转到 LOOP 继续执行 HLT
● 指令功能:将 DS:SI 所指定的字节(或字)单元的内容取出来送入AL (或 AX )中。● 指令格式: LODSB ;存字节数据 LODSW ;存字数据● 指令操作: 字节操作: AL←((SI)) , SI←(SI)±1
字 操 作: AX←((SI)) , SI←(SI)±2
(方向标志 DF=0 时用+; DF=1 时用-)
(2) 串装入指令LODS
(2) LODS 串读取指令 例:已知在数据段中有 100 个字组成的串,现在要求将其中的负数相加,其和
数 存放到紧接着该 串 的 下 一 个顺序 地 址 中 。已知串首元素的偏移 地 址 为2000H 。程序段代码:
CLD MOV SI, 2000H MOV BX, 0 MOV DX, 0 MOV CS, 202 LOOP: DEC CX DEC CX JZ STO ;判断计数是否已完 LODSW ; 从源串中取一个字送 AX MOV BX, AX AND AX, 8000H ;判断是否为负数 JZ LOOP ; 不是负数,转到 LOOP 继续取字串中的一个字 ADD DX, BX ;求负数元素之和,存在 DX 中 JMP LOOP STO: MOV [SI], DX ;负数元素之和写入顺序地址中 HLT
● 指令功能:将 AL 或 AX 中的数据送入 ES : DI 所指定的目标单元中。● 指令格式: STOSB ; 存字节数据 STOSW ; 存字数据● 指令操作: 字节操作: (DI) ←(AL) , DI←(DI)±1
字 操 作: (DI) ←(AX) , DI←(DI)±2
(方向标志 DF=0 时用+; DF=1 时用-)
(3) 串存储指令 STOS
(3) STOS 串存入指令 例:内存有一个数据缓冲区起始地址 BLOCK ,共存放
100 个 8 为带符号数,编程实现把该区域内正数、负数分离, 分别送 到同一 段 内 两 个缓冲区内 。正数 存放在PLUS_DATA开始的单元内,负数存放在 MINUS_DATA开始的单元中。
程序段代码: PUSH DS POP ES MOV SI, OFFSET BLOCK MOV DI, OFFSET PLUS_DATA MOV BX, OFFSET MINUS_DATA MOV CX, 100 CLD
(3) STOS 串存入指令 LOOP1: LODSB TEST AL, 80H JNZ MINUS ; 如果是负数,转到
MINUS STOSB ;否则,存正数 JMP AGAIN MINUS: XCHG BX, DI STOSB ; 存负数 XCHG BX, DI AGAIN: DEC CX JNZ LOOP1 HLT
(4) 串比较指令 CMPS
● 指令功能:将 ES : DI 指定的单元的内容减去由 DS : SI 指定单元的内容,不送回结果,只影响标志位 CF 、 PF 、 AF 、 ZF 、 SF
和 OF 。● 指令格式: CMPSB ;比较字节数据 CMPSW ;比较字数据● 指令操作:① ((DI))-((SI)), 根据比较结果置条件标志位: 相等 ZF=1 ,不等 ZF=0
②字节操作: SI←(SI)±1 , DI←(DI)±1
字 操 作: SI←(SI)±2 , DI←(DI)±2
(方向标志 DF=0 时用+; DF=1 时用-)
(4) CMPS 串比较指令 例:编程实现比较 DS 段 100H 和 200开始的 100 个
字符是否相同。 程序段代码:
MOV AX, DS MOV ES, AX MOV DI, 200H MOV SI, 300H CLD MOV CX, 100H XOR AX, AX REPZ CMPSB JZ DONE … ; 字符串不相同对应的处理程序段 DONE: … ; 字符串相同对应的处理程序段
(5)
● 指令功能: AL 或 AX 中的内容与附加段 ES:DI 所指的目的串中的
一个字节(或字)的数据相减,并根据结果设置标
志位,但结果不回送任何单元。
● 指令格式: SCASB ;比较字节数据
SCASW ;比较字数据
● 指令操作:字节操作: (AL) - ((DI)), DI←(DI)±1
字 操 作: (AX) - ((DI)), DI←(DI)±2
(方向标志 DF=0 时用+; DF=1 时用-)
串扫描指令 SCAS
(5) SCAS 串扫描指令 例:寻找字符串中是否包含字符“ A” 。 程序段代码:
MOV DI, OFFSET STRN MOV CX, N ; 串长度 MOV AL, ‘A’ ; 关键字符 CLD AGAIN: SCASB JZ FIND ;找到关键字符,转 FIND DEC CX JNZ AGAIN MOV AL, 0 ;未找到关键字符, AL 置 0 JMP EXIT FIND: MOV AL, 0FFH EXIT: MVO RSLT, AL
● 指令功能:重复执行指令规定的操作,直到( CX ) =0 。● 指令格式: REP MOVS ( B/W )或 STOS ( B/W )或LODS ( B/W )● 指令操作:① 如( CX ) =0 则退出 REP ,否则转②; ②( CX )←( CX )- 1 ; ③ 执行其后的串操作指令; ④ 重复①~③。
(1) 无条件重复前缀REP
重复前缀● 2.
(2)
● 指令功能:重复执行指令规定的操作,每执行一次串
指令( CX )- 1 ,并判断 ZF 标志是否为 0 ,
只要( CX ) =0 或 ZF=0 ,则停止执行串操作指令。
● 指 令 格 式 : REPE/REPZ MOVS ( B/W ) 或
STOS ( B/W )或 LODS ( B/W )
● 指令操作:① 如( CX ) =0 或 ZF=0 则退出,否则转②;
②( CX )←( CX )- 1 ;
③ 执行其后的串操作指令;
④ 重复① ~ ③。
相等或为零时重复串前缀 REPE/REPZ
例 [4-16]比较首地址分别为 STR1 和 STR2 的两个长度为 50 的字节串,找出第一个不相等的字节(要求用 REPZ 指令实现)。若两串相同,则( BX ) =0 ;若找到不相等的字节,则将 STR1 串中的这个数送到 AL ,基地址送 BX 中。
CLDMOV CX , 100LEA SI , STR1LEA DI , STR2REPZ CMPSBJZ OVERDEC SIMOV BX , SIMOV AL , [SI]JMP STOP
OVER : MOV BX , 0STOP : HLT
(3)
● 指令功能:重复执行指令规定的操作,每执行一次串
指令( CX )- 1 ,并判断 ZF 标志是否为 1 ,
只要( CX ) =0 或 ZF=1 ,则停止执行串操作指令。
● 指令格式: REPNE/REPNZ
MOVS ( B/W )或 STOS ( B/W )或 LODS ( B/W )
● 指令操作:① 如( CX ) =0 或 ZF=1 则退出,否则转②;
②( CX )←( CX )- 1 ;
③ 执行其后的串操作指令;
④ 重复① ~ ③。
REPNE/REPNZ 不相等或不为零时重复串前缀
注意:在进行串操作前,应当设置好源串地址 DS : SI 、目的串地址ES : DI 、方向标志位 DF 以及重复操作的次数 CX 。