81
http://www.njyangqs.co http://www.njyangqs.co 现现现现现现现现现现现 现现现现现现现现现现现 ( ( 3 3 ) ) 1 第3第 80x86 第第第第第第第第 ( 第 ) 注注注注 注注注注注注注注注注注注注注注注 :, 注注注注 注注注注注注注注注注注注注注注注 :, 32 32 注注注 注注注

第 3 章 80x86 汇编语言程序设计 ( 上 )

  • Upload
    chelsey

  • View
    233

  • Download
    9

Embed Size (px)

DESCRIPTION

第 3 章 80x86 汇编语言程序设计 ( 上 ). 注:本章中,用此颜色和字型说明的文字只适用于 32 位汇编. 3.1 80x86 的寻址方式. 有效地址 ( effective address EA ) —— 操作数在段内的偏移地址 寻址方式 —— 产生有效地址的方法. 80x86 指令的一般汇编语言格式: [ 标号 :] 指令助记符 [[ 目的操作数 ][, 源操作数 ]][; 注释 ] 其中 [ ] 表示可选项 ;. 3.1.1 操作数寻址. 80x86 的操作数寻址方式有: 1 、立即寻址 2 、寄存器寻址 - PowerPoint PPT Presentation

Citation preview

Page 1: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

1

第 3 章 80x86 汇编语言程序设计( 上 )

注:本章中,用此颜色和字型说明的文字只适用于注:本章中,用此颜色和字型说明的文字只适用于 3232 位汇编位汇编

Page 2: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

2

有效地址有效地址(( effective address EAeffective address EA )) —— 操作数在段内的偏移地址操作数在段内的偏移地址寻址方式 寻址方式 —— 产生有效地址的方法产生有效地址的方法

80x86 的操作数寻址方式有:1 、立即寻址2 、寄存器寻址3 、存储器寻址4 、端口寻址

3.1 80x86 的寻址方式

3.1.1 操作数寻址

80x8680x86 指令的一般汇编语言格式:指令的一般汇编语言格式:[[ 标号标号 :]:] 指令助记符指令助记符 [[[[ 目的操作数目的操作数 ][,][, 源操作数源操作数 ]][;]][; 注释注释 ]] 其中 [ ] 表示可选项 ;

Page 3: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

3

1 、立即寻址 操作数以常量形式直接放在指令中,紧跟在操作码之后操作数以常量形式直接放在指令中,紧跟在操作码之后 机器码存放形式如下:

立即寻址示例 MOV AH, -40-40 ; -40AH MOV AX, 34D8H 34D8H ; 34HAH, 0D8HAL MOV AX, -40-40 ; 0FFD8H(-40)AX MOV EAX, 12345678H MOV EAX, 12345678H ;; 12345678H12345678HEAXEAX

我们首先讨论两种与存储器无关的寻址方式:我们首先讨论两种与存储器无关的寻址方式:

OPD8

操作码8 位操作数

低地址

高地址OP 操作码

D16 高 8 位D16 低 8 位

16 位操作数

代码段 代码段

Page 4: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

4

2 、寄存器寻址 操作数存放在某个寄存器中,指令指定寄存器号操作数存放在某个寄存器中,指令指定寄存器号 寄存器号 操作数寄存器寻址示例 MOV AH, BLAH, BL ; (BL)-->AH MOV DS, AXDS, AX ; (AX)-->DS MOV SI, AXSI, AX ; (AX)-->SI MOV ECX, EDX MOV ECX, EDX ;; (EDX)(EDX)ECXECX

说明:立即寻址和寄存器寻址方式不需再次访问存说明:立即寻址和寄存器寻址方式不需再次访问存储器即可得到操作数,速度快储器即可得到操作数,速度快

指令 寄存器

Page 5: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

5

有效地址 (EA) 的 4 种组成成分:

位移量位移量( displacement ) 存放在指令中的 8 位、 16 位或 3232 位位的数,是一个地址

有效地址的计算: EA=EA= 基址 基址 ++ (变址(变址 ** 比例因子比例因子)) + + 位位移量移量

比例因子比例因子(( scale factorscale factor )) 其值可为其值可为 11 ,, 22 ,, 44 或或 88 ,, 386386 及其后继机型新增加及其后继机型新增加的的

变址变址( index ) 存放在变址寄存器中的内容,用于访问数组的某个元素

基址基址( base ) 存放在基址寄存器中的内容,用于指向数组的首地址

下面我们来讨论余下的几种与存储器有关的寻址方式,下面我们来讨论余下的几种与存储器有关的寻址方式,先介绍几个概念:先介绍几个概念:

Page 6: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

6

16/3216/32 位寻址时有效地址四种成分的组成位寻址时有效地址四种成分的组成四种成分四种成分 1616 位寻位寻址址 3232 位寻址位寻址位移量 0,8,16 位 0, 8, 320, 8, 32 位位

基址寄存器 BX, BP 任何任何 3232 位通用寄存器位通用寄存器 (( 包括包括ESP)ESP)

变址寄存器 SI, DI 除除 ESPESP 以外的以外的 3232 位通用寄存位通用寄存器器比例因子 无 1, 2, 4, 81, 2, 4, 8

Page 7: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

7

默认段选择规则默认段选择规则访存类型 所用段及寄存器 缺省选择规则

指令 代码段 CS 用于取指堆栈 堆栈段 SS

所有的堆栈的进栈和出栈 任何用 BP,ESP,EBPESP,EBP 作为基址寄存器的访存

目的串 附加数据段 ES 串处理指令的目的串局部数据 数据段 DS 除相对于堆栈以及串处理的目的串以外的所有数据访问

Page 8: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

8

不允许使用段超越前缀的情况不允许使用段超越前缀的情况 ::( 1 )串操作指令的目的串必须用 ES 段( 2 ) PUSH 指令的目的和 POP 指令的源必须用SS 段( 3 )程序的指令必须存放在 CS 段

访问非默认段数据的方法访问非默认段数据的方法————段超越段超越数据的存放比较灵活,除了放在默认的 DS 段,还可以存放在别的段,此时访问他们需要使用段超越前缀,可用的段超越前缀有 CS:, DS:, ES:, SS:, FS:, GS: 。

