第
This presentation is the property of its rightful owner.
Sponsored Links
1 / 153

第 3 章 PowerPoint PPT Presentation


  • 133 Views
  • Uploaded on
  • Presentation posted in: General

第 3 章. 教学重点. 8088/8086 的寻址方式 8088/8086 的基本指令 传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 控制转移指令. 操作码. 操作数. 指令的基本组成. 操作码 说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 操作数 指明参与操作的数是谁或存放在何处 寻找操作数的方法叫寻址方式 在转移调用指令中寻找新的转移地址也是寻址方式。. 指令由操作码和操作数两部分组成. §1 操作数的寻址方式. 指令系统设计了多种操作数的来源 寻找操作数的过程就是操作数的寻址

Download Presentation

第 3 章

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


3

第3章


3

教学重点

  • 8088/8086的寻址方式

  • 8088/8086的基本指令

    • 传送指令

    • 算术运算指令

    • 逻辑运算和移位指令

    • 串操作指令

    • 控制转移指令


3

操作码

操作数

指令的基本组成

  • 操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分

  • 操作数 指明参与操作的数是谁或存放在何处

  • 寻找操作数的方法叫寻址方式

  • 在转移调用指令中寻找新的转移地址也是寻址方式。

指令由操作码和操作数两部分组成


3

§1 操作数的寻址方式

  • 指令系统设计了多种操作数的来源

  • 寻找操作数的过程就是操作数的寻址

  • 理解操作数的寻址方式是理解指令功能的前提

  • 操作数采取哪一种寻址方式

    • 一方面,会影响处理器执行指令的速度和效率

    • 另一方面,对程序设计也很重要


3

一、 立即数寻址方式

  • 指令中直接给出一个常数作为操作数,其紧跟在操作码之后存放在代码段中。立即数直接从指令队列中取得,不用总线周期,执行数度快。

  • 这种操作数被称为立即数

    • 可以是8位数值(00H~FFH)

    • 也可以是16位数值(0000H~FFFFH)

  • 立即数寻址方式常用来给寄存器和存储单元赋值,多以常量形式出现

  • 注意:立即数只能是整数而且是常数。

MOV AX, 0102H;AX←0102H

演示


3

二、 寄存器寻址方式

  • 指令中指明某个寄存器其内容即为操作数,寄存器在CPU内,不用总线周期,执行速度快。

    • 8位寄存器r8:

      AH、AL、BH、BL、CH、CL、DH、DL

    • 16位寄存器r16:

      AX、BX、CX、DX、SI、DI、BP、SP

    • 4个段寄存器seg:

      CS、DS、SS、ES

MOV AX, BX;AX←BX

演示


3

三、直接寻址方式

  • 指令中直接给出操作数所在内存单元的有效地址

    (EA即偏移地址)

  • 默认的段地址在DS段寄存器,若在其它段可使用段超越前缀改变。

  • 用方括号包含有效地址,表达存储单元的内容

  • 直接地址也可用标号代表,方括号可省略。

MOV AX, [2000H];AX←DS:[2000H]

演示

MOV AX, ES: [2000H];AX←ES:[2000H]


3

四、寄存器间接寻址方式

  • 指令中给出的寄存器的内容包含操作数的有效地址。

  • 间接寻址中使用的寄存器名要用方括号括起来

    1、基址寻址 用BX或BP作间接寻址寄存器

    如:MOV AX,[BX] ;隐含在DS段

    MOV AX,[BP] ;隐含在SS段

MOV AX, [BX];AX←DS:[BX]

演示


3

2、变址寻址 用SI或DI作间接寻址寄存器

如:MOV CL, [SI]

MOV AX, [DI]

单独使用SI或DI时,隐含在DS段中

在串操作时,SI隐含在DS段中,DI隐含在ES段中。

3、相对基址寻址

指令中给出基址寄存器及位移量,二者之和为操作数的有效地址。

位移量可以是8位或16位。

有效地址=BX/BP+8/16位位移量


3

4、相对变址寻址 指令中给出变址寄存器及位移量,二者之和为操作数的有效地址。

有效地址=SI/DI+8/16位位移量

  • 段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变

MOV AX, [SI+06H];AX←DS:[SI+06H]

演示

MOV AX, 06H[SI];AX←DS:[SI+06H]


3

5、 基址变址寻址方式

  • 有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:

    有效地址=BX/BP+SI/DI

  • 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变

MOV AX, [BX+SI];AX←DS:[BX+SI]

演示

MOV AX, [BX][SI];AX←DS:[BX+SI]


3

6、 相对基址变址寻址方式

  • 有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和:

    有效地址=BX/BP+SI/DI+8/16位位移量

  • 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变

MOV AX, [BX+DI+6];AX←DS:[BX+DI+6]

演示

MOV AX, 6[BX+DI]

MOV AX, 6[BX][DI]


3

各种寻址方式综合举例

  • 设BX=1200H DI=10A0H 位移量=2BC0H

    DS=2400H 求各种寻址方式下的有效地址和物理地址。

    ① 直接寻址 指令形式: MOV AX, [2BC0H]

    EA= 2BC0H

    物理地址=24000H+2BC0H=26BC0H

    ② 基址寻址 指令形式: MOV AX, [BX]

    EA= 1200H

    物理地址=24000H+1200H=25200H


3

③ 变址寻址 指令形式: MOV AX, [DI]

EA= 10A0H

物理地址=24000H+10A0H=250A0H

④ 相对基址寻址 MOV AX, [BX+2BC0H]

EA= 1200H+2BC0H=3DC0H

物理地址=24000H+3DC0H=27DC0H

⑤ 相对基址寻址 MOV AX, [DI+2BC0H]

EA= 10A0H+2BC0H=3C60H

物理地址=24000H+3C60H=27C60H


3

⑥相对基址变址寻址

MOV AX, [BX+DI+2BC0H]

EA= 1200H+10A0H+2BC0H=4E60H

物理地址=24000H+4E60H=28E60H


2 8086

11

MOD

REG

REG

R/M

R/M

操作码

操作码

§2 8086的指令格式

一、指令格式

REG--寄存器

MOD--模式

R/M--寄存器或内存

单字节指令(隐含操作数)

操作码

单字节指令(寄存器模式)

操作码(R)

双字节指令(寄存器到寄存器模式)

不带位移量的寄存器和内存之间的传送


3

MOD

11

MOD

REG

操作码

操作码

R/M

R/M

R/M

操作码

位移低位

位移高位

操作码

数据低位

数据高位

操作码

位移低位

位移高位

