汇编语言课件

更新时间:2024-06-28 10:57:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

淮北煤炭师范学院

备 课 本

( 2009 — 2010 学年第 一 学期 )

计算机科学与技术 系 非师范 专业 08 年级 班

课程名称 汇编语言程序设计 教材名称 IBM-PC汇编语言程序设计 主要参考书 教材大纲类型 06大纲 任课教师

汇编语言程序设计

第一章 基础知识

教学目的和要求:

? 熟练掌握进位计数制和各种进位计数制之间的数制转换 ? 掌握计算机中数和字符的表示方法 教学重点:

? 二进制数和十六进制数运算 教学难点:

? 十六进制数的运算 ? 教学方式:课堂讲授 教学过程:

前言:

汇编语言的特点:

? 面向机器的低级语言,通常是为特定的计算机或计算机系列专门设计的。 ? 保持了机器语言的优点,具有直接和简捷的特点。

? 可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。 ? 目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。 ? 经常与高级语言配合使用,应用十分广泛。

1.1 进位计数制与不同基数的数之间的转换

一、二进制数转换为十进制数 方法:按权展开

例如:1010110.1011B=26+24+21+2-1+2-3+2-4 二、十进制转换为二进制数 方法:

整数部分:除基取余,自底向上 小数部分:乘基取整,自顶向下

例如:N=130D,求其对应的二进制数 130D=10000010B

三、十六进制数及其与二进制、十进制之间的转换 1.十六进制数←→二进制数 例如:

3B2H=10110110010B 1001001101B=24DH

2.十六进制数←→十进制数 3B2H=3*162+11*161+2*160 23D=17H

1.2 二进制数和十六进制数的运算

一、二进制数运算 逢二进一 借一为二

加法规则 乘法规则 0 + 0 = 0 0 ? 0 = 0

- 1 -

汇编语言程序设计

0 + 1 = 1 0 ? 1 = 0 1 + 0 = 1 1 ? 0 = 0 1 + 1 = 0 (进位1) 1 ? 1 = 1 二、十六进制数运算 1.加法和减法

逢十六进一 借一为十六

2.乘法

化为十进制数,求得结果后再化为十六进制数

1.3 计算机中数和字符的表示

一、数的补码表示 规则:

正数的补码等于原码

负数的补码等于其绝对值的原码各位取反然后末位加一 如:-36D,机器字长为16位,求其补码 36的原码为0000000000100100 按位取反:1111111111011011 末位加一:1111111111011100 二、补码的加法和减法

加法规则:[X+Y]补码 = [X]补码 + [Y]补码 减法规则:[X-Y]补码 = [X]补码 + [-Y]补码 例如:机器字长为8,求[32-17]补,[32+6]补 [32-17]补: 00100000 +11101111 =00001111 [32+6]补: 00100000 +00000110 =00100110 注:

? 补码减法可转换为补码加法 ? 进位和溢出

? 进位: 由于运算结果超出了位数,最高有效位向前的进位,这一位自然丢失,一般不

表示结果的对错。

? 溢出:表示结果超出了字长允许表示的范围,一般会造成结果出错。

- 2 -

汇编语言程序设计

三、无符号数 四、字符表示法

ASCII码:用一个字节来表示一个字符,低7位为字符的ASCII值,最高位一般用作校验位。

1.4 几种基本的逻辑运算

第二章 80x86计算机组织

2.1 80x86微处理器

由80386微处理器芯片构成的微机称为386微机,由80486微处理器芯片构成的微机称为486微机,P15 表2.1反映出从8086~PentiumII的一些主要技术参数,大家可通过它了解一下CPU的发展历程。

2.2 基于微处理器的计算机系统构成

一、硬件

- 3 -

汇编语言程序设计

运算器 CPU 控制器 寄存器 存储器 由系统总线连接 数据线 地址线 控制线

I/O设备 大容量存储器

运算器:所有算术与逻辑运算 控制器:全机控制工作,从存储器中取出指令,经译码分析后向全机发出取数、执行、存数等控制指令。

寄存器:CPU内部的存储单元 存储器:计算机的记忆部件

I/O设备:负责与外界通信的输入、输出设备,如显示器、键盘等 大容量存储器:可存储大量信息的外部存储器,如磁盘、光盘等 数据线:传送信息

地址线:指出信息来源和目的地 控制线:规定总线的动作

注:系统总线的工作由总线控制逻辑指挥 二、软件

软件系统包括:系统软件和应用软件。

2.3 中央处理机

一、CPU的组成

? 算术逻辑部件 ? 控制逻辑 ? 工作寄存器