段超越举例:段超越举例:MOV AX, [10H] ;DSMOV AX, [10H] ;DS 段段 10H10H 处的一个字的数据赋处的一个字的数据赋

给给 AXAX 寄存器寄存器MOV AX, MOV AX, ES:ES:[10H]; [10H]; ESES 段段 10H10H 处的一个字的数据赋处的一个字的数据赋

给给 AXAX 寄存器寄存器

Page 9: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

9

3 、直接寻址 操作数地址的偏移量(操作数地址的偏移量( EAEA )在指令中)在指令中

物理地址物理地址 == 指定段的段基地址指定段的段基地址 ×16+×16+ 偏移量偏移量(EA)(EA) 系统默认,操作数在数据段系统默认,操作数在数据段

段基地址EA 操作数+

指令 存储器

MOV AX, 2000H ; 立即寻址MOV AX, [2000H] ; 直接寻址

Page 10: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

10

直接寻址示例 1 MOV AX, [1000H][1000H] 物理地址 设 (DS)=10A0H 代码段 + OP 00H 10H

数据段 11A00H 30H 50H

50H 30H AX( 本章中图示存储器地址从上到下递增)

低地址10A00H

1000H11A00H

10A0H1000H1000H

30H50H

11A00H

Page 11: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

11

直接寻址示例 2MOV BL, ES:[0100H]ES:[0100H] 物理地址 设 (ES)=3000H 30000H (DS)=2000H + 0100H 30100H 4B 00

BL4B

在汇编语言指令中,可以用符号地址符号地址代替数值地址如: MOV AX, BUFFBUFF或 MOV AX, [BUFF][BUFF]其中其中 BUFFBUFF 为存放数据单元的符号地址。为存放数据单元的符号地址。

3000H0100H0100H

30100H30100H4B

Page 12: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

12

4 、寄存器间接寻址 操作数在存储器中,操作数地址的偏移量(操作数在存储器中,操作数地址的偏移量( EAEA )在)在寄存器中寄存器中

基址或变址寄存器号基址或变址寄存器号 EA 操作数+存储器指令 寄存器段基地址

寄存器间接寻址示例 MOV AL, [BX][BX] MOV AX, CS:CS:[SI][SI] MOV [BP][BP], AH MOV ECX, [EDX] MOV ECX, [EDX]

Page 13: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

13

MOV AH, [BP][BP]MOV BX, [SI] [SI]MOV CX, SI设 (SS)=1000H, (DS)=2000H , (BP)=0B10H, (SI)=032AH 物理地址 物理地址 10000H 20000H + 0B10H + 032AH

40H 00H

3EH 46H

40H AHAH

10B10H

2032AH463EH BXBX

2032BH

10B11H SISI032AH

032AH CXCX

1000H 2000H 0B10H 032AH

10B10H10B10H 2032AH2032AH

40H

3EH46

032AH

Page 14: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

14

5 、基址寻址 操作数的有效地址是基址寄存器的内容加上指令中操作数的有效地址是基址寄存器的内容加上指令中指定的位移量指定的位移量

基址寄存器号 基址寄存器号 位移量位移量

地址+ + 操作数

指 令

基址寄存器

段基地址存储器

EA

可用于数组元素的访问可用于数组元素的访问

Page 15: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

15

基址寻址示例 MOV AX, 3000H[BX] (3000H[BX] ( 或或 [BX+3000H])[BX+3000H]) MOV AX, COUNT[BX]COUNT[BX] ; COUNT; COUNT 是符号地址是符号地址 (或 MOV AX,[COUNT+BX][COUNT+BX] ) 若 (DS)=3000H , (BX)=2000H , COUNT=4000H 30000H 2000H + 4000H

1234H

36000H 34H 12H

AX

3000H 2000H 4000H

36000H36000H

34H12

Page 16: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

16

6 、变址寻址 1 )无比例因子的变址寻址( 16 位寻址)

变址寄存器号变址寄存器号 位移量 位移量地址

++ 操作数指 令

变址寄存器段基地址

存储器EA

操作数的有效地址是变址寄存器的内容加上指令中指操作数的有效地址是变址寄存器的内容加上指令中指定的位移量定的位移量

Page 17: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

17

变址寻址示例 MOV CX, 6020H[SI] (6020H[SI] ( 或或 [SI+6020H])[SI+6020H]) MOV DX, COUNT[SI]COUNT[SI] ; COUNT 是符号地址 (或 MOV AX,[COUNT+SI][COUNT+SI] ) 若 (DS)=3000H , (SI)=2000H , COUNT=1000H 30000H 2000H + 1000H

6734H

33000H 34H 67H

DX

3000H 2000H 1000H

33000H33000H34H67

Page 18: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

18

22 )有比例因子的变址寻址)有比例因子的变址寻址 操作数的有效地址是变址寄存器的内容乘以指令中操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子及位移量之和指定的比例因子及位移量之和

变址寄存器变址寄存器 比例因子比例因子位移量位移量

下标 * + + 操作数存储器

段基地址变址寄存器 变址值

指 令

EA

Page 19: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

19

有比例因子的变址寻址示例有比例因子的变址寻址示例 MOV EAX, COUNT[ESI*4]COUNT[ESI*4]

元素 012000H

元素 1

元素 2

元素 3

+1+2+3+4

+12

EAX

存储器EA=ESI*4 + COUNT设 (ESI)=3,(DS)=1000HCOUNT=2000H

Page 20: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

20

7 、基址变址寻址1 )无位移量的基址变址寻址 操作数的有效地址是一个基址寄存器和一个变址寄操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和存器的内容之和

基址寄存器基址寄存器变址寄存器变址寄存器 变址值

基址值++ 操作数

指 令 变址寄存器

基址寄存器段基地址

存储器EA

Page 21: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

21

无位移量基址变址寻址示例 MOV AX, [BX+DI][BX+DI] MOV AX, [BX][DI][BX][DI]

若 (DS)=2100H, (BX)=0158H, (DI)=10A5H, 物理地址

21000H 0158H+ 10A5H

221FDH 34H 12H

1234HAX

2100H 0158H10A5H

221FDH221FDH34H12

Page 22: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

22

