汇编语言重点笔记.docx

上传人:b****3 文档编号:3659153 上传时间:2022-11-24 格式:DOCX 页数:30 大小:85.75KB
下载 相关 举报
汇编语言重点笔记.docx_第1页
第1页 / 共30页
汇编语言重点笔记.docx_第2页
第2页 / 共30页
汇编语言重点笔记.docx_第3页
第3页 / 共30页
汇编语言重点笔记.docx_第4页
第4页 / 共30页
汇编语言重点笔记.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

汇编语言重点笔记.docx

《汇编语言重点笔记.docx》由会员分享,可在线阅读,更多相关《汇编语言重点笔记.docx(30页珍藏版)》请在冰豆网上搜索。

汇编语言重点笔记.docx

汇编语言重点笔记

第一章指令系统

4.1概述

1.指令的书写格式

●指令——CPU执行某种操作的“命令”,指令的集合称为指令系统。

●书写格式:

⏹机器指令——硬件可识别、可存储和运行的一串二进制描述符.

⏹符号指令——用助记符和规定的书写格式书写的指令。

例表4。

1.一个符号指令的机器指令有1~16个字节,在内存中连续存放。

∙指令地址——CPU规定:

存放指令第一字节的内存地址称为指令地址。

2,符号指令的书写格式

标号:

操作码助记符操作数助记符;注释

例:

LAST:

MOVAL,9

∙标号——地表该指令的存放地址,为程序分支、循环提供了转移目标。

▪标号的命名规则:

字母或下划线开头,后跟字母、数字、下划线≤31个字符。

▪“系统保留字”不能作为标号使用。

∙操作码——规定指令要执行的操作。

∙操作数——指令的操作对象,

∙其长度可以是单字节、双字节或者四字节。

内存中连续存放。

∙存放规则:

低字节存放在i单元,高字节存放在i+1单元。

∙目标程序——机器指令编写的程序,CPU可执行。

∙汇编源程序——用符号指令编写的程序。

需编辑、编译和链接生成CPU可执行的目标程序。

4.280486的寻址方式

微机中操作数的三种类型:

∙立即数——数据作为指令的一部分,紧跟在操作码的后面。

∙寄存器操作数——数据存放在CPU的某个寄存器中。

∙存储器操作数——数据存放在存储器中。

操作数用来指出数据在存储器中的位置。

寻址方式——CPU寻找操作数的方法称为寻址方法。

80486有7种寻址方法,其中访问存储器有5种寻址方式。

4.2.1立即寻址——操作数包含在本条指令中,是指令的一部分。

取出指令即得操作数

∙立即数表示形式——可为多种数制的数,或由+、—、*、/组成的算术表达式。

∙必须以数字开头,以字母开头的十六进制数前必须以数字0做前缀。

∙数制用后缀表示:

B、H、Q、D(可省略)

∙编译时,立即数一律编译成等值的二进制数,负数—>补码,字符’A’—>ASCII。

∙下例指令的功能是把源操作数(立即数)写入目标寄存器中,其中源操作数就是立即寻址:

MOVAL,01010101B

MOVBX,1234H

MOVCL,4

MOVDL,’A’

MOVBL,0A6H

MOVCX,3*5

MOVEAX,12345678H

4.2.2寄存器寻址

操作数存放在CPU的某个寄存器中。

寻址:

写出寄存器名。

例,见书P。

34上部。

4.2.3存储器操作数的寻址方式

∙操作数存放(或写入)某个逻辑段的存储单元之中,所以须给出用逻辑地址计算物理地址的地址表达式。

∙完整的地址表达式:

段寄存器:

[基址+变址*比例因子+位移量]

   段超越前缀  有效地址(EA)又称偏移地址

∙段超越前缀——通知CPU指令要访问的是哪一个逻辑段。

∙偏移地址——在一个逻辑段中,某存储单元相对于段首址之间的地址偏移量。

∙基址——任何通用寄存器(32位)的内容。

基址寄存器通常用于编译程序指向局部变量区。

∙变址——除ESP以外的任何通用寄存器(32位)的内容。

变址寄存器用于访问数组或字符串元素。

∙位移量——包含在指令中的立即数。

∙实模式下:

把段基址(CS内容)*16+偏移地址==>物理地址

∙保护模式下:

段基址寄存器中写入的不是段基址,而是选择符,CPU利用段选择符和段页管理部件查找出段基址+有效地址···==>物理地址。

1.直接寻址

两种书写格式:

●直接写出有效地址。

例如:

MOVBX,DS:

[1234H];取出一个字的内容—>BX

MOVAL,ES:

[2CH];取出一个字节的内容—>AL

●用变量名代替存储单元的有效地址。

(因经汇编后,存储单元的有效地址就赋给了变量名)例如:

MOVAX,DS:

BUF;取出数据段以BUF命名的字的内容—>AX

或者MOVAX,BUF

2.寄存器间接寻址(简称间址或间接寻址)

●间址寄存器——要求事先把存储单元的有效地址写入规定的寄存器中。

●指令地址的表达格式:

段寄存器:

[间址寄存器]

对于约定的逻辑段,其段超越前缀可省略。

例如:

DATA1DB11H,55H;定义变量

DATA2DW3322H

···

MOVDS,数据段段基址

···

MOVSI,OFFSETDATA1;变量DATA1单元的有效地址

MOVAL,[SI];访问数据段用SI间址取数—>AL,AL=11H

MOVDI,OFFSETDATA2

MOVBX,[DI];BX=3322H

●80486哪些寄存器可作为间址寄存器:

⏹16位4个:

BP(访问堆栈段),BX,SI,DI(访问数据段)。

⏹32位8个:

EBP,ESP(访问堆栈段),EAX~EDX,ESI,EDI(数据段)

2001.9.10。

第三次

例如:

P。

35下部

3.基址寻址

●指令地址的表达格式:

段寄存器:

[基址寄存器+位移量] 如:

DS:

[BP+10]

或   段寄存器:

位移量[基址寄存器]

对于约定的逻辑段,其段超越前缀可省略。

●可作为基址寄存器有:

⏹16位2个:

BP(访问堆栈段),BX(访问数据段)。

⏹32位8个:

EBP,ESP(访问堆栈段),EAX~EDX,ESI,EDI(数据段)

⏹例如:

P。

36中部

4.变址寻址

有两种格式:

●有比例因子的变址寻址:

存储单元的有效地址=比例因子*变址寄存器+位移量

⏹指令格式:

  段寄存器:

[比例因子*变址寄存器+位移量]

或  段寄存器:

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

⏹比例因子——是1,2,4,8中的一个数,用于检索一维数组。

⏹可作为变址寄存器的是

32位7个:

EBP(访问堆栈段),EAX~EDX,ESI,EDI(访问数据段)。

●没有比例因子的变址寻址:

存储单元的有效地址=变址寄存器+位移量

⏹指令格式:

  段寄存器:

[变址寄存器+位移量]

或  段寄存器:

位移量[变址寄存器]

⏹变址寄存器只能选择SI,DI,约定访问数据段。

●例如:

MOVAL,[2*EBX+10];从数据段有效地址为2*EBX+10单元取数—>AL

MOVAH,[SI+5];

5.基址加变址寻址

●有比例因子的基址加变址寻址:

存储单元的有效地址=基址寄存器+比例因子*变址寄存器+位移量

⏹指令格式:

  段寄存器:

[基址寄存器+比例因子*变址寄存器+位移量]

或  段寄存器:

位移量[基址寄存器+比例因子*变址寄存器]

或  段寄存器:

位移量[基址寄存器][比例因子*变址寄存器]

⏹寄存器必须是32位的。

访问约定的逻辑段,段超越前缀可省略。

⏹常用于检索二维数组。

⏹例:

MOVAX,[EBX+8*EDX+5]