386后出现了高速缓冲存储器 二、80x86寄存器组

寄存器是运算器中的存储单元。分为:

? 程序可见的寄存器(在汇编语言程序设计中用到的寄存器) ? 程序不可见的寄存器(程序设计不可用,由系统调用的) 程序可见的寄存器包括:通用寄存器,专用寄存器,段寄存器 1、通用寄存器

- 4 -

汇编语言程序设计

- 5 -

汇编语言程序设计

第三章 80x86的指令系统和寻址方式

教学目的和要求:

? 熟练掌握8086的寻址方式 ? 熟练掌握8086的指令系统 教学重点:

? 8086的指令系统和寻址方式 教学难点:

? 寻址方式的理解,各指令的用法 教学方式:课堂讲授与编程环境演示相结合 教学过程:

指令系统的一般格式:

操作码 操作数,操作数,……,操作数 一地址指令:只有一个操作数

二地址指令:有二个操作数,常见格式为:操作码 目的操作数,原操作数 三地址指令:有三个操作数

3.1 80x86的寻址方式

操作数可存放的位置: ? 立即数 ? 寄存器中 ? 存储器中 一、与数据有关的寻址方式 1、立即寻址方式

操作数直接存放在指令中。

如:MOV AX,10A7H ;源操作数的寻址方式为立即寻址 MOV AL,87H

注:常用来表示常数,只能用于源操作数,不能用于目的操作数。 2、寄存器寻址方式

操作数存放在CPU内部的寄存器中,指令指定寄存器号。 如:MOV AX,BX INC CX

ADD BL,7 ;目的操作数的寻址方式为寄存器寻址方式

注:16位操作数,可用AX,BX,CX,DX,SP,BP,SI,DI 8位操作数,可用AL,AH,BL,BH,CL,CH,DL,DH

(除了上述两种寻址方式外,其他的寻址方式中操作数均保存在存储器中,介绍之前先学习几个定义)

有效地址(EA:Effective Address):即偏移地址

- 6 -

汇编语言程序设计

可由以下四部分组成:

位移量:存放在指令中的一个8位,16位或32位的数或符号地址。 基址:存放在基址寄存器中的内容。(常用于指向数据段中数组或字符串的首地址) 变址:存放在变址寄存器中的内容。(常用于访问数据段中数组的某个元素或字

符串的某个字符)

比例因子:用于386及以后机型,可以是1,2,4,8,常用于访问数组。 8086~80286有效地址的组成部分:

位移量 基址寄存器 变址寄存器 比例因子 8,16位 BX,BP SI,DI 无

有效地址的计算公式:

EA=基址+变址+位移量

386以后:EA=基址+变址×比例因子+位移量

3、直接寻址方式

数据在存储器中,有效地址由指令直接给出。 EA=位移量

注:有效地址就是偏移地址。 如:MOV AX,[1008H]

则:执行完后: (AX)=1234H 注:

1. 可用符号地址代替数值地址。如

MOV AX,VALUE 或者 MOV AX,[VALUE] 2. 有效地址直接给出,段地址默认为数据段。若访问其他段的数据,需加段跨越前缀。 3. 字数据存放在存储器中时,高地址存放在高字节,低地址存放在低字节。

- 7 -

汇编语言程序设计

4、寄存器间接寻址 基址寄存器:BX,BP 变址寄存器:SI,DI

操作数在存储器中,有效地址为基址寄存器或变址寄存器的内容。即:EA=基址/变址

如:MOV AX,[BX] 设(DS)=3000H,(BX)=2000H,(32000H)=12H,(32001H)=34H 则:

EA=(BX)=2000H 物理地址=32000H 执行后:(AX)=3412H

注:当基址寄存器用BP时,默认段为SS,否则为DS。该规则在以后的几种寻址方式中同样适用。

如:MOV AX,[BP] (DS)=3000H,(SS)=2000H,(BP)=2000H 则:物理地址=22000H

5、寄存器相对寻址 EA=基址/变址+位移量 如:

MOV AX,[BP+1000H]

MOV AX,COUNT[BX]或MOV AX,[BX+COUNT] COUNT为位移量。 如果(DS)=3000H,(SS)=2000H,(BP)=2000H,(BX)=3120H,COUNT=0040H 则:(1)物理地址=23000H (2)物理地址=33160h

6、基址变址寻址方式 EA=基址+变址

如:MOV AX,[BX][SI] 或 MOV AX,[BX+SI]

7、相对基址变址寻址方式 EA=基址+变址+位移量

如:MOV AX,COUNT[BX][DI]或MOV AX,[BX+DI+COUNT] (注意:教材43-44,8-10的寻址方式为386以后机型增加的寻址方式,在此不再介绍。)

二、与转移地址有关的寻址方式(略)

3.2 程序占用的空间和执行的时间

- 8 -

汇编语言程序设计

补充:汇编语言的编写及调试运行过程

1、汇编语言源程序的基本格式

注:

1. 程序必须有代码段,而数据段、附加段、堆栈段只有必要时才有。 2. 用ASSUME将我们定义的各段与段寄存器相对应。

3. 在程序开始时,应将除代码段以外的其余各段的段地址赋给相应的段寄存器。 4. 程序结束时要有返回DOS的语句。

2、程序调试过程

1、编辑.ASM汇编语言源程序。(在DOS下可用EDIT编写) EDIT A.ASM

2、用MASM对源程序汇编,产生.OBJ的目标文件。 MASM A.ASM 或 MASM A;

注:如果提示有语法错误,则不产生.OBJ文件,此时我们要返回第1步修改源程序。 3、用LINK对.OBJ文件进行连接,产生.EXE的可执行文件。 LINK A.OBJ 或 LINK A;

4、执行.EXE可执行文件,或者用DEBUG对.EXE文件进行调试。 执行:A

调试:DEBUG A.EXE

3、DEBUG常用指令简介 1、U (反汇编)命令

- 9 -

汇编语言程序设计

格式:U 或 U 地址 或 U 地址1 地址2 功能:从代码段中指定地址进行反汇编 常用方式:

U 从上次结束的位置进行反汇编 U 地址 从指定地址开始进行反汇编 2、G(执行)命令

格式:G[=地址1][地址2]

功能:从地址1开始执行到地址2,或执行到程序结束。 常用方法:

G 从当前位置执行到程序结束 G 地址 从当前位置执行到指定地址 3、T(跟踪)命令

格式:T[=地址1][数值N]

功能:从地址1起执行N条指令后停止。 常用方法:

T 仅执行当前一条指令 4、D(显示)命令

格式:D[地址]或D[地址1 地址2] 功能:显示指定内存单元的内容 常用方法:

D 地址 从指定地址开始显示内存单元的内容

注:如果地址仅仅是偏移地址,则系统默认为数据段。 5、R(寄存器)命令 格式:R[寄存器名]

功能:显示指定寄存器的值 常用方法:

R 显示所有寄存器的值 6、Q(退出)命令 格式:Q

3.3 80x86的指令系统

学习汇编语言指令应该把握以下几点: ① 汇编指令的共性 ·双操作数指令中,两个操作数不能同为存储单元,也不能同为段寄存器,目的操作数不能为立即数。 ·单操作数指令中,操作数可以是除立即数以外的任何寻址方式 ② 指令对标志寄存器的影响

③ 各指令的格式、使用方法和注意事项 1、传送指令

- 10 -

汇编语言程序设计

1)通用传送指令

包括:MOV、PUSH、POP、XCHG

① MOV 最基本的传送指令 格式:MOV DST,SRC 执行的操作:(DST)←(SRC) 说明:

? 目的操作数不能为CS和IP

? 传送的数据可以是8位或16位,取决于操作数的形式 ? 源操作数的长度应该小于或等于目的操作数的长度 ? 所有通用传送指令都不改变标志位 例如:

MOV AX,BX √ MOV AX,[BX] √ MOV [AX],[0000H]× MOV VALUE,24H √ MOV CS,1243H ×

② PUSH、POP 堆栈操作指令 ·PUSH 进栈指令 格式:PUSH SRC 执行的操作: (SP)←(SP)-2 ((SP)+1,(SP))←(SRC) ·POP出栈指令 格式:POP DST 执行的操作:

(DST)←((SP)+1,(SP)) (SP)←(SP)+2 说明:

? PUSH和POP是字操作

? 操作数为除立即数以外的任何形式 ? POP指令不能用CS

? 常用于对寄存器值的保存和恢复

③ 交换指令XCHG

格式:XCHG OPR1,OPR2 操作:(OPR1)←→(OPR2) 说明:

? OPR表示操作数

? 两操作数中至少有一个为寄存器,但不能为段寄存器或IP

- 11 -

汇编语言程序设计

? 允许字/字节操作 如:

XCHG AX,BX √ XCHG AX,[0011H] √ XCHG BX,1 × XCHG BX,CS ×

2)累加器专用传送指令 包括:IN OUT XLAT

这组指令只限于使用AX或AL传送信息。用于与外设直接的数据传递。 ① IN输入指令 长格式:

IN AL,PORT(字节) IN AX,PORT(字) 执行的操作:

(AL)←(PORT)(字节) (AX)←(PORT+1,PORT)(字) 短格式:

IN AL,DX(字节) IN AX,DX(字) 执行的操作: (AL)←((DX))(字节) (AX)←((DX)+1,(DX))(字) ② OUT输入指令 长格式:

OUT PORT,AL(字节) OUT PORT,AX(字) 执行的操作:

(PORT)←(AL)(字节) (PORT+1,PORT)←(AX)(字) 短格式:

OUT DX,AL(字节) OUT DX,AX(字) 执行的操作: ((DX))←(AL)(字节) ((DX)+1,(DX))←(AX)(字) 说明:

? IN指令:I/O→AL或AX

? OUT指令:AL或AX → I/O

? I/O设备中前256个端口(0-FFH)端口号可使用长格式直接在指令中指定。

- 12 -

汇编语言程序设计

? 端口号>=FFH时,只能用短格式。 例如:写出下列指令:

? 把端口34H的字数据送到存储单元str中。

IN AX,34H

MOV STR,AX 或者:

MOV DX,34H IN AX,DX MOV STR,AX

? 把端口2AFH的字节数据送到存储单元str1中。

MOV DX,2AFH IN AX,DX

MOV STR1,AX

? 把存储单元STR中的字数据送到端口28H中。

MOV STR,AX OUT 28H, AX 或:

MOV STR,AX MOV DX,28H OUT DX,AX

? 把存储单元STR1中的字节数据送到端口37AH中。

MOV STR1,AX MOV DX,37AH OUT DX,AX

③换码指令XLAT(略)

3)地址传送指令

包括:LEA、LDS、LES、LSS ① LEA取有效地址指令 格式:LEA REG,SRC 操作:(REG)←SRC 注:REG为寄存器

例如:设(BX)=1200H,(SI)=1000H,(DS)=3000H,(32224H)=12H,(32225H)=34H,试比较以下两条指令的执行结果: LEA BX,[BX+SI+0024H] MOV BX,[BX+SI+0024H] ② LDS地址送DS和寄存器指令 格式:LDS REG,SRC 操作:

(REG)←(SRC) (DS)←(SRC+2) 如:

- 13 -

汇编语言程序设计

② LES地址送DS和寄存器指令 格式:LES REG,SRC 操作:

(REG)←(SRC) (ES)←(SRC+2) ③ LSS地址送DS和寄存器指令 格式:LSS REG,SRC 操作:

(REG)←(SRC) (SS)←(SRC+2)

说明: ·该组指令的操作数可以使用16位寄存器,但是不能使用段寄存器 ·源操作数可以是除立即数和寄存器以外的任何一种存储器寻址方式 ·不影响标志位

4)标志传送指令

包括:LAHF、SAHF、PUSHF、POPF ① LAHF读取标志指令(load ah with flags) 格式:LAHF

操作:(AH)←(标志寄存器FLAGS的低字节) ② SAHF设置标志指令(store ah into flags) 格式:SAHF

操作:(FLAGS的低字节)←(AH) ③ 对标志寄存器的入栈和出栈的指令 格式:PUSHF 操作:

(SP)←(SP)-2

((SP)+1,(SP))←(FLAG)

- 14 -

汇编语言程序设计

格式:POPF 操作:

(FLAG)←((SP)+1,(SP)) (SP)←(SP)+2 5)类型转换指令

①CBW(convert byte to word) 字节转换为字命令 格式:CBW

操作:AL的内容符号括号到AH,形成AX中的字。

说明:若AL的符号位为0,则(AH)=0;若AL的符号位为1,则(AH)=0FFH。 例如:

(AL)=01H,则CBW执行后,(AX)=0001H (AL)=0F1H,则CBW执行后,(AX)=0FFF1H

②CWD(convert word to double word) 字转换为双字命令 格式:CWD

操作:AX的内容符号括号到DX,形成DX:AX中的双字。

2、算术运算指令 1)加法指令

包括:ADD、ADC、INC ① ADD不带进位位的加法指令 格式:ADD DST,SRC

操作:(DST)←(DST)+(SRC) ② ADC带进位位的加法指令 格式:ADC DST,SRC

操作:(DST)←(DST)+(SRC)+CF ③ INC增量指令 格式:INC OPR

操作:(OPR)←(OPR)+1 说明: ① 均可为字/字节操作 ② 均影响标志位,但INC不影响CF标志位 ③ 对标志位的影响 ·结果为负,则SF=1,否则SF=0 ·结果为0,则ZF=1,否则ZF=0 ·最高有效位有进位时CF=1,否则CF=0

