第 2 章 8086指令系统

87
第 2 第 8086 第第第2.1 8086 第第第第第 2.2 8086 第第第第第 2.3 第第 第第第第 2.4 第第第第第第第 2.5 第第第第第第 2.6 第第第第第第 2.7 第第第第第第第 2.8 第第第第第第第第

description

第 2 章 8086指令系统. 2.1 8086的寄存器组 2.2 8086的寻址方式 2.3 数据传送类指令 2.4 算术运算类指令 2.5 位操作类指令 2.6 串操作类指令 2.7 控制转移类指令 2.8 处理机控制类指令. 2.6 串操作类指令. 针对 串数据类型 进行操作 采用特殊的数据 串寻址方式 5条指令和3个重复前缀 1、串传送: MOVS 2、串存储: STOS 3、串读取: LODS 4、串比较: CMPS 5、串扫描: SCAS - PowerPoint PPT Presentation

Transcript of 第 2 章 8086指令系统

Page 1: 第 2 章  8086指令系统

第 2 章 8086 指令系统

2.1 8086 的寄存器组2.2 8086 的寻址方式2.3 数据传送类指令2.4 算术运算类指令2.5 位操作类指令2.6 串操作类指令2.7 控制转移类指令2.8 处理机控制类指令

Page 2: 第 2 章  8086指令系统

2.6 串操作类指令•针对串数据类型进行操作•采用特殊的数据串寻址方式•5 条指令和 3 个重复前缀1 、串传送: MOVS

2 、串存储: STOS

3 、串读取: LODS

4 、串比较: CMPS

5 、串扫描: SCAS

6 、串重复前缀: REP REPZ/REPE REPNZ/REPNE

本节要求

Page 3: 第 2 章  8086指令系统

2.6 节要求

•串操作指令是 8086 指令系统中比较独特的一类指令,在操作主存连续区域的数据时,特别好用、因而常用。

重点掌握: MOVS STOS LODS

CMPS SCAS REP

一般了解: REPZ/REPE REPNZ/REPNE

Page 4: 第 2 章  8086指令系统

串数据类型

•串操作指令的操作数是主存中连续存放的数据串——即在连续的主存区域中,字节或字的序列。

•操作对象是以字( W )为单位的字串,或是以字节( B )为单位的字节串。

Page 5: 第 2 章  8086指令系统

串寻址方式

•源操作数用寄存器 SI 寻址,默认在数据段 DS 中,但允许段超越: DS : [SI]

•目的操作数用寄存器 DI 寻址,默认在附加段 ES中,不允许段超越: ES : [DI]

•每执行一次串操作指令, SI和 DI 将自动修改:±1 (对于字节串)或 ±2 (对于字串);执行指令 CLD 指令后, DF = 0 ,地址指针增 1 或

2 ;执行指令 STD 指令后, DF = 1 ,地址指针减 1 或

2 。

Page 6: 第 2 章  8086指令系统

串传送 MOVS(move string)

把字节或字操作数从主存的源地址传送至目的地址

MOVSB ;字节串传送: ES:[DI]←DS:[SI],

; SI←SI±1, DI←DI±1

MOVSW ;字串传送: ES:[DI]←DS:[SI],

; SI←SI±2, DI←DI±2

功能

演示

功能

演示

指令应用程序指令应用程序

功能

演示

功能

演示

Page 7: 第 2 章  8086指令系统

例 2.36 :字节串传送mov si,offset sourcemov di,offset destinationmov cx,100 ; cx← 传送次数cld ;设置 DF=0 ,实现地址增加

again: movsb ;传送一个字节(可否用movsw)dec cx ;传送次数减 1jnz again ;判断传送次数 cx 是否为 0;不为 0( ZF=0),则转移 again 位置执

行;;否则,结束

操作

√ offset是什么?√ 该段程序的功能是什么?

Page 8: 第 2 章  8086指令系统

串存储 STOS( store string)

把 AL或 AX 数据传送至目的地址

STOSB ;字节串存储: ES:[DI]←AL,

; DI←DI±1

STOSW ;字串存储: ES:[DI]←AX,

; DI←DI±2

指令应用程序指令应用程序

Page 9: 第 2 章  8086指令系统

例 2.37 :串存储mov ax,0mov di,0mov cx,8000h; cx← 传送次数( 32×1024 )cld ; DF=0 ,地址增加

again: stosw ;传送一个字dec cx ;传送次数减 1jnz again ;判断传送次数 cx 是否为 0

√ 程序段功能是什么 √可以将 CLD 改为 STD 吗√ 可不用给 DI 赋值吗 √如何改用 STOSB

Page 10: 第 2 章  8086指令系统

串读取 LODS ( load string)