数据低位

数据高位

REG--寄存器

MOD--模式

R/M--寄存器或内存

四字节指令

带位移量的寄存器和内存之间的传送(设位移量为16位)

立即数送寄存器(设立即数为16位)

六字节指令

立即数送内存(设位移量为16位)


3

  • 在操作码中一般有3位 W、 D、 S

  • W=0 表示字节操作 W=1表示字操作

  • D=0 REG是源操作数 D=1是目的操作数

  • S是扩展位 (用于加、减和比较和W组合使用)

  • S=0 W=0 8位操作数

  • S=0 W=1 16位操作数

  • S=1 W=1 由8位扩展为16位操作数


3

MOD

REG

R/M

寻址方式

计算存储器地址方法

寄存器名

  • 单字节指令中可隐含指出寄存器名,此类指令少,但执行速度较快。

  • 8086规定:双操作数指令中(除立即数和串操作指令),其中一个操作数必须在寄存器中,可缩短指令长度,另一个操作数可以在寄存器中也可以在内存单元中。

  • 8086指令中第二个字节,给出两个操作数在什么地方,以及计算存储器地址的方法。


3

MOD=11,表明第二个操作数也在寄存器中,则R/M指明其名称,与REG编码相同。


3

MOD

R/M


3

二、段寄存器的隐含访问

  • 一般指令中不出现段寄存器名称,而用隐含关系指明。

  • 如与隐含关系不同,运用前缀改变。

  • ① [BX] 隐含于DS段

  • ②[BP] 隐含于SS段

  • ③ [SI]、[DI]单独使用隐含于DS段

  • ④ 基址寄存器和变址寄存器同时出现,以基址寄存器隐含关系为准。


3

  • [SP]隐含于SS段

  • [SI]、[DI]用于串操作时,[SI]隐含于DS段,

    [DI]隐含于ES段。

  • 使用前缀的形式

    ADD AX, ES:[SI]

    或 ES:ADD AX, [SI]


3

三、指令执行时间

  • 一般用所需的时钟周期数表明

  • 指令执行时间=基本执行时间+计算有效地址时间

  • +为取操作数和存放结果而访问内存的时间


3 8086

§3 8086指令系统

  • 8086指令系统很丰富,包含133条基本指令,功能强。

  • 一般分为五类来介绍

    • 传送指令

    • 算术运算指令

    • 逻辑运算和移位指令

    • 串操作指令

    • 控制转移指令


3

一、数据传送类指令

  • 数据传送是计算机中最基本、最重要的一种操作,传送指令也是最常使用的一类指令

  • 传送指令把数据从一个位置传送到另一个位置

  • 除标志寄存器传送指令外,均不影响标志位

  • 重点掌握

    MOV XCHG PUSH POP XLAT LEA


3

1、通用数据传送指令

  • 提供方便灵活的通用传送操作

  • 有3条指令

    MOV

    XCHG

    PUSH POP

MOV

XCHG

PUSH


Mov move

① 基本传送指令MOV(move)

  • 把一个字节或字的操作数从源地址传送至目的地址

MOV reg/mem,imm

;立即数送寄存器或主存

MOV reg/mem/seg,reg

;寄存器送(段)寄存器或主存

MOV reg/seg,mem

;主存送(段)寄存器

MOV reg/mem,seg

;段寄存器送寄存器或主存

演示


3

以字母开头的常数要有前导0

MOV指令举例--立即数传送

mov cl,4;cl←4,字节传送

mov dx,0ffh;dx←00ffh,字传送

mov si,200h;si←0200h,字传送

mov bvar,0ah;字节传送

;假设bvar是一个字节变量,定义如下:bvar db 0

mov wvar,0bh;字传送

;假设wvar是一个字变量,定义如下:wvar dw 0

  • 明确指令是字节操作还是字操作


3

MOV指令举例--寄存器传送

mov ah,al;ah←al,字节传送

mov bvar,ch;bvar←ch ,字节传送

mov ax,bx;ax←bx,字传送

mov ds,ax;ds←ax,字传送

mov [bx],al;[bx]←al,字节传送

  • 寄存器具有明确的字节和字类型


3

MOV指令举例--存储器传送

mov al,[bx];al←ds:[bx]

mov dx,[bp];dx←ss:[bp+0]

mov dx,[bp+4];dx←ss:[bp+4]

mov es,[si];es←ds:[si]

  • 不存在存储器向存储器的传送指令


3

MOV指令举例--段寄存器传送

mov [si],ds

mov ax,ds;ax←ds

mov es,ax;es←ax←ds

  • 对段寄存器的操作不灵活


3

立即数

通用寄存器

AX BX CX DX

BP SP SI DI

段寄存器

CS DS ES SS

MOV指令传送功能图解

MOV指令也并非任意传送!

  • 非法指令的主要现象:

  • 两个操作数的类型不一致

  • 无法确定是字节量还是字量操作

  • 两个操作数都是存储器

  • 段寄存器的操作有一些限制


3

非法指令--两个操作数类型不一致

  • 在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令

    MOV AL, 050AH;非法指令,修正:

    ;mov ax,050ah

    MOV SI, DL;非法指令,修正:

    ;mov dh,0

    ;mov si,dx


3

非法指令--无法确定是字节量还是字量操作

  • 当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明

    MOV [BX+SI], 255;非法指令,修正:

    ;mov byte ptr [bx+si],255

    ;byte ptr 说明是字节操作

    ;mov word ptr [bx+si],255

    ;word ptr 说明是字操作


3

非法指令--两个操作数都是存储器

  • 8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数)

    MOV buf2, buf1;非法指令,修正:

    ;假设buf2和buf1是两个字变量

    ;mov ax,buf1

    ;mov buf2,ax

    ;假设buf2和buf1是两个字节变量

    ;mov al,buf1

    ;mov buf2,al


3

非法指令--段寄存器的操作有一些限制

  • 8088指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活

    MOV DS, ES;非法指令,修正:

    ;mov ax,es

    ;mov ds,ax

    MOV DS, 100H;非法指令,修正:

    ;mov ax,100h

    ;mov ds,ax

    MOV CS, [SI];非法指令

    ;指令存在,但不能执行


Xchg exchange

② 交换指令XCHG(exchange)

  • 把两个地方的数据进行互换

XCHG reg,reg/mem

;reg  reg/mem

  • 寄存器与寄存器之间对换数据

  • 寄存器与存储器之间对换数据

  • 不能在存储器与存储器之间对换数据

演示


3

数据交换指令举例

mov ax,1199h;ax=1199h