- 15 -

汇编语言程序设计

·当两个操作数的符号相同,而结果的符号与之相反,则OF=1,否则OF=0 ④ CF=1表示无符号加法溢出 OF=1表示带符号加法溢出

2)减法指令

包括:SUB、SBB、DEC、NEG、CMP ① SUB不考虑借位的减法指令 格式:SUB DST,SRC

操作:(DST)←(DST)-(SRC) ② SBB考虑借位的减法指令 格式:SBB DST,SRC

操作:(DST)←(DST)-(SRC)-CF ③ DEC减量指令 格式:DEC OPR

操作:(OPR)←(OPR)-1 ④ NEG求补指令 格式:NEG OPR

操作:(OPR)←0FFFFH-(OPR)-1 (字) (OPR)←0FFH-(OPR)-1 (字节)

即各位取反加1

如:NEG AX

设(AX)=1234H,则结果(AX)=0EDCCH ⑤ CMP比较指令

格式:CMP OPR1,OPR2

操作:(OPR1)-(OPR2),结果不保存,只根据结果设置标志位 说明:

1、均可为字/字节操作

2、均影响标志位,但DEC不影响CF 3、对标志位的影响 ·① ② ⑤:CF:有借位时CF=1 ·① ② ③ ⑤:OF:若两个操作数的符号相反,而结果与减数的相同,则OF=1 ·④ :CF:OPR为0,则CF=0,否则CF=1(实际还是最高有效位产生进位)

OF:字节运算时OPR为-128或字运算时OPR为-32768时,OF=1,否则为0

(求补即为求其相反数的补码,实际还是超出了机器的表示范围)

- 16 -

汇编语言程序设计

3)乘法指令

包括:MUL 无符号相乘、IMUL带符号数相乘

格式:MUL SRC 或 IMUL SRC 操作:

字节:(AX)←(AL)*(SRC)

字:(DX,AX)←(AX)*(SRC) 说明: ① 由SRC决定是字操作还是字节操作 ② SRC不可用立即寻址 ③ 对标志位的影响

◆对除CF和OF以外的条件码无定义。(无定义即运算后条件码的状态不定) ◆对CF和OF的影响:

MUL:若乘积的高一半为0,则CF和OF位均为0,否则为1。

IMUL:若乘积的高一半为低一半的符号扩展,则CF和OF位均为0,否则为1。 注意:可通过CF,OF判断乘积是否扩展到了高一半。 4)除法指令

包括:DIV 无符号数除法、IDIV带符号数的除法

格式:DIV SRC 或 IDIV SRC 操作: 字节:

(AL)←(AX)/(SRC)的商 (AH)←(AX)/(SRC)的余数 字:

(AX)←(DX,AX)/(SRC)的商 (DX)←(DX,AX)/(SRC)的余数 说明: ① SRC不允许为立即寻址方式 ② 除法指令对各标志位无定义 ③ 8086中规定余数符号和被除数的符号相同 例如:-30/8 商 余数 -4 2 × -3 -6 √ ④ 若被除数与除数的位数相同,需要对被除数进行扩展 例如:-8/2 程序为: MOV AX, -8 MOV AL,-8 MOV BL,2 MOV BL,2 IDIV BL CBW - 17 - 汇编语言程序设计

IDIV BL 结果:商al=0fcH,余数ah=0

3、逻辑运算和移位指令 1) 逻辑运算指令

包括AND、OR、NOT、XOR、TEST ① AND 逻辑与指今 格式:AND DST,SRC

执行的操作:(DST)←(DST)∧ (SRC) 注:常用于屏蔽某些位

例如:屏蔽AL的第0,1,4位。 MOV AL,0BFH AND AL,0ECH ② OR 逻辑或指令 格式:OR DST,SRC

执行的操作:(DST)←(DST)∨ (SRC) 注:常用于对某些位置1。 例如:置BL的第1,5位为1 MOV BL,87H OR BL,22H ③ NOT 逻辑非指令 格式:NOT OPR

执行的操作:(OPR)←(OPR) ④ XOR 异或指令

格式:XOR DST,SRC

执行的操作:(DST)←(DST)?(SRC)

注:常用于对某些位取反。

例如:将ax的第0,4,7,12,14位取反。 MOV AX,4A3BH XOR AX,5091H ⑤ TEST 测试指令

格式:TEST OPRl,OPR2 执行的操作:(OPRl)∧ (OPR2) (不保存结果,根据结果设置标志位) 注:常用于测试某些位是否为0。

例如:测试al的第0,1,2,3,5,7位是否为0. MOV AL,40H TEST AL,0AFH ZF=1:结果为0.