把指定主存单元的数据传送给 AL或 AX

LODSB ;字节串读取: AL←DS:[SI],

; SI←SI±1

LODSW ;字串读取: AX←DS:[SI],

; SI←SI±2

指令应用程序指令应用程序

Page 11: 第 2 章  8086指令系统

例 2.38 :串读取(上段:准备)

mov si,offset blockmov di,offset dplusmov bx,offset dminusmov ax,dsmov es,ax; 所 有 数 据 都 在 一 个 段 中 , 所 以 设 置

es=dsmov cx,count ; cx← 字节数cld

√ 该段程序的功能是什么?

Page 12: 第 2 章  8086指令系统

例 2.38 :串读取(下段:判断)

go_on: lodsb ;从 block 取出一个数据test al,80h;检测符号位,判断是正是负jnz minus ;符号位为 1 ,是负数,转向 minus

stosb ;符号位为 0 ,是正数,存入 dplus

jmp again ;程序转移到 again 处继续执行minus:xchg bx,di

stosb ;把负数存入 dminus

xchg bx,diagain: dec cx ;字节数减 1

jnz go_on ;完成正负数据分离

Page 13: 第 2 章  8086指令系统

串比较 CMPS( compare string)

将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系。

CMPSB ;字节串比较: DS:[SI]- ES:[DI],

; SI←SI±1, DI←DI±1

CMPSW ;字串比较: DS:[SI]- ES:[DI],

; SI←SI±2, DI←DI±2

指令应用程序指令应用程序

Page 14: 第 2 章  8086指令系统

例 2.39a :比较字符串是否相同mov si,offset string1mov di,offset string2mov cx,countcld

again: cmpsb ;比较两个字符jnz unmat ;有不同字符,转移到 unmatdec cxjnz again ; 进行下一个字符的比较mov al,0 ; 字符串相等,设置 00h 标记jmp output ; 转向 output

unmat: mov al,0ffh ;设置 ffh 标记output: mov result,al ;输出结果标记

Page 15: 第 2 章  8086指令系统

串扫描 SCAS( scan string)

将 AL/AX 减去至目的操作数,以便设置标志,进而比较 AL/AX 与操作数之间的关系。

SCASB ;字节串扫描: AL- ES:[DI],

; DI←DI±1

SCASW ;字串扫描: AX- ES:[DI],

; DI←DI±2

指令应用程序指令应用程序

Page 16: 第 2 章  8086指令系统

例 2.40a :查找字符串中的空格mov di,offset stringmov al,20hmov cx,countcld

again: scasb ;搜索jz found ;为 0( ZF=1),发现空

格dec cx ;不是空格jnz again;搜索下一个字符... ;不含空格,则继续执行

found: ...

Page 17: 第 2 章  8086指令系统

重复前缀指令( repeat)串操作指令执行一次,仅对数据串中的一个字节或字

量进行操作。但是串操作指令前,都可以加一个重复前缀,实现串操作的重复执行。重复次数隐含在 CX 寄存器中。

重复前缀分 2 类, 3 条指令:•配合不影响标志的 MOVS、 STOS (和 LODS )指

令的 REP前缀

•配 合 影 响 标 志 的 CMPS 和 SCAS 指 令 的 REPZ和

REPNZ前缀

Page 18: 第 2 章  8086指令系统

REP 重复前缀指令

•REP 前缀可以理解为:当数据串没有结束( CX≠0),则继续传送•例2.36和例2.37中,程序段的最后 3 条指令,可以分别替换为:REP MOVSB 和 REP STOSW

REP ;每执行一次串指令, CX 减 1

;直到 CX= 0 ,重复执行结束

Page 19: 第 2 章  8086指令系统

REPZ/REPNZ 重复前缀指令

•REPZ/REPE—— 当数据串没有结束( CX≠0),并且串相等( ZF= 1),则继续比较。

•REPNZ/REPNE—— 当 数 据 串 没 有 结 束( CX≠0),并且串不相等( ZF= 0),则继续比较。

repz 用于例2.39 repnz 用于例2.40

REPZ ;每执行一次串指令, CX 减 1

;并判断 ZF 是否为 0 ,;只要 CX= 0或 ZF= 0 ,重复执行

结束REPNZ ;每执行一次串指令, CX 减 1

;并判断 ZF 是否为 1 ,;只要 CX= 0或 ZF= 1 ,重复执行

结束

Page 20: 第 2 章  8086指令系统

例 2.39b :比较字符串是否相同mov si,offset string1mov di,offset string2mov cx,countcldrepz cmpsb ;重复比较两个字符jnz unmat ;字符串不等,转移到 unmatmov al,0 ; 字符串相等,设置 00h 标记jmp output ; 转向 output