2 )基址变址相对寻址 操作数的有效地址是一个基址寄存器的内容、操作数的有效地址是一个基址寄存器的内容、一个变址寄存器的内容及位移量之和一个变址寄存器的内容及位移量之和 基址寄存器基址寄存器变址寄存器变址寄存器位移量位移量

变址值基址值

+ + 操作数

指 令变址寄存器

基址寄存器

段基地址 存储器EA

Page 23: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

23

基址变址相对寻址示例 MOV AX, MASK[BX+SI]MASK[BX+SI] ;; MASKMASK 是符号地址是符号地址 若 (DS)=3000H, (BX)=2000H, (SI)=1000H, MASK=0250H 物理地址 30000H 2000H 1000H + 0250H 33250H 20H 43H

4320H AX

3000H 2000H 1000H0250H

33250H33250H20H43

Page 24: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

24

33 )基址比例变址寻址)基址比例变址寻址 操作数的有效地址是变址寄存器的内容乘以指令操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子加基址寄存器的内容之和中指定的比例因子加基址寄存器的内容之和

基址寄存器基址寄存器变址寄存器变址寄存器比例因子比例因子

下标基址值

*

+ + 操作数

指 令

变址寄存器基址寄存器

变址值 段基地址 存储器 EA

基址比例变址寻址示例 MOV ECX, [EBX+ESI*8]MOV ECX, [EBX+ESI*8]

Page 25: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

25

44 )相对基址比例变址寻址)相对基址比例变址寻址 操作数的有效地址是变址寄存器的内容乘以指令中操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子加基址寄存器的内容、再加位移量之和指定的比例因子加基址寄存器的内容、再加位移量之和基址寄存器基址寄存器变址寄存器变址寄存器比例因子比例因子位移量位移量

下标基址值

* + + 操作数

指 令

变址寄存器基址寄存器

变址值 段基地址 存储器EA

相对基址比例变址寻址示例 MOV EAX, TABLE[EBX+EDI*4]MOV EAX, TABLE[EBX+EDI*4]

Page 26: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

26

8 、端口寻址1 )直接寻址( I/O Port Direct Addressing )直接寻址是使用一字节立即数寻址,因此直接寻址是使用一字节立即数寻址,因此 I/OI/O 端口的端口的寻址范围为寻址范围为 00H~FFH00H~FFH ,最多为,最多为 256256 个。 个。 IN IN AL, 20HAL, 20H ;从 20H 端口读入 1 个字节OUT 60H, AXOUT 60H, AX ;将 AX 中 1 个字送到 60H 端口

2 )间接寻址( I/O Port Indirect Addressing ) 间接寻址由间接寻址由 DXDX 寄存器间接给出寄存器间接给出 I/OI/O 端口地址,为两端口地址,为两个字节,所以最多可寻址个字节,所以最多可寻址 221616=64K=64K 个端口地址。个端口地址。 MOV DX, 3FCHININ AL, DXAL, DX ;从 3FCH 端口读入 1 个字节

Page 27: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

27

3.1.2 转移操作寻址1.直接寻址(段间)指令中直接提供了转向段地址和偏移地址,用指令指令中直接提供了转向段地址和偏移地址,用指令中提供的偏移地址取代中提供的偏移地址取代 IPIP 寄存器,用指令中提供的段寄存器,用指令中提供的段地址取代地址取代 CSCS 寄存器的内容就完成从一个段到另一个段寄存器的内容就完成从一个段到另一个段

的转移操作。的转移操作。 JMP FAR PTR NEXT_PROJMP FAR PTR NEXT_PRO

Page 28: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

28

2. 相对寻址(当前段内)转向的有效地址是当前转向的有效地址是当前 IPIP 寄存器的内容和指令中寄存器的内容和指令中指定的位移量之和指定的位移量之和a)a) 位移量只有位移量只有 88 位的为短位的为短 (short)(short) 转移或条件转移转移或条件转移b)b) 位移量有位移量有 1616 位的为近位的为近 (near)(near) 转移转移

偏移量 机器码 程序0000 0405 PROG_S: ADD AL,05H0002 90 NOP0003 EBFB JMP SHORT PROG_S0005 90 NOP

Page 29: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

29

3.间接寻址a)段内间接寻址转向有效地址是一个寄存器或是两个字节存储单元转向有效地址是一个寄存器或是两个字节存储单元的内容 。所得到的转向的有效地址用来取代的内容 。所得到的转向的有效地址用来取代 IPIP 寄存器寄存器的内容。的内容。 设:( DS ) =2000H ,( BX ) =1000H ,变量

TABLE 的有效地址为 1000H ,( 21000H ) =0040H ,( 22000H ) =5678H ,则下列三条指令分别执行后结果如下:

JMP BXJMP BX ;;执行后执行后 IP=1000HIP=1000H JMP [BX] JMP [BX] ;;执行后执行后 IP=0040HIP=0040H JMP TABLE[BX] JMP TABLE[BX] ;;执行后执行后 IP=5678HIP=5678H

Page 30: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

30

3.间接寻址b)段间间接寻址用存储器中的相继的四个字节的内容来取代用存储器中的相继的四个字节的内容来取代 IPIP 和和

CSCS 寄存器中的原始内容以达到段间转移的目的。寄存器中的原始内容以达到段间转移的目的。 设: (DS)=2500H , (SI)=1300H , (26300H)=4500H ,(26302H)=32F0H, 则执行以下指令后结果如下:

JMP DWORD PTR [SI]JMP DWORD PTR [SI] ;执行后;执行后CS=32F0HCS=32F0H ,, IP=4500HIP=4500H

Page 31: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

31

3.2 80x86 汇编语言格式 汇编语言源程序结构 汇编语言上机过程 汇编语言语句格式 伪操作(伪指令)

Page 32: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

数据段 说明: 堆栈段 1 、各段顺序无关 2 、除代码段外,可缺省 3 、可有若干个数据段, 若干代码段 代码段

END [ 标号 ]

附加段

3.2.1 源程序结构概览

32

Page 33: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))汇编语言程序例

.DATA.DATA BUF1 DB 34H BUF1 DB 34H ;;变量定义变量定义 BUF2 DB 2AHBUF2 DB 2AH SUM DB ?SUM DB ?.CODE.CODESTART: MOV AX, @DATASTART: MOV AX, @DATA MOV DS, AX MOV DS, AX ; ; 段寄存器赋值 段寄存器赋值 MOV AL, BUF1MOV AL, BUF1 ADD AL, BUF2ADD AL, BUF2 MOV SUM, ALMOV SUM, AL MOV AH, 4CHMOV AH, 4CH INT 21H ; INT 21H ; 程序退出程序退出END STARTEND START