- 18 -

汇编语言程序设计

说明:

1. 可以为字/字节操作 2. 对标志位的影响: ★ NOT不影响标志位 ★ 其余的指令使CF,OF为0,AF无定义,SF,ZF,PF根据结果设置。

2) 移位指令

包括:SHL,SHR,SAL,SAR,ROL,ROR,RCL,RCR ① 逻辑左移指令

格式:SHL OPR,CNT

注:CNT=1时,可以直接写1,如:SHL OPR,1 CNT>1时 必须把CNT放在CL中。

如:要将AX逻辑左移5位 MOV CL,5 SHL AX,CL

操作:

② 算术左移指令

格式:SAL OPR,CNT 操作:与SHL相同 ③ 逻辑右移指令

格式:SHR OPR,CNT 操作:

④ 算术右移指令

格式:SAR OPR,CNT 操作:

- 19 -

汇编语言程序设计

⑤ 循环左移指令

格式:ROL OPR,CNT 操作:

⑥ 循环右移指令

格式:ROR OPR,CNT 操作:

⑦ 带进位循环左移指令 格式:RCL OPR,CNT 操作:

⑧ 带进位循环右移指令 格式:RCR OPR,CNT 操作:

说明:

1. 可以为字/字节操作

2. 对条件码的影响(CF)

3. OPR可以是除立即数以外的任何寻址方式

4、串操作指令

包括: MOVS,CMPS,SCAS ,LODS,STOS 与上述指令配合使用的前缀有:

- 20 -

汇编语言程序设计

REP 重复

REPE/REPZ 当相等/为零时重复

REPNE/REPNZ 当不相等/不为零时重复

1)重复指令 ① REP重复串操作 格式:REP 串指令 操作:

1. CX=0时,退出REP,否则继续执行 2. CX=CX-1

3. 执行REP后面的串指令 4. 重复1.~3. ② REPE/REPZ 当相等/为零时重复串操作 格式:REPE(或REPZ) 串指令 操作:

1. CX=0或ZF=0时退出,否则继续执行 2. CX=CX-1

3. 执行REPE/REPZ后面的串指令 4. 重复1.~3. ③ REPNE/REPNZ 当不相等/不为零时重复串操作

当CX=0或ZF=1时退出,其余的操作与REPE/REPZ相同

2)串处理指令 ① MOVS 串传送指令

格式:MOVSB 字节操作,MOVSW字操作 操作: ·((DI))←((SI)) ·修改SI,DI

字节:(SI)←(SI)±1 ,(DI)←(DI)±1 字:(SI)←(SI)±2 ,(DI)←(DI)±2 注:DF=0时,用+,DF=1时,用- 功能:把SI指向的数据段中的一个字/字节传送到由DI指向的附加段的一个字/字节单元中。

设置DF的指令: 设置DF=0,CLD 设置DF=1,STD

例如:将数组STR1的内容传送到数组STR2中。 设 STR1 DB ‘HELLO’ ;(在数据段中)

- 21 -

汇编语言程序设计

STR2 DB 5 DUP(?) ;(在附加段中) 程序

LEA SI,STR1 LEA DI,STR2 MOV CX,5 CLD

REP MOVSB

由此可知,要想传送整个字符串,需做以下工作: 1. 设置SI,DI

2. 将字符串长度送CX寄存器 3. 设置DF

4. 执行REP MOVSB ② CMPS 字符串比较指令

格式:CMPSB 字节操作,CMPSW字操作 操作: ·((SI))—((DI)) ·修改SI,DI

字节:(SI)←(SI)±1 ,(DI)←(DI)±1 字:(SI)←(SI)±2 ,(DI)←(DI)±2 功能:将SI指向的数据段中的一个字/字节单元的内容与DI指向的附加段中的一个字/字节单元的相减,但不保存结果,根据结果设置标志位。

例如:比较字符串STR1与字符串STR2是否相等。 设 STR1 DB ‘HELLO’ ;(在数据段中) STR2 DB ‘HELOO’ ;(在附加段中)

程序如下: LEA SI,STR1 LEA DI,STR2 MOV CX,5 CLD

REPE CMPSB JE MATCH

JNE NOMATCH ……

MATCH:………… …… ……

NOMATCH:…… …………

- 22 -

汇编语言程序设计

………… ③ SCAS 字符串检索指令

格式:SCASB 字节操作,SCASW字操作 操作: · 字节:(AL)—((DI)),(DI)←(DI)±1 · 字: (AX)—((DI)),(DI)←(DI)±2 功能:常用于查找某字符是否在某字符串中。