xchg ah,al;ax=9911h

;等同于 xchg al,ah

mov wvar,5566h;wvar是一个字量变量

xchg ax,wvar;ax=5566h,wvar=9911h

;等同于 xchg wvar,ax

注意:不能在两个内存单元之间交换

如:XCHG [BX],[SI] 错误!

段寄存器中CS、IP不能做操作数


3

③ 堆栈操作指令

  • 堆栈是一个“后进先出LIFO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址

  • 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定

  • 堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP

  • 堆栈由栈底向低地址方向生成

图示


3

进栈指令PUSH

  • 进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部

PUSH r16/m16/seg

;SP←SP-2

;SS:[SP]←r16/m16/seg

演示

push ax

push [2000h]


3

出栈指令POP

  • 出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2

POP r16/m16/seg

; r16/m16/seg←SS:[SP]

;SP←SP+2

演示

pop ax

pop wvar


3

堆栈操作的特点

  • 堆栈操作的单位是字,进栈和出栈只对字进行

  • 数据从栈顶压入和弹出时,都是低地址送低字节,高地址送高字节

  • 堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据

  • 堆栈段是程序中不可或缺的一个内存区,常用来

    • 临时存放数据

    • 传递参数

    • 保存和恢复寄存器


3

6FH

SP 11FFEH

A2H

11FFFH

栈底

SP 12000H

  • 应用举例:

    设 SS=1000H SP=2000H AX=A26FH

    执行 PUSH AX 指令的过程和结果

    SP-2= 1FFEH

    则AX内容压入内存

    11FFEH和11FFFH

    执行后SP=1FFEH

    (11FFEH)=6FH

    (11FFFH)=A2H


3

练习1:已知SS=1200H

执行 MOV AX, 3765H

MOV BX, 4288H

MOV SP, 1020H

PUSH AX

PUSH BX

POP CX

执行后 AX=( ) BX=( )

CX=( ) SP=( )

3765H,4288H,4288H,101EH


3

2、累加器专用传送指令

① 输入输出指令(IN/OUT指令)

格式:IN AL,port;port为直接端口地址

IN AL,DX ;DX的内容为端口地址(间接方式)

IN AX,port;

IN AX, DX

OUT port, AL

OUT DX, AL

OUT port, AX

OUT DX, AX


3

注意:①只能用累加寄存器不能用其它寄存器

②当端口地址在00H—FFH之间可以用直接地址

当端口地址大于FFH时必须用DX间址形式

例:IN AL,40H; (40H) AL

IN AX,80H; (80H)、(81H) AX

MOV DX, 0382H

IN AL,DX ; (0382H) AL

OUT 62H, AL

MOV DX, 0380H

OUT DX,AX


3

②换码指令XLAT(查表指令)

  • 将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL

XLAT;al←ds:[bx+al]

演示

  • 换码指令执行前:

    • 在主存建立一个字节量表格,内含要转换成的目的代码

    • 表格首地址存放于BX,AL存放相对表格首地址的位移量

  • 换码指令执行后:

    • 将AL寄存器的内容转换为目标代码


Lea lds les

③址传送指令 三条LEA 、LDS、LES

  • 将存储器操作数的有效地址送至指定的16位通用寄存器

LEA r16, mem

;r16←mem的有效地址EA

例1: 有效地址的获取

LEA AX, [2375H] ; AX=2375H

LEA SP, [BX+SI] ; SP=(BX)+(SI)

区别: LEA SI, BUFF; SI=BUFF

MOV SI,BUFF; SI=(BUFF)


3

例2 MOV BX,400H

MOV SI ,3CH

LEA BX,[BX+SI+0F62H]

;BX←400H+3CH+0F62H=139EH

LDS r16, mem

;ds、r16←mem中的双字


3

M

DS段

2300H

34H

12H

2301H

2302H

78H

2303H

56H

例:LDS BX,[2300H]

执行后:

BX=1234H

DS=5678H


3

M

DS段

SI

11H

22H

SI+1

SI+2

33H

SI+3

44H

LES r16, mem

;es、r16←mem中的双字

例:LES DI,[SI]

执行后:

DI=2211H

ES=4433H


3

4、标志传送指令

①读标志指令

LAHF ;标志寄存器低字传送到AH

②设标志指令

SAHF ; AH的内容送标志寄存器低8位

③ 标志寄存器堆栈指令

PUSHF ;标志寄存器内容(16位)压栈

  • 标志寄存器出栈指令

    POPF ;弹出标志寄存器的内容。


3

二、 算术运算类指令

  • 算术运算类指令用来执行二进制的算术运算:加减乘除以及BCD码调整。

  • 这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果;使用他们时请留心有关状态标志

  • 重点掌握

    加法指令:ADD、ADC、INC

    减法指令:SUB 、SBB、DEC、CMP、NEG


3

1、 加法和减法指令

  • 加法指令:ADD, ADC和INC

  • 减法指令:SUB, SBB, DEC, NEG和CMP

  • 他们分别执行字或字节的加法和减法运算,除INC和DEC不影响CF标志外,其他按定义影响全部状态标志位

  • 操作数组合: dest , src

    运算指令助记符 reg, imm/reg/mem

    运算指令助记符 mem, imm/reg


3

①不带进位加和减指令

ADDdest,src

;加法:dest←dest+src

;ADD指令使目的操作数加上源操作数,和的结果送到目的操作数

SUBdest,src

;减法:dest←dest-src

;SUB指令使目的操作数减去源操作数,差的结果送到目的操作数


3

加法例题

mov ax,7348h;AX=7348H

add al,27h

;AL=48H+27H=6FH,AX=736FH

;OF=0,SF=0,ZF=0,PF=1,CF=0

add ax,3fffh

;AX=736FH+3FFFH=B36EH

;OF=1,SF=1,ZF=0,PF=0,CF=0


3

减法例题

sub ah,0f0h

;AH=B3H-F0H=C3H,AX=C36EH

;OF=0,SF=1,ZF=0,PF=1,CF=1

mov word ptr[200h],0ef00h

;[200H]=EF00H,标志不变

sub [200h],ax

;[200H]=EF00H-C36EH=2B92H

;OF=0,SF=0,ZF=0,PF=0,CF=0

sub si,si;SI=0

;OF=0,SF=0,ZF=1,PF=1,CF=0


3

② 带进位加和减指令

ADCdest,src

;加法:dest←dest+src+CF

;ADC指令除完成ADD加法运算外,还要加上进位CF,结果送到目的操作数

SBBdest,src

;减法:dest←dest-src-CF