数据段数据段

代码段代码段

33

Page 34: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))3.2.2 汇编语言程序上机过程

源程序 .asm

汇编汇编masmmasm

目标程序 .obj

连接连接linklink

debug 调试调试

可执行程序 .exe

DOS 下执行 执行执行调调试试

修改修改

34

更多细节以及在更多细节以及在 VC6VC6 中实现中实现 C++C++ 中嵌入汇编请看中嵌入汇编请看《《汇编语言上机过程汇编语言上机过程 ((自学自学 ).ppt).ppt 》》

Page 35: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

有三类语句:指令语句指令语句——完成操作功能,能翻译成机器指令

伪指令语句伪指令语句——为汇编程序在翻译源程序时提供 有关信息 宏指令语句宏指令语句——由若干条指令语句组成的语句

伪指令语句格式:伪指令语句格式: [[ 符号名符号名 ] ] 伪操作 伪操作 [[ 操作数操作数 [,[, 操作数操作数 , …]] [, …]] [ ;注释;注释 ]]

3.2.3 汇编语言语句格式

35

指令语句格式指令语句格式[[ 符号名符号名 :]:] 指令助记符指令助记符 [[ 目的操作数目的操作数 [,[, 源操作数源操作数 ]][;]][; 注注释释 ] ]

Page 36: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))一、指令语句格式一、指令语句格式

1 、符号名符号名 由用户按一定规则定义的标识符,有标号和变量两种形式,在指令格式中用的是标号。可用符号是: 字母: A--Z, a--z 数字符: 0--9 专用字符: ?, _, @, $ 长度不超过长度不超过 3131 个字符个字符 , , 首字符不能为数字,不能和首字符不能为数字,不能和保留字同名。保留字同名。2 、指令助记符指令助记符 指令助记符是汇编指令的符号代码,不可缺省。 汇编源程序时 , 系统使用内部对照表将每条指令的助记符译成相应的机器码。

36

Page 37: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))3 、目的操作数目的操作数

1 )参与指令操作 2 )暂存操作结果 除立即寻址方式外,其他寻址方式均适用于目的操作数 .

4 、源操作数源操作数 提供原始数据或操作对象,面向所有寻址方式5 、注释注释 注释在系统汇编时并不产生机器码 注释可以放在指令语句尾,也可单独使用 注释前面的“ ;” 不可缺少

37

指令举例:指令举例: START: MOV AX, 2000HSTART: MOV AX, 2000H MOV DS, AX ;MOV DS, AX ; 为为 DSDS 寄存器赋值寄存器赋值

Page 38: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))二、常量二、常量常量有两种:

1 、数值常量数值常量 二进制数 以 B 结尾,如 01011101B 八进制数 以 Q 结尾,如 235Q 十进制数 以 D 结尾或没有结尾字母,如 98D 或

98 十六进制数 以 H 结尾,如 5BH ,当最高位为‘ A’~‘F’ ,则在最高位前加‘ 0’2 、字符串常量字符串常量 用单引号括起来的一个或多个字符,如‘ A’ 、‘ AB’ 字符用 ASCII 码形式存储常量的应用常量的应用:

(1) 在指令语句中作立即数 MOV CX, 100100 (2) 在指令语句中作位移量 MOV AX, 3434[SI](3) 在数据定义语句中作初值 X DB 12H, 12H, 34H34H ,’,’ abcd’abcd’

38

Page 39: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))三、变量和标号三、变量和标号变量变量用来代表数据所在存储单元的地址,在数据段、附加段和堆栈段中使用,变量与其所代表的数据用空格隔开。变量变量有三种属性:

1 、段属性段属性——变量所在段的起始地址2 、偏移属性偏移属性——从段起始地址到定义变量的位置之间的字节数3 、类型属性类型属性——该变量所保留的字节数 DB 1 个字节 DW 2 个字节 DD 4 个字节 DQ 8 个字节 DT 10 个字节

39

Page 40: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))标号标号用来代表一条指令所在存储单元的地址,在代码段中使用。标号与其代表的指令间用冒号隔开。标号标号也有三种属性:

1 、段属性段属性——定义标号所在段的起始地址2 、偏移属性偏移属性——从段起始地址到定义标号的位置之间的字节数3 、类型属性类型属性——表示它的转移特性 NEAR (近) 段内转移 FAR (远) 段间转移

40

Page 41: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

处理器选择伪指令处理器选择伪指令 数据定义和存储器分配伪指令数据定义和存储器分配伪指令 表达式赋值伪指令表达式赋值伪指令 地址计数器与对准伪指令地址计数器与对准伪指令

3.2.4 汇编伪指令

41

伪指令:帮助汇编程序正确翻译源程序的命令,本身不伪指令:帮助汇编程序正确翻译源程序的命令,本身不生成任何机器指令)生成任何机器指令)

Page 42: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))(一)处理器选择伪指令(一)处理器选择伪指令

.8086 .8086 可使用可使用 80868086 指令(一般不用写)指令(一般不用写)

.286 .286 可使用可使用 8028680286 指令指令

.286P .286P 可使用保护方式下的可使用保护方式下的 8028680286 指令指令

.386.386 可使用可使用 8038680386 指令指令

.386P.386P 可使用保护方式下的可使用保护方式下的 8038680386 指令指令

.486.486 可使用可使用 8048680486 指令指令

.486P.486P 可使用保护方式下的可使用保护方式下的 8048680486 指令指令

.586.586 可使用可使用 PentiumPentium 指令指令

.586P.586P 可使用保护方式下可使用保护方式下 PentiumPentium 的指令的指令

.686.686 可使用可使用 Pentium ProPentium Pro 指令指令

.686P.686P 可使用保护方式下可使用保护方式下 Pentium ProPentium Pro 的指令的指令

.MMX .MMX 可使用可使用 MMXMMX 指令指令

.XMM .XMM 可使用可使用 SSESSE 指令指令当源程序使用了 286 及以上的机型新增加的指令时,应该在程序开始使用相应的处理器选择伪指令。