●没有比例因子的基址家变址寻址:

存储单元的有效地址=基址寄存器+变址寄存器+位移量

⏹指令格式:

  段寄存器:

[基址寄存器+变址寄存器+位移量]

或  段寄存器:

位移量[基址寄存器+变址寄存器]

或  段寄存器:

位移量[基址寄存器][变址寄存器]

⏹寄存器必须是规定的16位寄存器。

访问约定的逻辑段,段超越前缀可省略。

例:

DATA1DB10HDUP(?

);定义16个字节的缓冲区

DATA2DB11H,22H,33H,44H,55H,66H

······

MOVBX,OFFSETDATA1;设BX=0100H

MOVDI,11H

MOVAL,[BX+DI+4];EA=0100H+011H+4=0115H,AL=66H

注意:

●在间址、基址、变址、基址加变址这4种寻址方式中,可使用16位,也可使用32位寄存器寻址。

●实模式时,段的最大长度为64K,所以必须保证CPU最终算出的有效地址不超过FFFFH,而且操作数最高字节单元的有效地址也不能超过FFFFH,否则执行寻址时系统将要瘫痪。

例如:

P。

37

4.2.480486寻址方式的段约定和段超越

●存储器寻址时规定使用的寄存器和约定访问的逻辑段。

见表4。

2

●如果要访问约定访问之外的逻辑段,必须明确指出相关逻辑段的段超越前缀。

例:

MOVAL,[BP];用BP间址,访问堆栈段

MOVAL,DS:

[BP];用BP间址,访问数据段

MOVAL,FS:

[BP];用BP间址,访问FS附加段

MOVAL,[BX];用BX间址,访问数据段

MOVAL,CS:

[BX];用BX间址,访问代码段

MOVAL,ES:

[SI+5];用SI变址,访问ES附加段

MOVAL,GS:

[EAX+10];用EAX基址寻址,访问GS附加段

●使用变量名直接寻址访问存储器,不需要另加段超越前缀。

MOVCX,BUF;

作业1(SZ01P。

101,22,23,26题)

4.380486的标志寄存器

标志寄存器(EFLAGS)是一个32位的寄存器,含有三类标志:

状态标志(S)、控制标志(C)、系统标志(X)。

如图:

D31D191817161514131211109876543210

AC

VM

R

0

NT

IOPL

O

D

I

T

S

Z

0

A

0

P

1

C

类型:

XXXXXSCXXSSSSS

●C标志——进位/借位标志,主要用于多字节的加、减运算,当最高位有产生进位/

借位,则C标志置1,否则为0。

移位和循环移位也影响C标志。

●P标志——奇偶标志,P标为1,表示操作结果有偶数个“1”。

用于检查数据在传

输过程是否出错。

●A标志——辅助进位/借位标志。

主要用于BCD码的运算。

置为1,表示:

字节加/减时,最低4位向高位产生了进位或借位。

字加/减时,最低8位向高位产生了进位或借位。

双字加/减时,最低16位向高位产生了进位或借位。

●Z标志——全零标志。

置为1,表示操作结果为0。

●S标志——符号标志。

置为1,表示结果数据的最高位为“1”。

●O标志——溢出标志。

置为1,表示运算结果产生溢出。

⏹CPU硬性规定:

参与运算的操作数都是有符号数,所以,当两数的符号相同而且与结果的符号位相异时,O标置1。

⏹程序设计时,如果定义操作数是有符号数,测试O标志,为1,表示溢出。

如果定义操作数是无符号数,测试C标志,为1,表示溢出。

●D标志——方向标志。

用于控制字符串操作指令中地址变化的方向。

⏹执行指令STD,D标志置1,串指针(SI/DI)自动减量,,即减址调整。

⏹执行指令CLD,D标志置0,串指针(SI/DI)自动增量,,即增址调整。

●I标志——中断允许标志。

控制CPU是否响应外部可屏蔽中断(INTR)请求。

⏹执行STI指令,I标志置为1,CPU响应可屏蔽中断。