;SBB指令除完成SUB减法运算外,还要减去借位CF,结果送到目的操作数


3

例:无符号双字加法和减法

mov ax,7856h;AX=7856H

mov dx,8234h;DX=8234H

add ax,8998h;AX=01EEH,CF=1

adc dx,1234h;DX=9469H,CF=0

sub ax,4491h;AX=BD5DH,CF=1

sbb dx,8000h;DX=1468H,CF=0

DX.AX=8234 7856H+1234 8998H-8000 4491H

=1468 BD5DH


Cmp compare

③ 比较指令CMP(compare)

CMPdest,src

;做减法运算:dest-src

;CMP指令将目的操作数减去源操作数,但差值不回送目的操作数

  • 比较指令通过减法运算影响状态标志,用于比较两个操作数的大小关系

cmp ax,bx

cmp al,100


3

④ 增量和减量指令

INCreg/mem

;增量(加1):reg/mem←reg/mem+1

DECreg/mem

;减量(减1):reg/mem←reg/mem-1

  • INC指令和DEC指令是单操作数指令

  • 与加法和减法指令实现的加1和减1不同的是:INC和DEC不影响CF标志

inc si;si←si+1

dec byte ptr [si];[si]←[si]-1


3

  • 如A、B两数为无符号数,则通过以下标志判断

  • ZF=1,A=B;CF=0,A﹥B;CF=1,A ﹤B

  • 如A、B两数为有符号数,不能通过CF标志判断两数的大、小关系,要使用SF、OF标志

  • ZF=1 ,A=B

  • SF、OF同号 ,则A﹥B

  • SF、OF异号 ,则A﹤B


3

  • 实例验证

    A=10=00001010B B=-10=11110110B

    A-B=00001010-11110110 =00010100

    SF=0 OF=0 , A﹥B

    B-A=11110110-00001010=11101100

    SF=1,OF=0, A ﹤B


Neg negtive

⑤ 求补指令NEG(negtive)

NEG reg/mem

;reg/mem←0-reg/mem

  • NEG指令对操作数执行求补运算,即用零减去操作数,然后结果返回操作数

  • 求补运算也可以表达成:将操作数按位取反后加1

  • NEG指令对标志的影响与用零作减法的SUB指令一样(总使CF=1)

  • NEG指令也是一个单操作数指令


3

求补运算例题

mov ax,0ff64h

neg al;AL=0-64H=9CH,AX=FF9CH

;OF=0,SF=1,ZF=0,PF=1,CF=1

sub al,9dh;AL=9CH-9DH=FFH,AX=FFFFH

;OF=0,SF=1,ZF=0,PF=1,CF=1

neg ax;AX=0-FFFFH=0001H

;OF=0,SF=0,ZF=0,PF=0,CF=1

dec al;AL=01H-1=0,AX=0000H

;OF=0,SF=0,ZF=1,PF=1,CF=1

neg ax;AX=0-0=0

;OF=0,SF=0,ZF=1,PF=1,CF=0


3

2、 乘法指令

  • 乘法指令规定:8位X8位,积为16位

    被乘数必须在AL中,乘积在AX中

    16位X16位,积为32位

    被乘数必须在AX中,乘积在DX(高16位)、AX中

  • 对标志位的理解:

    CF=OF=1 ,表示结果为16位或32位有效。

    CF=0,OF=1,表示只有8位或16位乘积。


3

  • 乘法指令分无符号和有符号乘法指令

    MUL reg/mem;无符号乘法

    IMUL reg/mem;有符号乘法

  • 例:IMUL BL

    MUL CX

    MUL byte ptr[di+04h]

    IMUL word ptr[si]


3

3、除法指令

  • 除法指令的规定:

  • 被除数是16位,必须存放于AX中,此时除数只能是8位,得到的商存于AL中,余数在AH中。

  • 被除数是32位,必须存放于DX、AX中,此时除数只能是16位,得到16位的商存于AX中,余数在DX中。

  • 除法运算后,状态标志除ZF外,无意义。

  • 当有符号数相除,商超出表示范围不表示为溢出,其与除数为0一样,产生0号中断。(除法出错)。


3

  • 有符号数相除,会有两种结果,选择余数的符号与被除数相同。

  • (-30)÷8= -4余+2或-3余-6 取后者

  • 当被除数只有8位或16位时必须进行扩展。


3

  • 除法指令分无符号和有符号除法指令

    DIV reg/mem;无符号除法

    IDIV reg/mem;有符号除法

    例: DIV CL;

    IDIV BL;

    DIV word ptr[bx];

    IDIV byte ptr[2300h]


3

4、 符号扩展指令

  • 无符号数的扩展高位补0,有符号数扩展使用符号扩展指令。

  • 符号扩展是指用一个操作数的符号位(最高位)形成另一个操作数,即扩展符号位。

  • 符号扩展虽然使数据位数加长,但数据大小并没有改变,扩展的高位部分仅是低位的符号扩展。

  • 符号扩展指令有两条,用来将字节转换为字,字转换为双字

    CBW;AL符号扩展成AX

    CWD;AX符号扩展成DX


3

符号扩展例题

mov al,64h

;AL=64H (机器数) ,表示10进制数100(真值)

cbw

;将符号0扩展,AX=0064H,仍然表示100

mov ax,0ff00h

;AX=FF00H,表示有符号10进制数-256

cwd

;将符号位“1”扩展,DX.AX=FFFFFF00H

;仍然表示-256


3

5、十进制调整指令

  • 十进制数调整指令对BCD运算的结果进行十进制调整,以得到正确的十进制的运算结果。

  • BCD码的运算只有字节运算,且必须用AL作目的操作数。

  • 8088指令系统支持两种BCD码调整运算

    • 压缩BCD码就是通常的8421码;它用4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即00~99

    • 非压缩BCD码用8个二进制位表示一个十进制位,只用低4个二进制位表示一个十进制位0~9,高4位任意,通常默认为0


3

① 加法调整指令

  • 非压缩BCD码相加后用 AAA 调整

  • 压缩BCD码相加后用 DAA 调整

    例1:设AL=09H CL=07H

    ADD AL,CL; AL=10H

    AAA ;

    结果: AH=01H AL= 06H

    调整的方法:当(AL)﹥9或AF=1

    (AL)+06H AL ,然后(AL)∧ 0FH;

    (AH)+1 AH

    调整后AF、CF 置1,其他标志无意义。


3

例2:设AL=28H CL=53H

ADD AL,CL; AL=7BH

DAA ;

结果: AL=81H