unmat: mov al,0ffh ;设置 ffh 标记output: mov result,al ;输出结果标记

如何理解 REPZ 对比例 2.39a

Page 21: 第 2 章  8086指令系统

例 2.40b :查找字符串中的空格mov di,offset stringmov al,20hmov cx,countcldrepnz scasb ;搜索jz found ;为 0( ZF=1),发现空

格... ;不含空格,则继续执行

found: ...

对比例 2.40a

Page 22: 第 2 章  8086指令系统

2.7 控制转移类指令

•改变 IP (和 CS )值,实现程序执行顺序的改变•用于实现分支、循环、过程等程序结构

1 、无条件转移: JMP

2 、条件转移: Jcc

3 、循环: LOOP LOOPZ/LOOPE LOOPNZ/LOOPNE

4 、子程序: CALL RET

5 、中断: INT i8 IRET INTO

•利用中断指令,可以实现系统功能调用

本节要求

Page 23: 第 2 章  8086指令系统

2.7 节要求

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

重点掌握: JMP Jcc LOOP

CALL RET INT n IRET

一般了解: LOOPZ/LOOPE LOOPNZ/LOOPNE INTO

•另外,本节还要求掌握常用 DOS 系统功能调用

Page 24: 第 2 章  8086指令系统

无条件转移指令 JMP( jump)

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

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

目标地址的寻址方式:直接寻址和间接寻址目标地址的范围:段内转移和段间转移•JMP 指令分成 4种类型:⑴段内转移、直接寻址 ⑵段内转移、间接寻址⑶段间转移、直接寻址⑷段间转移、间接寻址

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

Page 25: 第 2 章  8086指令系统

目标地址的寻址方式( JMP 指令)

•直接寻址方式:转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式。

•间接寻址方式:转移地址在寄存器或主存单元中,就是通过

寄存器或存储器的间接寻址方式。

Page 26: 第 2 章  8086指令系统

•段内转移——近转移( near jump)在当前代码段 64KB范围内转移( ±32KB范围),不需要更改 CS 段地址,只要改变 IP偏移地址。如果转移范围可以用一个字节( -128 ~ +127 )表

达,可以形成所谓的“短转移 short jump”。

•段间转移——远转移( far jump)从当前代码段跳转到另一个代码段,需要更改 CS 段地址和 IP偏移地址。目标地址必须用一个 32 位数表达,叫做 32 位远指

针,它就是逻辑地址。

目标地址的范围( JMP 指令)

实际编程时,汇编程序会根据目标地址的距离,

自动处理成短转移、近转移或远转移。

程序员也可以用操作符 short、 near ptr 或 far ptr 强制。

Page 27: 第 2 章  8086指令系统

段内转移、直接寻址JMP label ; IP←IP+ 位移量•位移量是紧接着 JMP 指令后的那条指令的偏移地

址,到目标指令的偏移地址的地址位移。•当向地址增大方向转移时,位移量为正;向地址

减小方向转移时,位移量为负。jmp again ;转移到 again 处继续执行……

again: dec cx ;标号 again 的指令……jmp output ;转向 output……

output: mov result,al ;标号 output 的指令

Page 28: 第 2 章  8086指令系统

段内转移、间接寻址JMP r16/m16 ; IP←r16/m16•将一个 16 位寄存器或主存字单元内容送入 IP 寄存

器,作为新的指令指针,但不修改 CS 寄存器的内容。

jmp ax ; IP←AXjmp word ptr [2000h]; IP←[2000h]

Page 29: 第 2 章  8086指令系统

段间转移、直接寻址JMP far ptr label; IP←label 的偏移地址; CS←label 的段地址•将标号所在段的段地址作为新的 CS 值,标

号在该段内的偏移地址作为新的 IP 值;这样,程序跳转到新的代码段执行。

jmp far ptr otherseg;远转移到代码段 2的 otherseg

Page 30: 第 2 章  8086指令系统

段间转移、间接寻址JMP far ptr mem; IP←[mem], CS←[mem+2]•用一个双字存储单元表示要跳转的目标地

址。这个目标地址存放在主存中连续的两个字单元中的,低位字送 IP 寄存器,高位字送 CS寄存器。

mov word ptr [bx],0mov word ptr [bx+2],1500hJMP far [bx] ;转移到 1500h:0

Page 31: 第 2 章  8086指令系统

条件转移指令 Jcc

•指定的条件 cc 如果成立,程序转移到由标号 label 指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令。

•操作数 label 是采用短转移,称为相对寻址方式。•Jcc 指令不影响标志,但要利用标志(表2.4)。根据利

用的标志位不同, 17 条指令分成 4种情况:⑴ 判断单个标志位状态 ⑵ 比较无符号数高低⑶ 比较有符号数大小 ⑷ 判断计数器CX为0