⏹执行CLI指令,I标志置为0,CPU不响应可屏蔽中断。

⏹I标志不影响外部非屏蔽中断(NMI)或内部中断。

●T标志——陷阱标志。

用于单步调试程序。

⏹T标志为1时,CPU每执行一条指令后都产生一个内部中断。

⏹T标志为0时,CPU连续执行指令。

●IOPL标志——I/O特权级标志,占2位,表示0级~3级4个I/O特权级,其中0级最高。

用于保护模式下I/O操作,指明执行I/O指令所需的优先级。

●NT标志——任务嵌套标志。

在保护模式下,如果当前任务A嵌套在另一任务B

内,则NT=1,指示CPU,A任务执行完毕后要返回到B任务中。

●R标志——恢复标志,与调试寄存器配合使用。

当CPU响应“断点异常中断”时,R标志置1,然后标志寄存器压栈再转入相应的断点处理程序。

此时,若遇到调试故障也不在产生异常中断,断点处理程序结束后返回断点指令,R自动复位。

●VM标志——虚拟标志。

CPU在保护模式下使VM=1,转换为虚拟86操作模式。

80486就象一个高速的8086CPU在运行8086的指令流。

●AC标志——对准标志。

AC=1时,如果进行未对准的地址访问,则产生异常中断。

⏹未对准的地址访问指:

访问字操作数时,从奇地址开始。

访问双字操作数时,地址不是4的整数倍。

访问4字操作数时,地址不是8的整数倍。

4.480486的基本指令集

为了支持80486的三种工作模式,指令系统设计了系统管理指令、保护模式控制指令以及高级语言支持指令等。

80486基本的指令有:

4.4.1传送类指令

∙特点:

源操作数不变,不影响状态标志。

∙分类:

通用转送指令、堆栈操作指令、输入/输出指令(第7章介绍)。

1.通用传送指令

(1)。

数据传送指令

∙格式:

MOVDEST,SRC

∙功能:

把SRC中的内容复制到DEST中去。

DEST和SRC是字节、字或双字。

段寄存器

使用时应注意以下几点:

1)。

源和目的操作数不能同时为目的操作数

通用寄存器

存储器

例:

MOV[DI],[SI];是非法指令

2)。

立即数不能作为目的操作数

立即数

例:

MOV1234H,AX;是非法指令

3)。

不能将立即数直接传送到段寄存器

图传送指令数据流

例:

MOVDS,1000H;是非法指令

应借用一个16位的寄存器过度:

MOVAX,DATA;DATA为数据段名,编译后即为DATA段的段基址。

MOVDS,AX

4)。

源和目的操作数的数据位应等长,即同为字节、字或双字。

例:

MOVBL,AX;是非法指令

例:

XYZDB12H;定义XYZ为字节变量

MOVAX,XYZ;AX是字操作数,而XYZ是字节变量,错。

例:

MOV[BX],12H;源和目的操作数都没有指明长度,故出错

必须用PTR运算符说明目的操作数的属性(可以是BYTE、WORD、DWORD)。

改为:

MOVBYTEPTR[BX],12H

5)。

以CS为目标的一切转送都是非法的。

(2)。

符号扩展转送指令

▪格式:

MOVSXDEST,SRC

▪说明:

目标操作数DEST是16位或32位的寄存器操作数。

源操作数SRC是小于(或等于)目标字长的寄存器操作数或内存操作数。

▪功能:

将SRC的符号位向高位扩展使其与目标字长相同,然后再传送到DEST,而SRC不变。

▪例:

MOVDL,-16;DL=F0H(补码)

MOVSXBX,DL;BX=FFF0H,而DH,DL不变。

(3)。

零扩展传送指令

▪格式:

MOVZXDEST,SRC

▪功能:

与MOVSX类似,只是将源操作数SRC高位用0补足16或32位,然后再传送到目标寄存器DEST。

▪例:

MOVDL,-16;DL=F0H(补码)