调整的方法:当AL中低4位﹥9

(AL)+06H AL 。

调整指令影响AF、CF、PF、SF、ZF,OF无意义。


3

② 减法调整指令

  • 非压缩BCD码相减以后用 AAS调整

  • 压缩BCD码相减以后用 DAS调整

  • AAS指令的方法与AAA相似:

    当(AL)﹥9或AF=1(半借位)

    (AL)-06H AL ,然后(AL)∧ 0FH;

    (AH)-1 AH

  • DAS指令的方法与DAA相似(加变减)。


3

③ 乘法调整指令

  • BCD码相乘只能用非压缩BCD码,因而只有一条调整指令即 AAM

  • 调整方法(AL)除以0AH,得到的商送到AH,

    余数在AL中。

    例:AL=05H, CL=07H

    MUL CL ;AL=23H

    AAM ; AH=03H AL=05H


3

④ 除法调整指令

  • 除法也只有非压缩BCD码相除,用AAD调整。

  • 除法调整指令用于除法指令之前。

  • 调整的方法是将AX中的2位被除数调整好,再除以除数:

  • (AH)X(0AH)+(AL) AL

    例:AX=0402H CL=06H

    AAD ;AL=2AH

    DIV CL ;AL=07H


3

三、逻辑运算和移位指令

  • 逻辑运算即位操作,指令以二进制位为基本单位进行数据的操作

  • 当需要对字节或字数据中的各个二进制位操作时,可以考虑采用位操作类指令

  • 注意这些指令对标志位的影响

    1. 逻辑运算指令

    AND OR XOR NOT TEST

    2. 移位指令

    SHL(SAL) SHR SAR

    3. 循环移位指令

    ROL ROR RCL RCR


3

1、逻辑运算指令

  • 双操作数逻辑指令AND、OR、XOR和TEST设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义;它们的操作数组合与ADD、SUB等一样:

    运算指令助记符 reg, imm/reg/mem

    运算指令助记符 mem, imm/reg

  • 单操作数逻辑指令NOT不影响标志位,操作数与INC、DEC和NEG一样:

    NOT reg/mem


3

逻辑与指令AND

对两个操作数执行逻辑与运算,结果送目的操作数

AND dest,src;dest←dest∧src

  • 只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0。

  • 可以使某些位清0,其余位不变。


3

逻辑或指令OR

对两个操作数执行逻辑或运算,结果送目的操作数

OR dest,src;dest←dest∨src

  • 只要相“或”的两位有一位是1,结果就是1;否则,结果为0。

  • 可以使某些位置1。


3

逻辑异或指令XOR

对两个操作数执行逻辑异或运算,结果送目的操作数

XOR dest,src;dest←dest⊕src

  • 只有相“异或”的两位不相同,结果才是1;否则,结果为0。

  • 可以使某些位取反。


3

测试指令TEST

  • 对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志

TEST dest,src;dest∧src

  • AND与TEST指令的关系,

  • 同SUB与CMP指令的关系一样


3

  • 例:TEST AL, 01H;测试AL的最低位

    TEST AX,8000H;测试AX的最高位

    TEST BX,00FFH;测试BX的低8位

    TEST CL,0F0H ; 测试CL的高4位

    利用ZF标志判断被测试位的状态

    ZF=1,被测试位为0,否则,为1。


3

逻辑非指令NOT

对一个操作数执行逻辑非运算

NOT reg/mem;reg/mem←~reg/mem

  • 按位取反,原来是“0”的位变为“1”;原来是“1”的位变为“0”


3

逻辑运算举例

mov al,75h;AL=75H

and al,32h;AL=30H

;CF=OF=0, SF=0,ZF=0,PF=1

or al,71h;AL=71H

;CF=OF=0,SF=0,ZF=0,PF=1

xor al,0f1h;AL=80H

;CF=OF=0,SF=1,ZF=0,PF=0

not al;AL=7FH,标志不变


3

逻辑运算指令的应用

例:将内存2000单元的内容D0、D3清0,D2、D4置1,D1、D6取反,其余位不变。

mov bl, [2000h]

and bl,11110110b

;BL中D0和D3清0,其余位不变

or bl,00010100b

;BL中D2和D4置1,其余位不变

xor bl,01000010b

;BL中D1和D6求反,其余位不变

mov [2000h] , bl


3

2、移位指令

  • 将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作

  • 移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元;后一个操作数表示移位位数:

    • 该操作数为1,表示移动一位

    • 该操作数为CL,CL寄存器值表示移位位数 (移位位数大于1只能CL表示)

  • 按照移入的位设置进位标志CF,根据移位后的结果影响SF、ZF、PF


3

逻辑左移指令SHL

SHL reg/mem,1/CL

;reg/mem左移1或CL位

;最低位补0,最高位进入CF

演示


3

逻辑右移指令SHR

SHR reg/mem,1/CL

;reg/mem右移1/CL位

;最高位补0,最低位进入CF

演示


3

算术左移指令SAL

SAL reg/mem,1/CL

;与SHL是同一条指令

演示


3

算术右移指令SAR

SAR reg/mem,1/CL

;reg/mem右移1/CL位

;最高位不变,最低位进入CF

演示


3

数据移位举例

mov dx,6075h;DX=01100000 01110101B

shl dx,1;DX=11000000 11101010B

;CF=0,SF=1、ZF=0、PF=0

sar dx,1;DX=11100000 01110101B

;CF=0,SF=1、ZF=0、PF=0

shr dx,1;DX=01110000 00111010B

;CF=1,SF=0、ZF=0、PF=1

mov cl,4;CL=4,标志不变

sar dx,cl;DX=00000111 00000011B

;CF=1,SF=0、ZF=0、PF=1


Al 10

sub ah,ah

and ah,0

例:将AL寄存器中的无符号数乘以10

xor ah,ah;实现AH=0,同时使CF=0

shl ax,1;AX←2×AL

mov bx,ax;BX←AX=2×AL

shl ax,1;AX←4×AL

shl ax,1;AX←8×AL

add ax,bx;AX←8×AL+2×AL=10×AL

  • 逻辑左移一位相当于无符号数乘以2

  • 逻辑右移一位相当于无符号数除以2


3

循环移位指令

  • 循环移位指令类似移位指令,但要将从一端移出的位返回到另一端形成循环。分为:

    ROLreg/mem,1/CL;不带进位循环左移

    RORreg/mem,1/CL;不带进位循环右移

    RCLreg/mem,1/CL;带进位循环左移

    RCR reg/mem,1/CL;带进位循环右移

  • 循环移位指令的操作数形式与移位指令相同,按指令功能设置进位标志CF,但不影响SF、ZF、PF、AF标志