Jcc label ;条件满足,发生转移: IP←IP+ 8 位位移量

;条件不满足,顺序执行。

Page 32: 第 2 章  8086指令系统

相对寻址方式( Jcc)

•Jcc 指令的操作数 label 是一个标号,表示目标地址。他是一个 8 位位移量,表示 Jcc 指令后的那条指令

的偏移地址,到目标指令的偏移地址的地址位移。8 位位移量是相对于当前 IP 的,且距当前 IP 地址 -

128 ~ +127 个单元的范围之内,属于段内短距离转移。Jcc 目标地址就采用这种相对寻址方式。•Jcc 指令为 2 个字节,条件不满足时的顺序执行就

是当前指令偏移指针 IP 加 2 。

Page 33: 第 2 章  8086指令系统

判断单个标志位状态的 Jcc 指令这组指令单独判断 5 个状态标志之一。

⑴ JZ/JE和 JNZ/JNE利用零标志 ZF ,判断结果是否为零(或相等)⑵JS和 JNS利用符号标志 SF ,判断结果是正是负⑶JO和 JNO利用溢出标志 OF ,判断结果是否产生溢出⑷JP/JPE和 JNP/JPO利用奇偶标志 PF ,判断结果中“ 1” 的个数是偶是

奇⑸JC/JB/JNAE和 JNC/JNB/JAE利用进位标志 CF ,判断结果是否进位或借位

例 2.39b

例 2.41

例 2. 42

例 2.43

例 2.44

Page 34: 第 2 章  8086指令系统

例 2.39b: JZ和 JNZ 指令repz cmpsb ;重复比较两个字符jnz unmat; ZF= 0 (不等),转移到 unmatmov al,0 ;顺序执行(相等)jmp output

unmat: mov al,0ffhoutput: mov result,al

repz cmpsb ;重复比较两个字符jz mat ; ZF= 1 (相等),转移到 matmov al,0ffh ;顺序执行(不等)jmp output

mat: mov al,0output: mov result,al

Page 35: 第 2 章  8086指令系统

例 2.41: JS和 JNS 指令

计算 |X- Y| (绝对值), X和 Y 为存放于 X 单元和 Y 单元的 16 位操作数,结果存入 result

mov ax,Xsub ax,Yjns nonnegneg ax ; neg 是求补指令

nonneg: mov result,ax

Page 36: 第 2 章  8086指令系统

例 2.42: JO和 JNO 指令

计算 X- Y, X和 Y 为存放于 X 单元和 Y 单元的16 位操作数。若溢出,则转移到 overflow 处理

mov ax,Xsub ax,Yjo overflow... ;无溢出,结果正确

overflow: … ;有溢出处理

Page 37: 第 2 章  8086指令系统

例 2.43: JP和 JNP 指令

设字符的 ASCII码在 AL 寄存器中,将字符加上奇校验位(在字符 ASCII码中为“ 1” 的个数已为奇数时,则令其最高位为“ 0” ;否则令最高位为“ 1” )

and al,7fh;最高位置“ 0”,同时判断“ 1”的个数

jnp next;个数已为奇数,则转向 next

or al,80h ;否则,最高位置“ 1”next: ...

Page 38: 第 2 章  8086指令系统

例 2.44: JC和 JNC 指令

记录 BX 中 1 的个数xor al,al

again: test bx,0ffh ;等价于 cmp bx,0je nextshl bx,1jnc againinc aljmp again

next: ... ; AL保存 1 的个数

Page 39: 第 2 章  8086指令系统

比较无符号数高低的 Jcc 指令

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

( Equal)两数的高低分成 4种关系:

⑴ 低于(不高于等于): JB( JNAE)⑵ 不低于(高于等于): JNB( JAE)⑶ 低于等于(不高于): JBE( JNA)⑷ 不低于等于(高于): JNBE( JA )

例 2.45a

Page 40: 第 2 章  8086指令系统

cmp ax,bx ;比较 ax和 bx

jnb next ;若 ax > bx , 转 移 到next

xchg ax,bx ;若 ax< bx ,交换next: ...

例 2.45a:比较无符号数的高低

结果: AX保存较大的数

Page 41: 第 2 章  8086指令系统

比较有符号数大小的 Jcc 指令

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

两数的大小分成 4种关系:

⑴ 小于(不大于等于): JL( JNGE)⑵ 不小于(大于等于): JNL( JGE)⑶ 小于等于(不大于): JLE( JNG)⑷ 不小于等于(大于): JNLE( JG )

例 2.45b

Page 42: 第 2 章  8086指令系统

cmp ax,bx ;比较 ax和 bx

jnl next ;若 ax > bx , 转 移 到next

xchg ax,bx ;若 ax< bx ,交换next: ...

例 2.45b:比较有符号数的大小

结果: AX保存较大的数

Page 43: 第 2 章  8086指令系统

计数器 CX 为 0 转移的 JCXZ 指令

条件转移指令中还有一条较特殊的指令,因为 CX 寄存器通常在程序中用做计数器,JCXZ 指令就可以用来判断计数是否为 0 。

实例

JCXZ label ; CX= 0 ,发生转移: IP←IP+ 8 位位移量

; CX≠0 ,顺序执行。

Page 44: 第 2 章  8086指令系统

计数器为 0 的判断

mov cx,100again: jcxz next ;判断传送次数,为 0退出循环

movsbdec cx ;传送次数减 1jmp again

next: ...

mov cx,100again: movsb

dec cx ;传送次数减 1jnz again ;判断传送次数是否为 0 ,不为 0 转移

Page 45: 第 2 章  8086指令系统

循环指令( loop)循环指令利用 CX计数器自动减 1 ,方便实现计数

循环的程序结构。 label 操作数采用相对寻址方式。

LOOP label ; CX←CX- 1 ,; CX≠0 ,循环到标号 label

LOOPZ label ; CX←CX- 1 ,

;若 CX≠0且 ZF= 1 ,循环到标号label

LOOPNZ label; CX←CX- 1 ,

;若 CX≠0且 ZF= 0 ,循环到标号label

实例

Page 46: 第 2 章  8086指令系统

mov cx,count ;设置循环次数mov si,offset stringxor bx,bx ; bx清 0 ,用于记录空格数mov al,20h

again: cmp al,es:[si]jnz next ; ZF=0 ,非空格,转移inc bx ; ZF=1 ,是空格,个数加

1next: inc si

loop again;字符个数减 1 ,不为 0 继续循环mov result,bx ;保存结果

例 2.46 :记录字符串中的空格字符个数

Page 47: 第 2 章  8086指令系统

子程序指令

•子程序是完成特定功能的一段程序。•当主程序(调用程序)需要执行这个功能时,采用 CALL调用指令转移到该子程序的起始处执行;当运行完子程序功能后,采用 RET返回指令回到主程序继续执行。

功能演示功能演示 实例说明实例说明

Page 48: 第 2 章  8086指令系统

子程序调用指令 CALL

•类似 JMP 指令, CALL 指令分成 4种类型:CALL label ;段内调用、直接寻址CALL r16/m16 ;段内调用、间接寻址CALL far ptr label ;段间调用、直接寻址CALL far ptr mem ;段间调用、间接寻址•但不同于 JMP 指令, CALL 指令需要保存返回地址:段内调用——入栈偏移地址 IP:SP←SP- 2, SS:[SP]←IP

段间调用——入栈偏移地址 IP 和段地址 CS:SP←SP- 2, SS:[SP]←IP; SP←SP- 2, SS:[SP]←CS

Page 49: 第 2 章  8086指令系统

子程序返回指令 RET

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

RET ;无参数段内返回RET i16 ;有参数段内返回RET ;无参数段间返回RET i16 ;有参数段间返回•RET 指令弹出 CALL 指令压入堆栈的返回地址:段内返回——出栈偏移地址 IP:IP←SS:[SP] , SP←SP+ 2

段间返回——出栈偏移地址 IP 和段地址 CS:IP←SS:[SP], SP←SP+ 2; CS←SS:[SP], SP←SP+ 2

i16参数的作用

Page 50: 第 2 章  8086指令系统

;主程序mov al,0fh ;提供参数 ALcall htoasc ;调用子程序...

;子程序:将 AL低 4 位的一位 16 进制数转换成 ASCII码htoasc: and al,0fh ;只取 al 的低 4 位

or al,30h ; al高 4 位变成 3cmp al,39h ;是 0~ 9 ,还是 0Ah~ 0Fhjbe htoendadd al,7 ;是 0Ah~ 0Fh ,加上 7 (表

1.1 )htoend: ret ;子程序返回

例 2.47 :主程序与子程序

Page 51: 第 2 章  8086指令系统

中断指令( Interrupt)

•中断是又一种改变程序执行顺序的方法•中断分内部和外部中断,具有多种中断类型•中断的指令有 3 条:

INT i8IRETINTO

•本节主要掌握类似子程序调用指令的中断调用指令 INT i8 ,进而学习使用 DOS 功能调用。

•其他有关中断的技术将在第 4 章展开。

Page 52: 第 2 章  8086指令系统

中断指令 INT

INT i8 ;中断调用指令:产生 i8 号中断

IRET ;中断返回指令:实现中断返回

INTO ;溢出中断指令:;若溢出标志 OF=1 ,产生 4 号

中断;;否则顺序执行

Page 53: 第 2 章  8086指令系统

系统功能调用

•21H 号中断是 DOS提供给用户的用于调用系统功能的中断,它有近百个功能供用户选择使用,主要包括设备管理、目录管理和文件管理三个方面的功能。

•ROM-BIOS也以中断服务程序的形式,向程序员提供系统的基本输入输出程序。

•汇编语言程序设计需要采用系统的各种功能程序。•充分利用操作系统提供的资源是程序设计的一个

重要方面,需要掌握。

怎么使用呢

Page 54: 第 2 章  8086指令系统

功能调用的格式

通常按照如下 4 个步骤进行:⑴ 在 AH 寄存器中设置系统功能调用号;⑵ 在指定寄存器中设置入口参数;⑶ 执行指令 INT 21H (或 ROM-BIOS 的中断向

量号)实现中断服务程序的功能调用;⑷ 根据出口参数分析功能调用执行情况。

输入输出类功能调用

Page 55: 第 2 章  8086指令系统

输入输出类功能调用

•向显示器输出字符⒈ 字符的输出

⒉ 字符串的输出•从键盘输入数据⒊ 字符的输入

⒋ 字符串的输入

⒌ 按键的判断

裸机

汇编语言程序

Page 56: 第 2 章  8086指令系统

字符输出的功能调用( DOS )

•DOS 功能调用 INT 21H 的输出字符功能: AH= 02H

入口参数: DL=字符的 ASCII码在显示器当前光标位置显示给定的字符,光标右移

一个字符位置。如按 Ctrl-Break或 Ctrl-C 则退出。•例 2.48 :在当前显示器光标位置显示一个问号

mov ah,02h ;设置功能号: ah←02hmov dl,'?' ;提供入口参数: dl←'?'int 21h ; DOS 功能调用:显示 操作

ROM-BIOS调用

Page 57: 第 2 章  8086指令系统

字符输出的功能调用( ROM-BIOS )

•显示器功能调用 INT 10H 的字符显示功能: AH=0EH

入口参数: AL=字符的 ASCII码,BL=字符的颜色值(图形方式),BH=页号(字符方式)。通常使 BX = 0。将字符按原属性在光标处显示,光标自动移到下一个

字符位置。•进 行 字 符 输 出 时 , 当 输 出 响铃字 符 ( ASCII 码

07H),退格字符( 08H),回车字符( 0DH )和换行字符( 0AH )时,这两个功能调用可以自动识别并能进行相应处理。

例2.51

Page 58: 第 2 章  8086指令系统

字符串输出的功能调用( DOS )

•DOS 功能调用 INT 21H 的输出字符串功能:AH= 09H

入口参数:DS:DX=欲显示字符串在主存中的首地址,字符

串应以 $ ( 24H )结束

•可以输出回车( 0DH )和换行( 0AH )字符产生回车和换行的作用

例2.49

Page 59: 第 2 章  8086指令系统

例 2.49 :字符串输出

String db 'Hello,Everybody !',0dh,0ah,'$';在数据段定义要显示的字符串...mov ah,09h ;设置功能号: ah←09hmov dx,offset string;提供入口参数: dx← 字符串的偏移地址int 21h ; DOS 功能调用:显示

操作

Page 60: 第 2 章  8086指令系统

•DOS 功能调用 INT 21H 的输入字符功能: AH=01H

出口参数: AL=字符的 ASCII码调用此功能时,若无键按下,则会一直等待,直到

按键后才读取该键值。•例 2.50 :判断按键是“ Y”还是“ N” (大写)getkey: mov ah,01h ;设置功能号: ah←01h

int 21h ;功能调用cmp al,’Y’ ;处理出口参数 alje yeskey ;是“ Y”

cmp al,’N’je nokey ;是“ N”

jne getkey

字符输入的功能调用( DOS )

ROM-BIOS调用

Page 61: 第 2 章  8086指令系统

字符输入的功能调用( ROM-BIOS )

• 键盘功能调用 INT 16H 的读取键值功能: AH=0

出口参数: AX=键值代码对于标准 ASCII码按键: AL= ASCII码, AH=扫描码;

对于扩展按键: AL= 00H, AH=键扩展码;对于 alt+小键盘数字按键, AL= ASCII码, AH=

00H。此功能类同 DOS 功能 01H ,会一直等待按键。

例2.51

Page 62: 第 2 章  8086指令系统

例 2.51 :字符输入和输出

mov ah,0 ;键盘功能调用( int 16h)int 16h ; al←按键的 ASCII码mov bx,0 ;显示功能调用( int 10h)mov ah,0ehint 10h ;显示

Page 63: 第 2 章  8086指令系统