例如:在附加段中定义如下字符串STR,查找空格是否在该字符串中。 STR DB ‘WHAT IS THIS’

程序如下: MOV AL,20H LEA DI,STR MOV CX,12 CLD

REPNE SCASB JNZ NOFOUND JZ FOUND ……

FOUND:………… …… ……

NOFOUND:…… ………… ………… ④ LODS 取字符串指令

格式:LODSB 字节操作,LODSW字操作 操作: · 字节:(AL)←((SI)),(SI)←(SI)±1 · 字: (AX)←((SI)),(SI)←(SI)±2

功能:把由SI指向的数据段中的一个字/字节单元的内容传送到AL/AX中。 ⑤ STOS 存字符串指令

格式:STOSB 字节操作,STOSW字操作 操作: · 字节:((DI))←(AL),(DI)←(DI)±1 · 字: ((DI))←(AX),( DI)←(DI)±2

功能:把AL/AX中的内容传送到由DI指向的附加段中的一个字/字节单元中。

5、控制转移指令 1)无条件转移指令

- 23 -

汇编语言程序设计

格式:JMP OPR

功能:转移到指定的地方继续执行

2)条件转移指令

JE/JZ 相等,则转移

JNE/JNZ 不相等,则转移 ·带符号数的比较

(大于:Greater 小于:Less 等于:Equal)

JG/JNLE 大于,则转移 JNG/JLE 不大于,则转移 JL/JNGE 小于,则转移 JNL/JGE 不小于,则转移 ·无符号数的比较

(高于:Above 低于:Belove 等于:Equal)

JB/JNAE 低于,则转移 JNB/JAE 不低于,则转移 JA/JNBE 高于,则转移 JNA/JBE 不高于,则转移 ·根据某个标志位的值

JZ ZF为1,则转移 JNZ ZF为0,则转移 JS SF为1,则转移 JNS SF为0,则转移 JO OF为1,则转移 JNO OF为0,则转移 JP PF为1,则转移 JNP PF为0,则转移 JC CF为1,则转移 JNC CF为0,则转移 ·测试CX之为零则转移指令

JCXZ ;CX的值为0,则转移

例如:比较AX和BX中两个带符号数的大小,如果(AX)>(BX),则令CX=0;否则令CX=0FFFFH (条件设置指令 略) 3)循环指令 ① LOOP 循环指令 格式:LOOP OPR 循环条件:(CX)≠0

- 24 -

汇编语言程序设计

② LOOPZ/LOOPE 当相等或为零时循环指令 格式:LOOPZ/LOOPE OPR 循环条件:ZF=1且(CX)≠0 ③ LOOPNZ/LOOPNE 当不相等或不为零时循环指令 格式:LOOPNZ/LOOPNE OPR 循环条件:ZF=0且(CX)≠0

以上三条指令执行的步骤: 1. (CX)=(CX)-1

2. 判断测试条件,满足条件则进行循环,否则退出循环。

例如:设在数据段中有如下数组:ARRAY DW 1,2,3,4,5 求该数组各元素的和,并将结果保存到AX寄存器中。

MOV CX,5 MOV AX,0 MOV SI,0

BEGIN: ADD AX,ARRAY[SI] ADD SI,2 LOOP BEGIN 4) 子程序调用和返回指令 ① CALL 子程序调用指令 格式:CALL DST 操作:

1. 根据情况将IP(和CS)入栈 2. 根据情况设置IP(和CS) 功能:在主程序中用于调用子程序 ② RET 返回指令 格式:RET

操作:根据调用情况将IP(和CS)出栈 功能:在子程序中用于返回主程序

5)中断指令 ① INT 中断指令 格式:INT TYPE

功能:调用TYPE号中断 ② INTO 若溢出则中断指令 格式:INTO

- 25 -

汇编语言程序设计

功能:调用4号中断 ③ IRET 从中断返回指令 格式:IRET

功能:用于中断处理程序中,其功能是从中断处理程序返回到主程序中。

6、处理器控制指令(略)

四、汇编语言中的标记、表达式和伪操作 1、汇编语言概况(略)

2、汇编语言中的标记 ① 标识符 要求: ·标识符不能以数字开头 ·标识符可以由数字、字母和下划线组合而成 ·一个标识符的最大长度不能超过31个字符 ② 保留字

凡是微处理器的指令、伪指令、寄存器名都是保留字 ③ 分界符

分界符作为一个程序中或一条指令中两个部分的分隔符号。 参见P145表3.2 ④ 常数 ·二进制数:二进制数后面跟一个字母B,如:10110111B ·十进制数:十进制数后面跟一个字母D,字母D也可以不加。如:123D或123 ·十六进制数:十六进制数后面跟一个字母H,如果该数以A~F开头,则必须在前面加0 ·八进制数:八进制数后面跟一个字母Q ⑤ 注释