MOVZXBX,DL;BX=00F0H,而DH,DL不变。

(4)。

有效地址传送指令

▪格式:

LEA目标寄存器,内存操作数

▪功能:

将内存操作数的有效地址传送到目标寄存器中。

▪例:

LEABX,BUF;将BUF单元的有效地址——>BX

等价于MOVBX,OFFSETBUF;编译时完成有效地址的计算,执行时完成赋值。

▪例:

LEAEAX,[SI+5];将变址寻址的那个单元的有效地址——>BX

低16位

高16位

(5)。

指针传送指令

格式:

LDS

LES目标(16位)寄存器,32位内存操作数

LFS

LGS目标(32位)寄存器,48位内存操作数

低32位

高16位

LSS

·例:

见P。

42下部。

(6)。

标志寄存器传送指令

·格式及功能

LAHF;将标志寄存器的低8位传送到AH寄存器中。

SAHF;将AH的内容传送到标志寄存器的底8位。

(7)。

交换指令

▪格式:

XCHGDEST,SRC

▪功能:

DEST与SRC中的内容交换

▪说明:

DEST与SRC是等长的操作数,但不能同时为内存操作数。

▪实例:

将两个存储单元的内容互换

FIRSTDB35H用MOV指令实现:

SECONDDB38H

···MOVAL,FIRST

MOVAL,FIRSTMOVAH,SECOND

XCHGAL,SECONDMOVFIRST,AH

MOVFIRST,ALMOVSECOND,AL

(8)。

字节交换指令

▪格式:

BSWAP32位寄存器

▪功能:

将32位寄存器的第四字节(位32~位24)与第一字节(位7~位0)交换,第三字节(位23~位16)与第二字节(位15~位8)交换。

▪例:

MOVEAX,44332211H

BSWAPEAX;EAX=11223344H

(9)。

查表指令

▪格式:

XLAT表头变量名

▪功能:

完成一个字节的查表转换。

在DS:

BX(或DS:

EBX)建立一个单字节的集合——字节表,用EBX(或BX)作为基址,AL作为表的无符号下标(既表指针),将AL指向的那个单元的内容传送回AL。

▪实例:

P。

43

2.堆栈操作指令

▪堆栈——定义的一块连续内容空间,用来暂存数据。

栈底为堆栈空间的高地址单元,栈顶为低地址单元,且只有栈顶一个出口。

▪数据的存取规律——“先进后出”。

▪数据进栈的规律——高位字节存入高地址,低位字节存入低地址。

▪出栈规律——低位字节弹到目标操作数的低位,高位字节弹到目标操作数的高位。

▪用SP或ESP存放栈顶的有效地址。

数据进栈后,ESP向低地址方向浮动;出栈后,ESP向高地址方向调整。

见图ST03-10(SFXP。

69)

(1)。

PUSH进栈指令

▪格式:

PUSH源操作数(可是立即数、通用寄存器和内存操作数)

▪功能:

该指令使ESP中内容减2(16位操作数)或减4(32位操作数),然后把操作数放到新栈顶。

若源操作数是ESP或SP,则486CPU将调整前的ESP或SP压栈。

▪例:

PUSHAX;SP-2——>SP,AX——>SS:

[SP]的2个单元。

PUSHDWORDPTR[SI+5]

完成ESP-4—>ESP,[SI+5]的1个双字—>SS:

[ESP]的4个单元。

(2)。

POP出栈指令

▪格式:

POP目标操作数(除CS以外的段寄存器、通用寄存器、内存操作数)

▪功能:

从栈顶弹出2个或4个字节,送目标操作数,然后调整堆栈指针。

▪例:

POP AX;SS:

[SP]的2个单元——>AX,SP+2——>SP。

POPDWORDPTR[SI];SS:

[ESP]的4个字节—>[SI]的4个单元,ESP+4—>ESP。

▪实例:

设SS=0200H,SP=0212H,AX=1234H,CX=5678H,执行指令