字符串输入的功能调用( DOS )

•DOS 功能调用 INT 21H 的输入字符串功能: AH= 0AH

入口参数: DS:DX=缓冲区首地址执行该功能调用时,用户按键,最后用回车确认。缓冲区第 1 字节事先填入最多欲接收的字符个数( 1~255 ),第 2 字节将存放实际输入的字符个数(不包括回车符),第 3 字节开始将存放输入的字符串。实际输入的字符数多于定义数时,多出的字符丢掉,且响铃。扩展 ASCII码(如功能键等)占两个字节,第 1 个为 0 。本调用可执行全部标准键盘编辑命令;用户按回车键结束输

入,如按 Ctrl-Break或 Ctrl-C 则中止。例2.52

Page 64: 第 2 章  8086指令系统

例 2.52 :字符串输入buffer db 81;定义缓冲区,第 1 个字节填入可能输入的最大字符数

db 0;第 2 个字节将用于存放实际输入的字符数

db 81 dup(0);第 3 个字节开始用于存放输入的字符串

...mov dx,seg buffer ;伪指令 seg 取得 buffer 的段地

址mov ds,dx ;设置数据段 DS

mov dx,offset buffermov ah,0ahint 21h

Page 65: 第 2 章  8086指令系统

按键判断的功能调用( DOS)

•DOS 功能调用 INT 21H 的键盘检测功能: AH =0BH

出口参数: AL= 0 ,当前没有按键;AL= FFH ,当前已经按键。

仅判断当前是否有按下的键,设置 AL 后退出。例 2.53 :实现按任意键继续

... ;提示“按任意键继续”getkey: mov ah,0bh

int 21hor al,al ; al=0?jz getkey ; al=0 ,没有按键,继续等待

ROM-BIOS调用

Page 66: 第 2 章  8086指令系统

按键判断的功能调用( ROM-BIOS)

•键盘功能调用 INT 16H 的判断按键功能: AH=1

出口参数:若标志 ZF = 1 ,则无键按下;若 ZF = 0 ,则说明有键按下,且 AX = 键值代码。此子功能仅判断是否按键,设置零位标志 ZF 后退

出。•这两个功能调用都不循环等待按键,即使有键按下,

键盘缓冲区仍然保留键值并且没有被清空,必要时必须用字符输入功能取走键值清空键盘缓冲区。

Page 67: 第 2 章  8086指令系统

2.8 处理机控制类指令

•对标志位进行设置的指令CLC STC CMC

CLD STD

CLI STI

•对 CPU状态进行控制的指令NOP CS: SS: DS: ES:

LOCK HLT ESC WAIT

本节要求

Page 68: 第 2 章  8086指令系统

2.8 节要求

这些指令在特定的情况下,必须使用。重点掌握: CLC STC CMC CLD STD

CS: SS: DS: ES:

特别熟悉: NOP CLI STI

一般了解: LOCK HLT ESC WAIT

Page 69: 第 2 章  8086指令系统

进位标志操作指令

CLC ;复位进位标志: CF←0

STC ;置位进位标志: CF←1

CMC ; 求反进 位 标 志 : CF← ~CF

用于任意设置进位标志。

Page 70: 第 2 章  8086指令系统

方向标志操作指令

CLD ;复位方向标志: DF←0

STD ;置位方向标志: DF←1

串操作指令中,需要使用。

Page 71: 第 2 章  8086指令系统

中断标志操作指令

CLI ;复位中断标志: DF←0

STI ;置位中断标志: DF←1

在编写中断服务程序时,需要控制可屏蔽中断的允许和禁止。

Page 72: 第 2 章  8086指令系统

空操作指令 NOP

NOP该指令不执行任何操作,但占用一个字节存储

单元,空耗一个指令执行周期。该指令常用于程序调试。例如:在需要预留指令空间时用 NOP填充,代

码空间多余时也可以用 NOP填充,还可以用 NOP实现软件延时。事实上, NOP和 XCHG AL,AL 的指令代码一

样。

Page 73: 第 2 章  8086指令系统

段超越前缀指令

CS: ;使用代码段的数据SS: ;使用堆栈段的数据DS: ;使用数据段的数据ES: ;使用附加段的数据在允许段超越的存储器操作数之前,使用段超越

前缀指令,将采用指定的段寄存器寻址操作数。

Page 74: 第 2 章  8086指令系统

封锁前缀指令

LOCK ;封锁总线这是一个指令前缀,可放在任何指令前。这个前缀使得在这个指令执行时间内, 8086 处

理器的封锁输出引脚有效,即把总线封锁,使别的控制器不能控制总线;直到该指令执行完后,总线封锁解除。

Page 75: 第 2 章  8086指令系统

暂停指令

