汇编语言课件
更新时间: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 -
正在阅读:
汇编语言课件06-28
8万煤气柜 - 图文03-17
【推荐】语文学习计划范文六篇03-28
在区委经济工作会议上的讲话04-16
第五章 汽车操纵稳定性仿真分析06-16
地下车库土方工程方案03-10
2022年国家宪法日、宪法宣传周暨法治宣传教育月主题宣传活动指导03-23
北京奥运会志愿者招募宣传海报推出02-12
大别山支教团第三届志愿者招募笔试试题12-01
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 汇编语言
- 课件
- 低温共烧陶瓷ansys分析
- 手工计算钢筋的步骤以及方法
- 财产险考试题库
- 浙江省2004年1月高等教育自学考试建筑工程定额与预算试题
- 2009届上海语文高考杨静宝青四区二模联考卷(附答案)
- 人字形截水骨架护坡
- 青春之歌再解读—教案、讲稿
- 一品湖山大门口施工方案 - 图文
- 2018年衡水市小学毕业小升初模拟数学试题(共4套)附详细答案
- 公共政策概论期末复习-电大本科
- 语文S版五年级下册教学反思
- 毕业论文初稿(正文)
- 厉鹗《樊榭山房词》(一)
- 国内核电发展概述 - 图文
- 浅析新婚姻法中的财产问题
- 东财网院 毕业论文
- 长方体和正方体认识与表面积
- 农村社区建设问题的研究述评
- 山东大学本科学生社会实践活动 写实记录及考核登记表
- 国际金融期末试题(判断选择多选大全含答案)1