42

Page 43: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))(二)数据定义伪指令(二)数据定义伪指令格式:格式: [[ 变量名变量名 ] ] 定义符 操作数项表定义符 操作数项表操作:为变量分配存储单元并将初值置入相应单元中操作:为变量分配存储单元并将初值置入相应单元中

操作数项可为: 11 、常数或表达式、常数或表达式 22 、字符串、字符串 33 、?表达式、?表达式 44 、带、带 DUP DUP 的表达式的表达式

定义符可为: DB—— 定义字节 DW —— 定义字( 2 个字节) DD—— 定义双字( 4 个字节) DF—— 定义六字节 DQ—— 定义八字节 DT—— 定义十字节

操作数项表:操作数项 [, 操作数项 [, 操作数项… ]]43

Page 44: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))操作数是常数或表达式操作数是常数或表达式

X1 DB 40H ;为 X1 分配 1 个字节,初值 40H X2 DW 250*250 ;为 X2 分配 2 个字节,初值 62500 X3 DD 10203040H ;为 X3 分配 4 个字节,初值为

10203040H X4 DQ (120+50)/10 ;为 X4 分配 8 个字节,初值 17 X5 DB 10, 20, 30 ;多项定义, X5被分配 3 个字节,初值分别为 10 , 20 , 30 ,地址从低到高,各个值间用逗号分开

44

Page 45: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))操作数为字符串操作数为字符串

STRING1 DB ‘HELLO’ STRING2 DB ‘H’, ‘E’, ‘L’, ‘L’, ‘O’ 字符串用字符串用 DBDB 定义,被定义串以单引号括起来定义,被定义串以单引号括起来 串中可包含数字符、大小写英文字母、回车符、 换行符、 空格、?、 $ 、下划线 _等 字符串以 ASCII 码形式存储在存储单元中。

STRING1 ‘H’ STRING1 ‘H’ +1 ‘E’+1 ‘E’ +2 ‘L’+2 ‘L’ +3 ‘L’+3 ‘L’ +4 ‘O’+4 ‘O’

45

Page 46: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))区分 区分 S1 DB ‘AB’ S1 DB ‘AB’ 与 与 S2 DW ‘AB’S2 DW ‘AB’

它们的存储情况为: S1 S2 ‘A’ ‘B’ ‘B’ ‘A’

操作数项为操作数项为 ?? ? 用于预留空间,不置初值 Y1 DB 20H, ? ;定义 2 个字节,其中预留 1 个字节 Y2 DW ?, ? ;预留 2 个字 Y3 DD ? ;预留 4 个字节 Y4 DQ ? ;预留 8 个字节 Y5 DT ? ;预留 10 个字节

46

Page 47: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))操作数项带重复定义符操作数项带重复定义符 DUPDUP

格式: N DUPN DUP (操作数项表)(操作数项表) 操作:将操作数项表内容重复定义 N 次 VAR1 DW 2 DUP(2, 4), 1476H VAR2 DB 2 DUP(?, 2 DUP(‘A’, ‘B’) ) 存储情况为: VAR1 02H VAR2 ? 00H ‘A’ 04H ‘B’ 00H ‘A’ 02H ‘B’ 00H ? 04H ‘A’ 00H ‘B’ 76H ‘A’ 14H ‘B’

47

Page 48: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

48

操作数运算符操作数运算符 算术运算符 逻辑运算符 关系运算符 数值回送运算符 属性运算符 运算符优先级

48

Page 49: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 )) 算术运算符算术运算符 (( 单目单目 +, +, 单目单目 -, +, -, *, /, MOD)-, +, -, *, /, MOD) 运算符 格 式 运 算

+ + 表达式 取表达式正值 - - 表达式 取表达式负值 + 表达式 1+ 表达式 2 求表达式 1 、表达式 2 之和 - 表达式 1- 表达式 2 求表达式 1 、表达式 2 之差 * 表达式 1* 表达式 2 表达式 1 、表达式 2 之积 / 表达式 1/ 表达式 2 表达式 1 、表达式 2 之商 MOD 表达式 1 MOD 表达式 2 取余数

说明:1 、算术运算符可用于数值表达式或地址表达式2 、用于地址表达式时,只有其结果有物理意义时才有效 常用的是:地址地址 ++ 数字常量 (结果是地址)数字常量 (结果是地址) 地址地址 -- 数字常量 (结果是地址)数字常量 (结果是地址) 地址地址 -- 地址 (结果是常量)地址 (结果是常量)

Page 50: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))算术运算符示例

(1) MOV AL, 20+30 ; 50-->AL MOV BH, 100-2 ; 98-->BH MOV CX, 50/2 ; 25-->CX MOV AL, 80 MOD 15 ; 5-->AL

(3) 设数据定义如下: ARRAYA DW 1, 2, 3, 4, 5, 6, 7 WENDA DW ? 将数组长度(字数)存入 CX : MOV CX, (WENDA-ARRAYA)/2 ; 地址地址 -- 地址,结果为一常量地址,结果为一常量

(2) 将首地址为 BLOCK 的字数组的第 6 个字传送到 DX : MOV DX, BLOCK+(6-1)*2 ; 地址地址 ++ 常量,结果仍为一地址值常量,结果仍为一地址值

50

Page 51: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 )) 逻辑运算符逻辑运算符 (NOT,AND,OR,XOR)(NOT,AND,OR,XOR) 运算符 格 式 运 算

NOT NOT 表达式 按位取反 AND 表达式 1 AND 表达式 2 按位“与”运算 OR 表达式 1 OR 表达式 2 按位“或”运算 XOR 表达式 1 XOR 表达式 2 按位“异或”运算 逻辑运算符和逻辑运算指令的区别:逻辑运算符和逻辑运算指令的区别: 逻辑运算指令 逻辑运算符出现在语句的位置 指令助记符 操作数字段操作对象 可以是寄存器或 只能是整型常数 存储器操作数何时计算 程序运行时 源程序汇编时51

Page 52: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))关系运算符关系运算符 (EQ,NE,LT,LE,GT,GE) (EQ,NE,LT,LE,GT,GE)