演示

演示

演示

演示


3

AX

DX

CF

0

应用:32位数据移位

;将DX.AX中32位数值左移一位

shl ax,1

rcl dx,1

考虑32位数据的右移等操作


3

四、控制转移类指令

  • 控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的常用指令

  • 重点掌握:

    • JMP/Jcc/LOOP/JCXZ

    • CALL/RET

  • 控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变


3

1、目标地址的寻址方式

  • 相对寻址方式

    • 指令代码中提供目的地址相对于当前IP的位移量,转移到的目的地址(转移后的IP值)就是当前IP值加上位移量

  • 直接寻址方式

    • 指令代码中提供目的逻辑地址,转移后的CS和IP值直接来自指令操作码后的目的地址操作数

  • 间接寻址方式

    • 指令代码中指示寄存器或存储单元,目的地址从寄存器或存储单元中间接获得

用标号表达

用标号表达

用寄存器或存储器操作数表达


3

代码段

代码段

目标地址的寻址范围:段内寻址

  • 段内转移——近转移(near)

    • 在当前代码段64KB范围内转移( ±32KB范围)

    • 不需要更改CS段地址,只要改变IP偏移地址

  • 段内转移——短转移(short)

    • 转移范围可以用一个字节表达,在段内-128~+127范围的转移


3

目标地址的寻址范围:段间寻址

  • 段间转移——远转移(far)

    • 从当前代码段跳转到另一个代码段,可以在1MB范围

    • 需要更改CS段地址和IP偏移地址

    • 目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址

代码段

代码段

  • 实际编程时,汇编程序会根据目标地址的属性,自动处理成短转移、近转移或远转移

  • 程序员可用操作符short、near ptr 或far ptr 强制成为需要的转移类型


3

2、无条件转移指令

  • 只要执行无条件转移指令JMP,就使程序转到指定的目标地址,从目标地址处开始执行指令

  • 操作数label是要转移到的目标地址(目的地址、转移地址)

  • JMP指令分成4种类型:

    ⑴ 段内转移、相对寻址

    ⑵ 段内转移、间接寻址

    ⑶ 段间转移、直接寻址

    ⑷ 段间转移、间接寻址

JMP label;程序转向label标号指定的地址


2 jmp jump

第2章:无条件转移指令JMP(jump)

JMP label;段内转移、相对寻址

;IP←IP+位移量

JMP r16/m16;段内转移、间接寻址

;IP←r16/m16

JMP far ptr label;段间转移、直接寻址

;IP←偏移地址,CS←段地址

JMP far ptr mem;段间转移,间接寻址

;IP←[mem],CS←[mem+2]

演示

演示

演示

演示

演示


3

3、 条件转移指令

  • 条件转移指令Jcc根据指定的条件确定程序是否发生转移。其通用格式为:

    Jcclabel;条件满足,发生转移

    ;IP←IP+8位位移量;

    ;否则,顺序执行

  • label是一个标号、一个8位位移量,表示Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移

  • label只支持短转移的相对寻址方式


3

① Jcc指令的分类

  • Jcc指令不影响标志,但要利用标志。

  • 根据利用的标志位不同,分成三种情况:

    ⑴ 判断单个标志位状态

    ⑵ 比较无符号数高低

    ⑶ 比较有符号数大小

  • Jcc指令实际虽然只有16条,但却有30个助记符

  • 采用多个助记符,目的是为了方便记忆和使用


3

② 判断单个标志位状态

⑴JZ/JE和JNZ/JNE

利用零标志ZF,判断结果是否为零(或相等)

⑵ JS和JNS

利用符号标志SF,判断结果是正是负

⑶ JO和JNO

利用溢出标志OF,判断结果是否产生溢出

⑷ JP/JPE和JNP/JPO

利用奇偶标志PF,判断结果中“1”的个数是偶是奇

⑸ JC/JB/JNAE和JNC/JNB/JAE

利用进位标志CF,判断结果是否进位或借位


3

例题1

  • 题目:将AX中存放的无符号数除以2,如果是奇数则加1后除以2

  • 问题:如何判断AX中的数据是奇数还是偶数?

  • 解答:判断AX最低位是“0”(偶数),还是“1”(奇数)。可以用位操作类指令

    1:用逻辑与指令将除最低位外的其他位变成0,保留最低位不变。判断这个数据是0,AX就是偶数;否则,为奇数

    2:将最低位用移位指令移至进位标志,判断进位标志是0,AX就是偶数;否则,为奇数

    3:将最低位用移位指令移至最高位(符号位),判断符号标志是0,AX就是偶数;否则,为奇数


3

例题1解答—用JZ指令实现

test ax,01h

;测试AX的最低位D0(不用AND指令,以免改变AX)

jzeven

;标志ZF=1,即D0=0:AX内是偶数,程序转移

add ax,1

;标志ZF=0,即D0=1:AX内的奇数,加1

even:shr ax,1;AX←AX÷2

用右移一位的方法实现除以2。

本例中用RCR指令比SHR指令更好。


1 jnc

例题1解答—用JNC指令实现

mov bx,ax

shr bx,1

;将AX的最低位D0移进CF

jnceven

;标志CF=0,即D0=0:AX内是偶数,程序转移

add ax,1

;标志CF=1,即D0=1:AX内的奇数,加1

even:shr ax,1;AX←AX÷2

还可用SAR、ROR和RCR指令


1 jns

ADD BX,0;增加一条指令

例题1解答—用JNS指令实现

mov bx,ax

ror bx,1

;将AX的最低位D0移进最高位(符号位SF)

jnseven

;标志SF=0,即D0=0:AX内是偶数,程序转移

add ax,1

;标志SF=1,即D0=1:AX内的奇数,加1

even:shr ax,1;AX←AX÷2

错误!循环指令不影响SF等标志


3

例2判断是否为字母Y

;寄存器AL中是字母Y(含大小写),则令AH=0,否则令AH=-1

cmp al,’y’;比较AL与小写字母y

je next;相等,转移

cmp al,’Y’ ;不相等,

;继续比较AL与大写字母Y

je next;相等,转移

mov ah,-1;不相等,令AH=-1

jmp done;无条件转移指令

next:mov ah,0;相等的处理:令AH=0

done:……


3