在汇编语言中,注释以;作为开头,;后面的均被看作是注释。

3、表达式

由操作数和运算符组成,在汇编时一个表达式得到一个值。 ① 操作数 ② 运算符 ·算术运算符 +,-,*,/

- 26 -

汇编语言程序设计

·逻辑运算符

AND,OR,NOT,XOR

注:只能对常数运算,结果也为常数 ·关系运算符

EQ(等于),NE(不等于),LT(小于),GT(大于),LE(小于等于),GE(大于等于)

如: MOV BX,PORT LT 5

如果PORT小于5 则汇编后相当于:MOV BX,0FFFFH 如果PORT大于5 则汇编后相当于:MOV BX,0 ·分析运算符

OFFSET 取有效地址,如 MOV DX,OFFSET DA1 SEG 取段地址,如 MOV DX,SEG DA1 TYPE,SIZE,LENGTH(略)

4、伪指令(指示性语句) 伪指令和指令之间的区别: 指令:在运行期间执行的

伪指令:在汇编期间由汇编程序处理。 ① 段定义伪指令 格式:

segment_name SEGMENT : :

segment_name ENDS

说明:

1. 对于数据段,堆栈段,附加段,都是用于存放数据 2. 对于代码段用于存放程序 ② 指定段伪指令 格式:

ASSUME 段寄存器名:段名,段寄存器名:段名,……

如:ASSUME CS:code_segment, DS:data_segment ③ 表示源程序结束的伪指令 格式:

END [label]

- 27 -

汇编语言程序设计

其中:label为指示程序开始执行的起始地址 ④ 数据定义及存储器分配伪指令 格式:

[变量名] 助记符 操作数 其中:

1. 助记符:说明所定义的数据类型,可为如下类型: DB:定义字节数据 DW: 定义字数据 DD:定义双字数据 DQ:定义4字数据 DT:定义10字节数据

2. 操作数:可为常数,表达式,字符串,地址等 功能:分配存储空间,存放数据 例1: 程序 存储器分配情况

0AH 10H 64H 00H DAT DB 10,10H

00H DW 100,100H 01H DAT2 DD 3*20 3CH 00H 00H 00H 00H

例2:操作数为字符串,此时DB,DW意义不同。 MESS1 DB ‘AB’

MESS2 DW ‘AB’ ;注意:如果DW型字符串,长度超过2个,则程序在汇编时出错。

存储器分配情况为: 41H A 42H B 42H B 41H A 例3:操作数为地址

DAT1 DB 12H,10H

- 28 -

汇编语言程序设计

DAT2 DW DAT1 DAT3 DW DAT2

存储器分配情况为:

例4:操作数为?,表示保留存储空间,暂时不存入数据(初始为0) NUM DB 0,?,0 DAT DW ?,52H

00H — 00H — — 52H 00H 例5:操作数可以用复制操作符

如:DAT1 DB 2 DUP(1,?)

01H — 01H — 注:DUP 也可以嵌套

如:DAT1 DB 2 DUP(0,2 DUP(1,?),1))

请同学们思考,上述语句如何分配存储空间。 ⑤ 表达式赋值伪指令 1、EQU

格式:表达式名 EQU 表达式 2、=

格式:表达式名 = 表达式

作用:给某一表达式赋予一个名字。 如:

constant EQU 256 或 constant = 256

- 29 -

汇编语言程序设计

区别:EQU不可以重复定义,而=可以重复定义。 如: EMP EQU 7 EMP = 7 : : : : EMP EMP = 12 EQU 12 √ ×

附:调用DOS功能调用实现输入输出的方法(INT 21H) 调用参数 返回参数 AH 功能 键盘输入并回AL=输入字符 01 显 DL=输出字符 02 显示输出 DS:DX=串地址 字符串必须以’$’ 09 显示字符串 结束

- 30 -

汇编语言程序设计

区别:EQU不可以重复定义,而=可以重复定义。 如: EMP EQU 7 EMP = 7 : : : : EMP EMP = 12 EQU 12 √ ×

附:调用DOS功能调用实现输入输出的方法(INT 21H) 调用参数 返回参数 AH 功能 键盘输入并回AL=输入字符 01 显 DL=输出字符 02 显示输出 DS:DX=串地址 字符串必须以’$’ 09 显示字符串 结束

- 30 -

本文来源:https://www.bwwdw.com/article/vwp3.html

Top