运算符 格 式 运 算 EQ 表达式 1 EQ 表达式 2 表达式 1= 表达式 2 为真 NE 表达式 1 NE 表达式 2 表达式 1<> 表达式 2 为真 LT 表达式 1 LT 表达式 2 表达式 1< 表达式 2 为真 LE 表达式 1 LE 表达式 2 表达式 1<= 表达式 2 为真 GT 表达式 1 GT 表达式 2 表达式 1> 表达式 2 为真 GE 表达式 1 GE 表达式 2 表达式 1>= 表达式 2 为真

关系运算符的两个操作数必须都是常量或同一段内的都是常量或同一段内的符号地址符号地址,比较结果为逻辑值:如果关系成立,则返如果关系成立,则返回回 0FFFFH(0FFFFH( 真真 )) ;否则,返回;否则,返回 0(0( 假假 )) 。。

52

Page 53: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))逻辑运算符示例

MOV AH, NOTNOT 0F0H 0F0H ; 0FHAH MOV BL, 40H 40H OROR 0B4H 0B4H ; 0F4HBL MOV BL, 55H 55H XOR XOR 48H 48H ; 1DHBL MOV CH, 50H 50H AND AND 30H 30H ; 10HCH

关系运算符示例 N1 EQU 10 N2 EQU 20 ……... MOV BX, N1N1 EQ EQ N2 N2 ; 0 BX MOV CX, N1N1 NE NE N2 N2 ; 0FFFFH CX MOV AX, N1 N1 LTLT N2 N2 ; 0FFFFH AX MOV DI, N1 N1 GEGE N2 N2 ; 0-->DI

53

Page 54: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))数值回送运算符数值回送运算符

(SEG,OFFSET,TYPE,LENGTH,SIZE)(SEG,OFFSET,TYPE,LENGTH,SIZE) 数值回送运算符对变量变量或标号标号进行分析,回送其地址属性值或变量特征值。(1) 地址回送运算符地址回送运算符 符号 作用对象 操 作 SEG 变量或标号 返回其所在段的段基址值OFFSET 变量或标号 返回其在段内的偏移量

54

Page 55: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

(2) 符号特征回送运算符符号特征回送运算符 符号 作用对象 操 作 TYPE 变量或标号 用数字表示其类型属性 LENGTH 变量 用 DUP重复定义符定义的变量 ,返回分配的元素个数;其他 形式,则返回 1 SIZE 变量 回送 LENGTH*TYPE 之积

55

Page 56: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))TYPE TYPE 运算符运算符 类型属性 运算结果变量 DB 1

DW 2 DD 4 DQ 8 DT 10标号 NEAR -1 FAR -2

56

Page 57: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))数值回送运算符示例

.DATA NUM1 DB 10 DUP(10) ;数据定义 NUM2 DB 10H, 20H, 50H NUM3 DW 20 DUP(0, 4 DUP(2)) NUM4 DB ‘STRING’ .CODE

MOV CL, SIZESIZE NUM4 ; 1*1-->CL MOV CH, SIZESIZE NUM3 ; 20*2-->CH

MOV AH, TYPETYPE NUM3 ; 2-->AHMOV BH, LENGTHLENGTH NUM3 ; 20-->BH (最外层)

MOV SI, OFFSETOFFSET NUM1 ; NUM1 的偏移量 -->SIMOV DI, OFFSETOFFSET NUM2 ; NUM2 的偏移量 -->DI

MOV AX, SEGSEG NUM1MOV BX, SEGSEG NUM2 ;NUM2 与 NUM1 段基址值相同

57

Page 58: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 )) 属性运算符 属性运算符 (PTR, SHORT)(PTR, SHORT)

SHORTSHORT格式: 格式: JMP SHORT JMP SHORT 标号 标号 操作: 转移的距离属性为短,即转移范围为操作: 转移的距离属性为短,即转移范围为 -128~+127-128~+127字节字节

PTRPTR格式: 类型 格式: 类型 PTR PTR 表达式 表达式 操作: 对存储器寻址的表达式,类型可为操作: 对存储器寻址的表达式,类型可为BYTE,WORD,DWORD, QWORDBYTE,WORD,DWORD, QWORD 和和 TBYTETBYTE ;; 表达式为标号时,类型可为表达式为标号时,类型可为 NEARNEAR 或或 FARFAR 。。 该运算符显式指定表达式的类型该运算符显式指定表达式的类型

58

Page 59: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))PTR 运算符示例

( 1 ) DATA1 DB 10H, 20H, 30H DATA2 DW 4023H, 1A00H ;数据定义 ...... MOV AX, WORD PTRWORD PTR DATA1 ; (AX)<--2010H MOV BL, BYTE PTRBYTE PTR DATA2 ; (BL)<--23H PTR运算符指明 DATA1 由原来的字节变量临时改变为字变量,而字变量 DATA2 则临时变为字节变量,所谓临时是指在当前指令语句中有效,而存储分配情况并不改变。 ( 2 ) MOV BYTE PTRBYTE PTR[SI], 60H ;字节传送 SUB WORD PTRWORD PTR[BX], 36H ;字数据减 JMP FAR PTRFAR PTR S1 ;段间转移

59

Page 60: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 )) 本课件涉及到的运算符优先级本课件涉及到的运算符优先级

优先级 运算符 类 别 1 LENGTH,SIZE 数值回送运算符 2 PTR,OFFSET,SEG,TYPE, 属性与数值回送运算符 3 +,- 符号运算符 4 *,/,MOD 算术运算 , 移位运算符 5 +,- 算术运算符 6 EQ,NE,LT,LE,GT,GE 关系运算符 7 NOT 逻辑运算符 8 AND 逻辑运算符 9 OR,XOR 逻辑运算符 说明:优先级 1 最高,而优先级 9 最低 圆括号()可改变执行顺序

60

Page 61: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))(三)表达式赋值伪指令((三)表达式赋值伪指令( EQUEQU ,, =)=)

格式:名字 格式:名字 EQU EQU 表达式 表达式 名字 名字 = = 表达式表达式 操作:为表达式取一个名字,供以后引用操作:为表达式取一个名字,供以后引用 说明: 1 、表达式可为常数、变量、标号、指令助记符、字符串 2 、在一个源程序中,被 EQU 伪指令赋值的符号不不能能 再次赋值,而用 = 定义的符号名可重复定

义 . 3 、赋值语句仅在汇编源程序时,作为替代符号用, 不产生目标代码,也不占有存储单元也不占有存储单元

61

Page 62: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))赋值伪指令示例

CONST EQUEQU 100*2 ;定义符号常数 ADDRS EQUEQU [BX+10] ;为地址表达式定义名字 CHAR EQUEQU ‘COMPUTER’ ;为字符串定义名字 COUNT = = AX ;给寄存器定义名字 ... MOV BX, CONST ;引用 MOV BX, COUNT MOV ADDRS, 20

... 等同于 MOV BX, 100*2 MOV BX, AX MOV [BX+10], 20

62

Page 63: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))(四)地址计数器与对准伪指令(四)地址计数器与对准伪指令

11 )地址计数器)地址计数器 $ —— $ —— 当前位置的有效地当前位置的有效地址址示例 1 ARRAY DW 1, 2, $+4$+4, 3, 4, $+3$+3

ARRAY 01h 0074H 00 02h 0076H 00 7Ch 7Ch 0078H 0000 03h 007AH 00 04h 007CH 00 81h 81h 007EH 0000

示例 2 BUFFER DB 1, 2, 3, 4, 5 COUNT EQU $-BUFFERCOUNT EQU $-BUFFER 数据定义的结果: COUNT 的值即为 BUFFER 的长度 示例 3 OUT 21H, AL JMP $+2JMP $+2 ; 跳转到下一句 MOV AX, 0

63

Page 64: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 )) 22 )定位伪指令)定位伪指令 格式格式 11 : : ORG ORG 表达式 表达式 格式格式 22 : : ORG $+ORG $+ 表达式表达式 功能:将表达式的值送入程序计数器

$ 表示程序计数器的当前值 定位伪指令示例 10H 20H .DATA 11H 30H ORG 10HORG 10H X DB 20H, 30H ORG $+5ORG $+5 17H 40H Y DB 40H, 50H 18H 50H

64

Page 65: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

程序开始与结束伪指令程序开始与结束伪指令 常用的程序退出的方法常用的程序退出的方法 段定义结构段定义结构

完整段定义伪指令完整段定义伪指令 模式选择伪指令模式选择伪指令 简化段定义伪指令简化段定义伪指令

3.2.5 汇编语言源程序结构

65

Page 66: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 )) (一)程序开始和结束伪指令(一)程序开始和结束伪指令

11 )程序开始伪指令 (可省))程序开始伪指令 (可省) 格式格式 11 : : NAME NAME 模块名 模块名 操作操作 11 : 用此名作为模块名: 用此名作为模块名 如缺省则以模块的源程序文件名为模块名如缺省则以模块的源程序文件名为模块名

模块命名伪指令示例 NAME MODE1 …… NAME MODE2 …… TITLE EXAM

格式格式 22 :: TITLE TITLE 文本文本操作操作 22 :没有:没有 NAMENAME 时,用其前时,用其前 66 个字符作为模块名个字符作为模块名 可在列表文件中打印标题可在列表文件中打印标题

66

Page 67: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))22 )源程序结束控制伪指令)源程序结束控制伪指令 (不可省)(不可省) 格式格式 11 :: END END

格式格式 22 :: END END 符号地址符号地址 功能:告诉汇编程序,源程序到此结束,并将符号地址功能:告诉汇编程序,源程序到此结束,并将符号地址 所示单元的段基址和偏移量自动装入所示单元的段基址和偏移量自动装入 CSCS 和和 IPIP 中 中 源程序结束控制伪指令示例 .CODESTART: ......END STARTEND START 说明: 源程序从标号 START 处开始执行

67

Page 68: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))(二)常用的程序退出的方法(二)常用的程序退出的方法

使用 DOS功能调用的 4CH功能 :MOV AH, 4CHMOV AH, 4CHINT 21HINT 21H

使用 INT 20H 指令 利用程序段前缀法(在子程序一节介绍)

68

Page 69: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))使用使用 DOSDOS功能调用的功能调用的 4CH4CH功能功能 ::

69

.DATA BUF1 DB 34H BUF2 DB 2AH SUM DB ?.CODESTART: MOV AX, @DATA MOV DS, AX MOV AL, BUF1 ADD AL, BUF2 MOV SUM, AL MOV AH, 4CHMOV AH, 4CH INT 21HINT 21HEND START

Page 70: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

11 )简化的段定义伪指令)简化的段定义伪指令数据段定义伪指令数据段定义伪指令格式:格式: .DATA [.DATA [名字名字 ]]功能:定义数据段,若有多个数据段,用名字区别。功能:定义数据段,若有多个数据段,用名字区别。 只有一个数据段时,段名为只有一个数据段时,段名为 @DATA@DATA

栈段定义伪指令栈段定义伪指令格式:格式: .STACK [.STACK [ 长度长度 ]]功能:定义一个栈段,并形成功能:定义一个栈段,并形成 SSSS 及及 SPSP 的初值,的初值, SPSP 的的默认值为默认值为 10241024 ,隐含段名为,隐含段名为 @STACK@STACK

代码段定义伪指令代码段定义伪指令格式:格式: .CODE [.CODE [ 名字名字 ]]功能:定义代码段,若有多个代码段,用名字区别。功能:定义代码段,若有多个代码段,用名字区别。 只有一个代码段时,段名为只有一个代码段时,段名为 @CODE@CODE70

(三) 段定义结构(三) 段定义结构

Page 71: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))22 )模式选择伪指令)模式选择伪指令格式:格式: .MODEL .MODEL 模式选择符模式选择符功能:指明简化段所用内存模式功能:指明简化段所用内存模式

TinyTiny模式(微模式)模式(微模式):所有数据和代码放入同一物理段内, 可写成 .COM 文件形式 SmallSmall 模式(小模式)模式(小模式):所有数据放在一个 64KB 的段, 所有代码放在一个 64KB 的段 MediumMedium 模式(中模式)模式(中模式):所有数据放在一个 64KB 的段, 代码可放在多个段 CompactCompact 模式(压缩模式)模式(压缩模式) :所有代码放在一个 64KB 的段, 数据可放在多个段 LargeLarge 模式(大模式)模式(大模式):代码和数据都可用多个段 HugeHuge :与 Large 相同,但数据段大小可超过 64KB FlatFlat : 允许用户用 32 位偏移量