比较无符号数高低

  • 无符号数的大小用高(Above)、低(Below)表示,需要利用CF确定高低、利用ZF标志确定相等(Equal)

  • 两数的高低分成4种关系,对应4条指令

    JB(JNAE):目的操作数低于(不高于等于)源操作数

    JNB(JAE):目的操作数不低于(高于等于)源操作数

    JBE(JNA):目的操作数低于等于(不高于)源操作数

    JNBE(JA):目的操作数不低于等于(高于)源操作数


3

比较有符号数大小

  • 判断有符号数的大(Greater)、小(Less),需要组合OF、SF标志、并利用ZF标志确定相等与否

  • 两数的大小分成4种关系,分别对应4条指令

    JL(JNGE):目的操作数小于(不大于等于)源操作数

    JNL(JGE):目的操作数不小于(大于等于)源操作数

    JLE(JNG):目的操作数小于等于(不大于)源操作数

    JNLE(JG):目的操作数不小于等于(大于)源操作数


3

例:求较大值

cmp ax,bx;比较AX和BX

jae next;若AX≥BX,转移

xchg ax,bx;若AX<BX,交换

next:mov wmax,ax

如果AX和BX存放的是有符号数,

则条件转移指令应采用JGE指令


3

例:求较大值(另解)

cmp ax,bx;比较AX和BX

jaenext

mov wmax, bx

;若AX<BX,wmax←BX

jmpdone

next:mov wmax,ax

;若AX≥BX,wmax←AX

done:……


3

dec cx

jnz label

3、 循环指令

  • 一段代码序列多次重复执行就是循环

  • 8088设计有针对CX计数器的计数循环指令

    LOOP label;循环指令

    ;首先CX←CX-1;然后判断;若CX≠0,转移

    JCXZ label;为0循环指令

    :如果CX=0,则转移

  • label操作数采用相对短寻址方式

  • 还有LOOPZ/LOOPE和LOOPNZ/LOOPNE两条指令


3

五、串操作指令

  • 串指令可以对字节或字串进行操作。

  • 所有串操作指令都默认对DS段中用SI指定的源操作数及ES段中用DI指定的目的操作数寻址,可用段超越前缀改变。

  • 串操作指令执行时,由标志位DF决定地址指针的修改方向。当DF=1时作减量修改;当DF=0时作增量修改。因此,在串操作指令执行前,需对SI、DI和DF进行设置。


3

  • 使用串操作指令一般要加重复前缀。

  • 每一条指令即是一段循环程序,可以被中断。

  • 串操作指令是唯一的一类源操作数和目的操作数都为存储器单元的指令。


3

1、字符串传送指令

  • 串传送指令 MOVSB/MOVSW

    其功能是把位于DS段由SI指定的内存单元的字节数据或字数据传送到ES段由DI指定的内存单元。指令不影响状态标志位。

    例:把DS段1000H起始的100个字节的内容传送到ES段2000H起始的内存中。


3

重复前缀

MOV SI,1000H

MOV DI,2000H

MOV CX,100

CLD ;DF=0

REP MOVSB ;(SI) (DI)

SI+1 SI

DI+1 DI

CX-1≠0,继续传送


3

2、字符串比较指令

  • 串比较指令 CMPS

    其功能是比较DS和ES段中相对应的内容,可以通过重复前缀指明比较两段是否完全相同或不同,找出第一个相等或不相等的字符。


3

例:MOV SI,2050H

MOV DI,3000H

MOV CX,20

CLD

REPZ CMPSB ;

JNZ NEQ;

..

..

NEQ:

(SI)与(DI)相比,如ZF=1继续比较。(SI)+1、(DI)+1,(CX)-1,当CX=0或ZF=0时,停止比较。(CX=0不影响ZF)


3

编程比较从逻辑地址2000H:100H开始的10个字节与逻辑地址4000H:200H开始的10个字节是否对应相等,相等则转DONE。

MOV AX,2000H

MOV DS,AX

MOV AX,4000H

MOV ES,AX

MOV DI, 200H

MOV SI, 100H


3

CLD

MOV CX,10

REPZ CMPSB

JZ DONE

RET

DONE ┇


3

RAM

XX

0400

XX

XX

XX

12

0E2D

ROM

23

34

45

例:判断是否加电成功

MOV SI, 0E2DH

MOV DI, 0400H

CLD

MOV CX,0004

REPZ CMPSB

JZ DONE

RET

DONE:


3 scas

3、字符串搜索指令 SCAS

  • 串搜索指令 SCAS

    其功能是把AL或AX中的内容与ES段由DI指定的一个字节数据或字数据进行比较,寻找与AL或AX内容相等或不相等的数据。


3

例:MOV DI,2000H

MOV AL,FFH

MOV CX,1000H

CLD

REPNZ SCASB ;

JZ EXC;

..

..

EXC:

AL与(DI)相比,如ZF=0继续比较。 (DI)+1,(CX)-1,

当CX=0或ZF=1时,停止比较。(CX=0不影响ZF)


3

从逻辑地址9000H:100H开始的10个单元中如果有一个单元的内容为2CH,则BX加1。

MOV AX, 9000H

MOV ES,AX

MOV DI,100H

CLD

MOV CX,10

MOV AL,2CH

REPNZ SCASB

JNZ AAA

INC BX

AAA:┇


3

4、取字符串指令

  • 取字符串指令 LODSB/LODSW

    其功能是把位于DS段由SI指定内存单元的内容取到寄存器AL或AX中。指令不影响状态标志位。一般不用重复前缀,可自动改变地址。


3

举例:

将100H:20H单元开始的10个字节的内容均加5。

CLD

MOV CX,10

MOV AX,100H

MOV DS,AX

MOV SI,20H

LL1: LODSB

ADD AL,5

MOV [SI-1],AL

DEC CX

JNZ LL1

HLT


3

5、存字符串指令

  • 存字符串指令 STOSB/STOSW

    其功能是把寄存器AL或AX中的内容存到ES段由DI指定的内存单元。指令不影响状态标志位。可用重复前缀。

    例: MOV DI,2300H

    CLD

    MOV CX,100H

    XOR AX,AX

    REP STOSW


3

六、 子程序指令

  • 子程序是完成特定功能的一段程序

  • 当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行

  • 当运行完子程序功能后,采用RET返回指令回到主程序继续执行

演示

  • 转移指令有去无回

  • 子程序调用需要返回,

  • 其中利用堆栈保存返回地址


1 call

1. 子程序调用指令CALL

  • CALL指令分成4种类型(类似JMP)

    CALL label;段内调用、直接寻址

    CALL r16/m16;段内调用、间接寻址

    CALL far ptr label;段间调用、直接寻址

    CALL far ptr mem;段间调用、间接寻址

  • CALL指令需要保存返回地址:

    • 段内调用——入栈偏移地址IP

      SP←SP-2,SS:[SP]←IP

    • 段间调用——入栈偏移地址IP和段地址CS

      SP←SP-2,SS:[SP]←CS

      SP←SP-2,SS:[SP]←IP


2 ret

2. 子程序返回指令RET

  • 根据段内和段间、有无参数,分成4种类型

    RET;无参数段内返回

    RET i16;有参数段内返回

    RET;无参数段间返回

    RET i16;有参数段间返回

  • 需要弹出CALL指令压入堆栈的返回地址

    • 段内返回——出栈偏移地址IP

      IP←SS:[SP], SP←SP+2

    • 段间返回——出栈偏移地址IP和段地址CS

      IP←SS:[SP],SP←SP+2

      CS←SS:[SP],SP←SP+2


Ascii

例、 十六进制转换为ASCII码的子程序

;子程序:将DL低4位的一位16进制数转换成ASCII码

htoascproc

and dl,0fh;只取DL的低4位

or dl,30h;DL高4位变成3

cmp dl,39h;是0~9,还是0Ah~0Fh ?

jbe htoend;是0~9,转移

add dl,7;是0Ah~0Fh,加上7

htoend:ret;子程序返回

htoascendp

转换原理

;主程序:调用子程序

mov dl,28h

call htoasc


3

3、 中断指令和系统功能调用

  • 中断(Interrupt)是又一种改变程序执行顺序的方法

  • 中断指令有3条:

    INT i8 IRET INTO

  • 本节主要掌握类似子程序调用指令的中断调用指令INT i8,进而掌握系统功能调用


3

七、 处理器控制类指令

  • 处理器控制类指令用来控制CPU的状态,使CPU暂停、等待或空操作等

    NOP;空操作指令,等同于“xchg ax,ax”指令

    SEG:;段超越前缀指令:CS:,SS:,DS:,ES:

    HLT;暂停指令:CPU进入暂停状态

  • 还有其他指令:

    LOCK ESC WAIT


3

标志操作指令

  • STC ;CF=1

  • STD ;DF=1

  • STI ;IF=1

  • CLC ;CF=0

  • CLD ;DF=0

  • CLI ;IF=0

  • CMC ;CF取反


3

第2章:总结

  • 本章展开了8088CPU16位指令系统的常用指令

  • 希望大家就如下几个方面进行一下总结:

    • 操作数寻址方式和目的地址寻址方式

    • 指令支持的操作数形式

    • 常用指令的助记符和功能

    • 指令对标志的影响

  • 通过复习整理,形成指令系统的整体概念,进而掌握常用指令

指令执行


3

第3章:习题

1.8086常用的寻址方式有哪些?哪几种寻址方式的指令执行速度快?

2.如在指令中不具体指明段寄存器,那么段地址如何确定?

3.假设DS=3000H,BX=0870H,SI=010CH,d=45h

以MOV指令为例,写出各种寻址方式下的指令形式,并求出数据的有效地址和物理地址。

4.请指出下列指令中源操作数的寻址方式

⑴ MOV SI,120 ⑵ MOV BP,[BX]

⑶ MOV AX,CX ⑷ POP BX


3

⑸ AND DL,[BX+SI+30H]

⑹ XCHG AL,BUF

5.请指出如下程序段中每条逻辑指令执行后标志ZF、SF和PF的状态

MOV AL,0AH

AND AL,0FH

OR AL,4BH

XOR AL,AL


3

6.判断指令的对错,说明错误指令出错原因

⑴ MOV [SP] ,BX ⑵ MOV CX,BX

⑶ JMP BX ⑷ XCHG [SI],WED

⑸ SHL AX,CX ⑹ XCHG ES:[BX],AL

⑺ LEA AX,[BX+SI] ⑻ IN BL,DX

⑼ PUSH CS ⑽ MOV DH,345H

7.利用三种方法实现内存DS段2000H和2100H的两个字单元的内容互换。


3

8.已知(SP)=2800H,(AX)=0010H,(BX)=0FA0H,

(CX)=1002H。求执行下列程序段后SP、AX、BX、CX的内容

PUSH AX

PUSH BX

PUSH CX

POP BX

POP AX


3

9.分析程序执行后AX=?CF=?AF=?

MOV AX, 2608H

MOV BL, 95H

ADD AL, BL

AAA

10.分析程序执行后AX=?CF=?

MOV AX, 1E54H

STC

MOV DX, 95H

XOR DH, 0FFH

SBB AX, DX


3

  • MOV AL , 67H ; AL=

    NEG AL ; AL=

    OR AL , 0A0H ; AL=

    AND AL , 0F5H ; AL=

    XOR AL , 0FH ; AL=

  • MOV AX, 3267H

    ROL AX, 1

    ADC AL, AH

    MOV [3200H],AX

    执行上述指令后AX=? [3200H]=? [3201H]=?


3

13. 已知DS=1000H,将下面程序段执行后的结果填入相应的寄存器和内存单元。

MOV CL,04H

MOV AX,0ABCDH

SHR AX,CL

MOV SI,2000H

MOV [SI],AX

则 CL= AX=

SI= [12001H]=


3

14.设DS段2100H单元的内容是32H

MOV BX,2100H

MOV AL,[BX]

MOV AH,0

MOV SP, 3210H

XCHG AX,BX

PUSH AX

PUSH BX

POP CX

求执行程序段后AX、BX、XC、SP的内容。


3

  • MOV AX, 0478H

    MOV BX, 2346H

    SUB AL,BL

    ADC BH,AH

    执行指令后AX= BX=

    16.已知DS段3200H开始的内存中顺序存放着十六进制基数(0~F)的ASC码

    MOV BX,3200H

    MOV AL,06H

    MOV CL,03H


3

ADD AL,CL

MOV CL,AL

XLAT

XCHG CL,AL

MOV CL,AL

INC AL

INC AL

XLAT

HLT

执行上述指令后 AL= CL= BX=


3

  • MOV AX, 4737H

    MOV BX, 2856H

    SUB BH, AH

    ADC AL, BL

    DAA

    执行上述程序后 AX= BX=

    18. 已知程序段如下:

    CMP AX, CX

    JNC K1

    JNO K2

    JMP K3


3

假设有以下三组AX、CX值,那么在程序执行后,分别转向哪里?

⑴ (AX)=E301H (CX)=8F50H

⑵ (AX)=8F50H (CX)= E301H

⑶ (AX)=147BH (CX)=80DCH


  • Login