PUSHAX

PUSHCX

POPBX

三条指令后堆栈空间的数据变化如图4。

2所示。

(3)。

标志寄存器的进栈/出栈指令

▪格式:

进栈:

PUSHF;16位的出栈:

POPF

PUSHFD;32位的POPFD

(5)。

通用寄存器的进栈/出栈指令

▪格式:

进栈:

PUSHA;16位的出栈:

POPA

PUSHAD;32位的POPAD

▪功能:

执行PUSHA时,首先,SI-16—>SP,依次把AX,CX,DX,BX,SP,BP,SI,DI的内容压入堆栈,进栈的SP值时调整前的。

执行POPA时,先从栈顶弹出16个字节,并依次装入DI,SI,BP,SP,BX,DX,CX和AX。

2001.9.13第三次

执行PUSHAD时,首先,ESI-32—>ESP,依次把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI的内容压入堆栈,进栈的ESP值时调整前的。

执行POPAD时,先从栈顶弹出16个字节,并依次装入EDI,ESI,EBP,ESP,EBX,EDX,ECX和EAX。

作业2书P。

694.14.2题

4.4.2算术运算指令——执行后要影响标志寄存器的状态标志

1.基本四则运算

(1)。

ADD二进制加法指令

ADDDEST,SRC;DEST+SRC——>DEST

(2)SUB二进制减法指令

SUBDEST,SRC;DEST-SRC——>DEST

(3)ADC带进位加法

ADCDEST,SRC;DEST+SRC+C标——>DEST

(4)SBB带进位减法

SBBDEST,SRC;DEST—SRC—C标——>DEST

说明:

▪目标操作数DEST,为8,16或32位的寄存器、内存操作数

▪源操作数SRC要与DEST等长,可是立即数、寄存器或内存操作数。

▪DEST与SRC不能同为内存操作数。

▪若DEST、SRC都不能确定其操作数长度时,用PTR说明长度。

▪执行后,影响A(辅助进/借位)、C(进/借位)、O(溢出)、P(奇偶性)、S(符号)、Z(全零)6个标志。

▪例:

MOVAX,9876H

ADDAH,AL;AX=0E76H,CF=1,S,O,Z,A,P皆为0

ADCAH,AL;AX=8576H,CF=0,SF=1,OF=1,ZF=0,AF=1,PF=0

▪例:

P。

46下

(5)INC加1指令

INCDEST;DEST+1——>DEST

(6)DEC减1指令影响A,O,P,S,Z标志

DECDEST;DEST—1——>DEST

(7)NEG求补指令

NEGDEST;0—DEST——>DEST影响A,C,O,P,S,Z标志

说明:

▪以上的目标操作数DEST,为8,16或32位的寄存器、内存操作数

▪用间址、基址、基址加变址的内存操作数,必须用PTR说明其长度。

例:

INC[BX];错误

INCBYTEPTR[BX];对DS:

[BX]1个单元的内容加1。

▪如果原来的操作数为正数,执行NEG后,变成负数(用补码表示)

如果原来的操作数为负数(用补码表示),执行NEG后,变成正数。

特例:

DEST=80H,执行NEG后,仍为80H,但O标=1。

只有当DEST=0,执行NEG后,C标=0,其他数,C标总为1。

(8)XADD交换加法指令

XADDDEST,SRC;先进行DEST与SRC的互换,然后DEST+SRC—>DEST。

(9)MUL无符号乘法指令

MULSRC(reg,mem)

·功能:

完成无符号数的乘法,被乘数是累加器(AL、AX或EAX),乘以SRC,

·字节乘时,AL*SRC——>AX;

·字乘时,AX*SRC——>DX:

AX;

·双字乘时,EAX*SRC——>EDX:

EAX。

·说明:

如果乘积的高阶字节(AH)、字(DX)、双字(EDX)是0,则C标和O标置0,否则,置1。

(10)IMUL有符号数的整数乘法

·格式:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 水产渔业

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1