汇编语言重点笔记.docx
《汇编语言重点笔记.docx》由会员分享,可在线阅读,更多相关《汇编语言重点笔记.docx(30页珍藏版)》请在冰豆网上搜索。
汇编语言重点笔记
第一章指令系统
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有符号数的整数乘法
·格式: