1 / 295

第 3 章 8086 汇编语言程序设计

第 3 章 8086 汇编语言程序设计. 3.1 8086 的指令系统 3.2 汇编语言的基本语法 3.3 汇编语言程序设计基础. 3.1 8086 的指令系统. 3.1.1 8086 的寻址方式. 与数据有关的寻址方式 : 以 MOV 指令为例 立即寻址 MOV AX , 3069H 寄存器寻址 MOV AL , BH 直接寻址 MOV AX , [ 2000H ] 寄存器间接寻址 MOV AX , [ BX ]

soyala
Télécharger la présentation

第 3 章 8086 汇编语言程序设计

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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第3章 8086汇编语言程序设计 3.1 8086的指令系统 3.2 汇编语言的基本语法 3.3 汇编语言程序设计基础

  2. 3.1 8086的指令系统 3.1.1 8086的寻址方式 • 与数据有关的寻址方式:以 MOV 指令为例 • 立即寻址 MOV AX , 3069H • 寄存器寻址 MOV AL , BH • 直接寻址 MOV AX , [ 2000H ] • 寄存器间接寻址 MOV AX , [ BX ] • 寄存器相对寻址 MOV AX , COUNT [ SI ] • 基址变址寻址 MOV AX , [ BP ] [ DI ] • 相对基址变址寻址 MOV AX , MASK [ BX ] [ SI ] 存储器寻址

  3. (1) 立即寻址方式*—— 操作数在指令中给出 MOV AL, 5 MOV AX, 3064H MOV AL, ‘A’ *只能用于SRC 字段 *SRC 和 DST 的字长一致 MOV AH, 3064H 

  4. (2) 寄存器寻址方式*—— 操作数在指定的寄存器中 MOV AX, BX MOV AL, BH MOV AX, 3064H *字节寄存器只有 AH AL BH BL CH CL DH DL *SRC 和 DST 的字长一致 MOV AH, BX  *CS 不能用MOV 指令改变 MOV CS, AX 

  5. AH AL 30 50 32000 50 30 (AX) = 3050H (3) 直接寻址方式*—— 有效地址EA由指令直接给出 例:MOV AX, [ 2000H ] EA=2000H, 假设(DS)=3000H, 那么PA=32000H • *隐含的段为数据段 DS • *可使用段跨越前缀MOV AX, ES: [2000H] • * 操作数地址可由变量(符号地址)表示 • VALUE DB 10 • MOV AH, VALUE • MOV AX, VALUE  • MOV AX, WORD PTR VALUE 

  6. 例 将地址为2000H和2001H 的两内存单元内容相加, • 结果存在地址2002H单元中,程序如下: • A0 00 20 • 02 06 01 20 • A2 02 20 寄存器组 • MOV AL , [2000H] • ADD AL , [2001H] • MOV [2002H], AL DS ES 地址加法器 地 址 译 码 器 AX BX CX DX SI DI BP SP SS CS 1010 0000 0000 0000 0010 0000 0000 0010 0000 0110 0000 0001 0010 0000 1010 0010 0000 0010 0010 0000 A0 00 20 02 06 01 20 A2 02 20 地址总线AB IP 数据总线DB 数据暂存器 总线 接口控制电路 指 令 队 列 控制总线CB 运 算 器 指令译码器 PSW标志 寄存器 控制电路

  7. (4) 寄存器间接寻址* —— EA 在基址寄存器(BX/BP) 或 变址寄存器(SI/DI) 中 MOV AX, [BX]PA = 16d (DS) + (BX) MOV AX, ES:[BX]PA = 16d (ES) + (BX) MOV AX, [BP]PA = 16d (SS) + (BP) * 不允许使用AX、CX、DX 存放 EA MOV AX, [CX]  *SRC 和 DST 的字长一致 MOV DL, [ BX ] ; [BX]指示一个字节单元 MOV DX, [ BX ] ; [BX]指示一个字单元 *适于数组、字符串、表格的处理

  8. (BX) (BP) 8位 (SI) 16位 (DI) 有效地址 = + 位移量 (5) 寄存器相对寻址方式* 例: MOV AX, COUNT[SI] 或 MOV AX, [COUNT+SI] 假设(DS)=3000H, (SI)=2000H, COUNT=3000H, 那么 PA = 35000H 假设(35000H)=1234H, 那么 (AX)=1234H

  9. (BX) (SI) (BP) (DI) 有效地址 = + (6) 基址变址寻址方式* MOV AX, [BX][DI] 或 MOV AX, [BX+DI] MOV AX, ES:[BX][SI]

  10. (BX) (SI) 8位 (BP) (DI) 16位 有效地址 = + + 位移量 (7) 相对基址变址寻址方式 MOV AX, MASK[BX][SI] 或 MOV AX, MASK[BX+SI] 或 MOV AX, [MASK+BX+SI]

  11. 80x86 新增的寻址方式 EA = (基址寄存器) + (变址寄存器)  比例因子 + 位移量 (1)比例变址寻址方式 例:MOV EAX, COUNT [ ESI  4 ]

  12. (2)基址比例变址寻址方式 例:MOV ECX, [ EAX ][ EDI  4 ] (3)相对基址比例变址寻址方式 例:MOV EAX, TABLE [ EBP ][ EDI  4 ]

  13. 寄存器组 DS AX BX CX DX AH AL 地址加法器 ES BH 地址总线AB BL 、、、 指令1 指令2 指令3 指令4 、、、 数据1 数据2 数据3 、、、 SS 地 址 译 码 器 CH CL CS DH DL SI IP DI 数据总线DB BP 数据暂存器 SP 总线 接口控制电路 指 令 队 列 控制总线CB 运 算 器 指令译码器 PSW标志 寄存器 执行部件控制电路 • 立即数寻址、寄存器寻址的操作数, • 不用在取完指令后再到内存中取数。 CPU 总线 内存

  14. 寄存器组 DS AX BX CX DX AH AL 地址加法器 ES BH 地址总线AB BL 、、、 指令1 指令2 指令3 指令4 、、、 数据1 数据2 数据3 、、、 SS 地 址 译 码 器 CH CL CS DH DL SI IP DI 数据总线DB BP 数据暂存器 SP 总线 接口控制电路 指 令 队 列 控制总线CB 运 算 器 指令译码器 PSW标志 寄存器 执行部件控制电路 • 以下的 5 中寻址方式, • 操作数存放在内存中,取完指令后,还需到内存取数。 • 指令中给出的是该操作数的地址,包括段地址和偏移地址。 CPU 总线 内存

  15. 如指令MOV DS: [ DI ] , CL 功能:将CL寄存器中的内容传送到以DS为段值,DI为偏移值的内存单元中 例 编程将CL寄存器的内容传送到21000H单元中。 地址 21000H=2000:1000H 编程时, DS 存放段地址2000H DI 存放偏移地址1000H MOV AX, 2000H MOV DS, AX ; (DS) = 2000H MOV DI, 1000H ; (DI) = 1000H MOV DS: [ DI ], CL ;(21000H) = (CL)

  16. 2000 DS ES 2000 地址加法器 AX BX CX DX SI DI BP SP 地 址 译 码 器 SS CS 地址总线AB MOV AX, 2000H MOV DS, AX MOV DI, 1000H MOV DS: [ DI ], CL A0 21000 寄存器组 IP 1000 数据总线DB 数据暂存器 总线 接口控制电路 指 令 队 列 控制总线CB A0 运 算 器 21000H 21001H 21002H 指令译码器 PSW标志 寄存器 执行部件 控制电路 通过例子看到: 在相应的寄存器中设定段值和偏移值, 由地址加法器送出20位的地址信号,对选中的内存单元进行操作。

  17. 内存单元的地址由段地址和偏移地址构成 ▲ 为减短指令长度指令中: 只给出偏移地址的来源,段地址由默认关系给出。 MOV AL,[ 2000H ] • ▲ CPU根据偏移地址给出的方式, • 按默认关系自动选择段寄存器,获取段值, • 由段值、偏移值构成操作数所在内存单元的物理地址。 • 上例PA= ( DS ) ×10H + 2000H • 即选择DS寄存器的内容为段地址。

  18. 按给出偏移地址方式的不同,分为以下5种: • 直接寻址MOV AL, [ 1000H ] • 寄存器间接寻址MOV AL, [ BX ] • 寄存器相对寻址MOV AL, [ BX + 10H ] • 基址加变址寄存器MOV AL, [ BX + SI ] • 相对基址加变址寄存器MOV AL, [ BX + SI + 10H ] 指令中用[ ]给出偏移地址。 操作数的偏移地址又称有效地址EA ( Efficient Address)

  19. 寄存器间接寻址(Register indirect addressing) • 操作数放在存储器里,操作数的有效地址EA由寄存器给出, 寄存器的内容为操作数的有效地址。 • 可用的寄存器有 BX、SI、DI 、BP • 如: MOV AL, [ BX ] • MOV AH, [ SI ] • MOV DL, [ DI ] • MOV DH, [ BP ]

  20. 默认段寄存器的关系: • ① 使用BX、SI、DI,默认段寄存器为DS • (BX) • PA = ( DS )×10H + (SI) • (DI) • ② 使用BP,默认段寄存器为SS • PA = ( SS )×10H + ( BP )

  21. 寄存器组 DS AX BX CX DX AH AL 地址加法器 ES BH 地址总线AB BL 、、、 指令1 指令2 指令3 指令4 、、、 数据1 数据2 数据3 、、、 SS 地 址 译 码 器 CH CL CS DH DL SI IP DI 数据总线DB BP 数据暂存器 SP 总线 接口控制电路 指 令 队 列 控制总线CB 运 算 器 指令译码器 PSW标志 寄存器 CPU 总线 内存 执行部件控制电路 使用BX、SI、DI的寄存器寻址,默认段寄存器为DS

  22. 寄存器组 DS AX BX CX DX AH AL 地址加法器 ES BH 地址总线AB BL 、、、 指令1 指令2 指令3 指令4 、、、 数据1 数据2 数据3 、、、 SS 地 址 译 码 器 CH CL CS DH DL SI IP DI 数据总线DB BP 数据暂存器 SP 总线 接口控制电路 指 令 队 列 控制总线CB 运 算 器 指令译码器 PSW标志 寄存器 执行部件控制电路 使用BP的寄存器寻址,默认段寄存器为SS CPU 总线 内存

  23. 例:MOV AX , [ DI ] • 若 ( DS ) = 3000H • ( DI ) = 2000H • 则内存操作数的物理地址为: • PA = ( DS )×10H + ( DI ) • = 32000H • 执行后 (AX) = (32000H) = 400BH 思考: 指令 MOV AX,[ DI ]与指令MOV AX, DI有什么不同?

  24. 内存操作数按给出偏移地址方式的不同,有以下5种寻址方式:内存操作数按给出偏移地址方式的不同,有以下5种寻址方式: • 直接寻址MOV AL, [ 1000H ] • 寄存器间接寻址MOV AL, [ BX ] • 寄存器相对寻址MOV AL, [ BX + 10H ] • 基址加变址寄存器MOV AL, [ BX + SI ] • 相对基址加变址寄存器MOV AL, [ BX + SI + 10H ] • 存储器操作数的段地址按默认关系得到。 • 特点:有BP 默认 SS • 无BP 默认 DS 寻址方式的几点说明:

  25. [SI + X ] [SI ] [DI + X ] [DI ] 寄存器相对 [BX + X ] 寄存器间接 [BX ] [BP + X ] [BP ] [ BX+SI ] [ BX+SI+X ] [ BX+DI] [ BX+DI+X] 基址加变址 [ BP+SI ] [ BP+SI+X ] 相对基址加变址 [ BP+DI] [ BP+DI+X] X 8 16 为 位或 位偏移量 • 1.不自创寻址方式 • 内存操作数地址只能由BX、BP、SI、DI 给出, • 它们的组合也不是任意的。

  26. 只有存储器操作数需用段跨越的前缀 • ES:MOV [SI],CX • DS:MOV AL, [BP] • MOV ES : AX , 0 • CS: MOV CX, 22H

  27. 除此之外,其他方式均错误。 • 如 MOV CL, [AX] • MOV AX, [DX] • MOV AL, [CX] • MOV CX, [BP+BX] • MOV AH, [SI+DI] • MOV BL, [AX+CX]

  28. 利用DEBUG可判断下列寻址方式错: D:\>DEBUG  -A  0AFA:0100 MOV CL, [AX]  ^ Error 0AFA:0100 MOV AX, [DX]  ^ Error 0AFA:0100 MOV AL, [CX]  ^ Error 0AFA:0100 MOV CX, [BP+BX]  ^ Error 0AFA:0100 MOV AH, [SI+DI]  ^ Error 0AFA:0100 MOV BL, [AX+CX]  ^ Error 0AFA:0100 -

  29. 3.1.2 8086/8088的指令系统 • 一.概述 • 二.数据传送指令 • 三.算术运算指令 • 四.逻辑运算指令 • 五.控制转移指令 • 六.处理机控制指令 • 七.串操作指令

  30. 一.概述 • 8086/8088的指令系统中共有92种基本指令。 • 可以分成6个功能组: • 数据传送(Data transfer) • 算术运算(Arithmetic) • 逻辑运算和移位指令(Logic& Shift) • 串操作(String manipulation) • 控制转移(Control Transfer) • 处理器控制(Processor Control)

  31. 先介绍以下内容: • 1.指令助记符表 • 2.学习指令的要点 • 3.利用DEBUG程序,学习指令系统 • 4.指令中操作数的表示 • 5.书写指令注意事项

  32. 1. 指令助记符表

  33. 2. 学习指令的要点 • 从以下几个方面来掌握一条指令: • 指令的助记符 • 指令的格式:操作数的个数、类型(B,W,DW) • 执行的操作:指令执行后的结果 • 包括: 哪些寄存器、内存单元的值发生了变化 • 对标志位有无影响,哪些受影响 • 特点及注意事项 • 只介绍常用的指令,其他需要时可自学。

  34. 3. 利用DEBUG学习指令系统(示例) D:\>DEBUG  - A ;汇编指令 0AF8:0100 MOV AL,B5  0AF8:0102 ADD AL, 8F  0AF8:0104  - R ;显示指令执行前各寄存器的值 AX=0000 BX=0000 CX=0000 DX=0000 、、、、、、 CS=0AF8 IP=0100 NV UPEI PL NZ NAPONC - T=100 2;执行指令,查看结果 AX=0044 BX=0000 CX=0000 DX=0000 、、、、、、 CS=0AF8 IP=0104 OV UP EI PLNZAC PE CY 0AF8:0104 2080FC01 AND [BX+SI+01FC], AL - • 1 0 1 1 0 1 0 1 • +1 0 0 0 1 1 1 1 • 进位 11 1 1 1 1 1 • 0 1 0 0 0 1 0 0 编程完成 B5h + 8Fh = ? 学习加法ADD指令及其对状态标志位的影响。

  35. 符号 表示内容 data 立即数操作数 通用寄存器操作数 reg 8 AH AL BH BL CH CL DH DL 位: 、 、 、 、 、 、 、 16 AX BX CX DX BP SP SI DI 位: 、 、 、 、 、 、 、 segreg CS DS SS ES 段寄存器 、 、 、 mem 5 存储器操作数 ( 种寻址方式) [ ] 或 src 源操作数 dst 目的操作数 ( 4. 指令中操作数的表示 ) 注释时表示寄存器、存储器、端口的内容 oprd1 两操作数 oprd2

  36. 5. 书写指令注意事项: • 不区分字母的大小写。 • 下列写法表示同一条指令: • MOV AX, 1ABDH • mov ax, 1abdh • 不添加指令系统没有的指令,即不自创助记符。 • 将 MOV AL , 0 写成 MOVE AL,0 • JMP lable 写成 JUMP lable

  37. 注意操作数的范围 • 对字节操作指令 0 ~ FFH 0 ~ 255 • 对字操作指令 0 ~ FFFFH 0 ~ 65535 • MOV AL , 260 • MOV AX ,70000 • MOV AL, 1FFH • MOV AL, 2ABCDH

  38. 对无操作数指令,不添加操作数。 • STC AL • 对单操作数指令,操作数不能是立即数。 • IMUL 6

  39. 对双操作数指令 • ① 不能两个同为存储器操作数 • MOV [ DI ] , [ SI ] • ② 目的操作数不能是立即数 • ADD 3 , AL • ③两个操作数的类型应相同 • SUB AX , BL • 若 value 定义为字类型存储器变量: • MOV CL, value [ BX ]

  40. 内存操作数的属性应明确。 • MOV [ BX ] ,0 • MOV byte ptr [ BX ] , 0 • MOV word ptr [ BX ] , 0 • MOV [ BX ] , AL • MOV [ BX ] , AX

  41. A、B、C、D、E、F开头的十六进制数前面加0, • 与H结尾的标识符区别。 • 如 寄存器名: AH、BH、CH、 DH • 变量名 : abcdH 等 • 例 mov AL, 0AH • mov AL, AH • mov BX, 0abcdH

  42. CS 和 IP的值只在控制转移指令中修改。 • 对非控制转移指令,取完指令后IP值自动 指向下条指令。 • 段寄存器CS的值,只在MOV、PUSH中可作操作数, • 且这两条指令执行结果不改变CS值。 • MOV AX, CS • PUSH CS • IP、PSW两个寄存器不作为操作数在指令中出现。 • mov IP , 1234H • mov PSW , 0F0FH • PSW状态寄存器的值由指令执行后确定, • 不同的指令对各标志的影响不同。

  43. 地址总线 AB CPU I/O 接 口 输 出 设 备 I/O 接 口 存 储 器 输 入 设 备 数据总线 DB 控制总线 CB 寄存器,存储器,I/O端口 二 .数据传送指令

  44. 寄存器 寄存器 寄存器 内存单元 寄存器 I/O端口 设置寄存器、内存单元的初始值 • 数据传送是最基本、最重要的一种操作 • 实际程序中,使用的比例最高 汇编子程例: • change PROC • LEA SI, num+2 • MOV CL, num+1 • MOV CH, 0 • MOV AX, 0 • MOV DI, 10 • next: MUL DI • MOV BH, 0 • MOV BL, [SI] • AND BL, 0FH • ADD AX, BX • INC SI • LOOP next • zero: MOV BX, AX • RET • change ENDP

  45. 按传送内容,可分为四类: 1.通用数据传送 MOV, PUSH, POP, XCHG, XLAT 2.地址传送 LEA, LDS, LES 3.标志传送 PUSHF, POPF, LAHF, SAHF 4.输入输出传送 IN, OUT • 特点: • 1. 除POPF、SAHF外,其他传送指令对标志位均无影响 • 2. 唯一允许以段寄存器做操作数的指令 • 且只有MOV、PUSH、POP这三条允许

  46. reg/mem/segreg ← reg reg/segreg ← mem reg/mem ← segreg reg/mem ← data 可实现 1.通用传送指令MOV、PUSH、POP、XCHG、XLAT • (1)MOV传送指令 • 格式MOV dst,src • 执行( dst ) ← ( src )

  47. 例 : • ①reg/mem/segreg ← reg 通用寄存器/存储器/段寄存器←通用寄存器 • MOV AL , BL • MOV [ BX ] , AL • MOV DS , AX • ②reg/segreg ← mem 通用寄存器/段寄存器 ← 存储器 • MOV AL , [ BX ] • MOV DS , [ BX+SI ] • ③reg/mem ← segreg 通用寄存器/存储器 ← 段寄存器 • MOV BX , CS • MOV [ BX ] , DS • ④reg/mem ← data 通用寄存器/存储器 ←立即数 • MOV Al , 9 • MOV BX , OFFSET buffer • MOV BYTE PTR [ value ] , 0 • MOV WORD PTR [ BX ] , 1

  48. MOV指令特点及注意事项: • 双操作数指令 (注意双操作指令的特点) • 可进行字节或字传送 • 不允许存储器传送到存储器 • MOV [ BX ] , value • MOV [DI], [SI] • MOV AX ,value • MOV [ BX ] ,AX • MOV AL ,[SI] • MOV [ DI ] ,AL

  49. 可对 DS、ES、SS 赋值 • 但不允许立即数直接传送给段寄存器 • MOV DS,AX • MOV ES ,[BX] • MOV DS,1000H • MOV AX ,1000H • MOV DS,AX • CS不能做目的操作数, 不能通过传送指令改变CS的值 • MOV CS , AX

More Related