HLT ;进入暂停状态暂停指令使 CPU 进入暂停状态,这时 CPU 不进

行任何操作。当 CPU 发生复位或来自外部的中断时, CPU脱离暂停状态。

HLT 指令可用于程序中等待中断。当程序中必须等待中断时,可用 HLT ,而不必用软件死循环。然后,中断使 CPU脱离暂停状态,返回执行 HLT 的下一条指令。

Page 76: 第 2 章  8086指令系统

交权指令ESC 6 位立即数 reg/mem;把浮点指令交给浮点处理器执行提高系统浮点运算能力的协处理器 8087 指令是

与 8086 的整数指令组合在一起的, 8086 主存中存储 8087 的操作码及其所需的操作数。当 8086 发现是一条浮点指令时,就利用 ESC 指令将浮点指令交给 8087 执行。实际编写程序时,一般采用易于理解的浮点指令助记符格式。

ESC 6,[SI] ;实数除法指令: FDIV dword ptr [SI]ESC 20H,AL;整数加法指令: FADD ST(0),ST

Page 77: 第 2 章  8086指令系统

等待指令

WAIT ;进入等待状态8086就是利用 WAIT 指令和测试引脚实现与 808

7 同步运行的。浮点指令经由 8086CPU 处理发往 8087 ,并与 80

86 本身的整数指令在同一个指令序列;而 8087 执行浮点指令较慢,所以 8086必须与 8087保持同步。

Page 78: 第 2 章  8086指令系统

第 2 章 总结

•本章详细而完整地介绍了 8086 的 16 位指令系统。•应该重点掌握常用的指令,同时要熟悉一些特殊

的指令、了解不常使用的指令的功能。•希望读者进行一下整理(总结):各种寻址方式指令支持的操作数形式指令对标志的影响常见编程问题

通过整理复习,形成指令系统的整体知识。

各节要求

各节要求

Page 79: 第 2 章  8086指令系统

第 2 章 要求

2.1 8086 的寄存器组2.2 8086 的寻址方式2.3 数据传送类指令2.4 算术运算类指令2.5 位操作类指令2.6 串操作类指令2.7 控制转移类指令2.8 处理机控制类指令

Page 80: 第 2 章  8086指令系统

2.1 节要求

•掌握 8 个 16 位通用寄存器•掌 握 5 个 状 态 标 志 :

CF、 ZF、 PF、 SF、 OF

•熟悉 3 个控制标志: DF、 TF、 IF

•掌握存储空间分段的概念•熟悉 4 个段寄存器和 3种逻辑段•能够采用段前缀指定数据所在的逻辑段

Page 81: 第 2 章  8086指令系统

2.2 节要求

•掌握操作数的寻址方式:立即数寻址寄存器寻址方式存储器寻址方式•熟悉 8086汇编语言指令格式•理解操作数的表达方法

Page 82: 第 2 章  8086指令系统

2.3 节要求

•传送指令是最常使用的一类指令。重点掌握: MOV PUSH POP

特别熟悉: XCHG XLAT LEA

一 般 了 解 : LAHF SAHF PUSHF POPF LDS

LES

以后展开: IN OUT

Page 83: 第 2 章  8086指令系统

2.4 节要求

•算术运算指令是经常使用的一类指令•请注意算术运算指令对标志的影响

重点掌握: ADD/ADC SUB/SBB INC/DEC CMP

比较熟悉: NEG MUL/IMUL DIV/IDIV

一般了解: CBW CWD

认真理解: DAA DAS AAA AAS AAM AAD

Page 84: 第 2 章  8086指令系统

2.5节要求

•这是一类常用的指令,都应该特别熟悉;同时,注意这些指令对标志位的影响。

逻辑运算: AND OR XOR NOT TEST

移位: SHL SHR SAR

循环移位: ROL ROR RCL RCR

Page 85: 第 2 章  8086指令系统

2.6 节要求

•串操作指令是 8086 指令系统中比较独特的一类指令,在操作主存连续区域的数据时,特别好用、因而常用。

重点掌握:MOVS STOS LODS

CMPS SCAS REP

一般了解:REPZ/REPE REPNZ/REPNE

Page 86: 第 2 章  8086指令系统

2.7 节要求

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

重点掌握:JMP Jcc LOOP

CALL RET INT n IRET

一般了解: LOOPZ/LOOPE LOOPNZ/LOOPNE

INTO

•另外,本节还要求掌握常用 DOS 系统功能调用

Page 87: 第 2 章  8086指令系统

2.8 节要求

•这些指令在特定的情况下,必须使用。•重点掌握: CLC STC CMC CLD STD

CS: SS: DS: ES:

•特别熟悉: NOP CLI STI

•一般了解: LOCK HLT ESC WAIT