71 缺省使用缺省使用 SmallSmall 模式模式

Page 72: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))简化段定义结构简化段定义结构

.MODEL SMALL .STACK 100H .DATA …… .CODESTART: MOV AX, @DATAMOV AX, @DATA MOV DS, AXMOV DS, AX …… MOV AH, 4CHMOV AH, 4CH INT 21HINT 21HEND START

72

Page 73: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

73

3.3 系统功能调用与人机界面设计11 )中断指令 )中断指令 中断指令( INT 与 IRET ) 属于控制转移类控制转移类指令,可以执行软件中断和 DOS 系统功能调用

Page 74: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

74

指令 格式 操 作 中断 INT NINT N SP<--(SP)-2 ((SP)+1,(SP))<--(FLAGS) SP<--(SP)-2 ((SP)+1,(SP))<--(CS) SP<--(SP)-2 ((SP)+1,(SP))<--(IP) IP<--(0000:OA)IP<--(0000:OA) ;; OA=4*NOA=4*N CS<--(0000:OA+2)CS<--(0000:OA+2)中断返回 IRETIRET IP<--((SP)+1,(SP)) SP<--(SP)+2 CS<--((SP)+1,(SP)) SP<--(SP)+2 FLAGS<--((SP)+1,(SP))FLAGS<--((SP)+1,(SP)) SP<--(SP)+2

Page 75: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

75

常用的软件中断常用的软件中断中断号 功 能 中断号 功 能

10H10H 视频服务中断视频服务中断 13H13H 软硬盘控制中断软硬盘控制中断14H14H 串行口中断串行口中断 15H15H 各种各种 IOIO 设备中断设备中断16H16H 键盘中断键盘中断 17H17H 并行打印口中断并行打印口中断20H 返回 DOS 21H21H DOSDOS 系统功能调系统功能调用用23H Ctrl+Break 处理 24H DOS严重错误33H 鼠标中断 2FH

31HDOS保护方式接口

BIOS 、 DOS 、自由中断的汇编调用方式:INT n INT n ; ; nn 为中断向量号,如 为中断向量号,如 INT 10HINT 10H 、、 INT INT 21H21H

Page 76: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

76

常用的常用的 DOSDOS 系统功能调用(系统功能调用( INT 21HINT 21H ))子功能号 功能 入口参数 出口参数 01H 01H 键盘输入 键盘输入 (AH)=1 (AL)=(AH)=1 (AL)= 输入字输入字符符02H 显示器输出 (AH)=2 无 (DL)=欲输出字符 09H 09H 显示字符串 显示字符串 (AH)=9 (AH)=9 无无 (DS:DX)=(DS:DX)= 字符串首址字符串首址 字符串以‘字符串以‘ $’$’ 结束结束0AH 0AH 输入字符串 输入字符串 (AH)= 0AH (DS:DX)(AH)= 0AH (DS:DX) 所指所指 (DS:DX)=(DS:DX)=输入缓 缓冲区中为输入缓 缓冲区中为 冲区首址 输入的字符串冲区首址 输入的字符串4CH 返回调用 (AH)=4CH 无 进程

Page 77: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

77

软中断调用的基本方法如下: 11 、子功能号送、子功能号送 AHAH 寄存器; 寄存器; 22 、按要求设置所有入口参数; 、按要求设置所有入口参数; 33 、发送 、发送 INT n INT n 软中断指令。软中断指令。

BIOS 中断调用示例设置屏幕显示方式为 640×480 16 色图形方式 MOV AH, 0 ; 子功能号 MOV AL, 12H ; 调用参数 INT 10HINT 10H ; BIOS 的视频服务中断

Page 78: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

78

BIOS 中断调用示例 欲打印字符‘ S’ ,相应的系统调用如下: MOV AH , 1 ;初始化打印机子功能号 MOV DX , 0 ;打印机号 INT 17HINT 17H ;初始化打印机 MOV AH, 0 ;打印机子功能号 MOV DX, 0 ;打印机号 MOV AL, 'S' ;欲打印的字符 INT 17H INT 17H ;打印‘ S’

Page 79: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

79

单个字符输入与输出示例 读入一个字符,并在屏幕上输出

MOV AH, 01H MOV AH, 01H ;输入字符;输入字符 INT 21HINT 21H ;; DOSDOS 功能调用功能调用 MOV DL, AL ; MOV DL, AL ; 要输出的字符要输出的字符 MOV AH, 02HMOV AH, 02H INT 21H ; DOSINT 21H ; DOS 功能调用功能调用

Page 80: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

80

字符串输出示例.DATA MSG DB ‘Hello world!’,’$’ .CODE START: MOV AX, DATA MOV DS, AX MOV DX, OFFSET MSGMOV DX, OFFSET MSG MOV AH,09HMOV AH,09H INT 21HINT 21H MOV AH, 4CH INT 21HEND START

小贴士:小贴士:要想输出回车换行(要想输出回车换行( CC语言里的语言里的 \r\n)\r\n) ,可以定,可以定义字符串如下义字符串如下 :: CR DB 0AH,0DH,'$'CR DB 0AH,0DH,'$'

Page 81: 第 3 章   80x86 汇编语言程序设计 ( 上 )

http://www.njyangqs.com/http://www.njyangqs.com/

现代微机原理与接口技术现代微机原理与接口技术 (( 第第 33版版 ))

81

字符串输入示例 该子功能调用前,在数据段中必须定义一个缓冲区该子功能调用前,在数据段中必须定义一个缓冲区: N EQU 20 MAXLEN DB N ;缓冲区最大长度 ACTLEN DB ? ;缓冲区实际字符个数 STRING DB N DUP(?) ; N 个字符空间 …… MOV AH, 0AHMOV AH, 0AH MOV DX, OFFSET MAXLENMOV DX, OFFSET MAXLEN; ; 缓冲区首地址给缓冲区首地址给DXDX INT 21HINT 21H 说明: 1 )缓冲区可接受的字符个数为 1~255 2 )缓冲区的第 3 个字节开始存放输入的字符 , 前 2 个字节位置分别放缓冲区长度和字符串实际字符数