汇编语言笔记.docx
《汇编语言笔记.docx》由会员分享,可在线阅读,更多相关《汇编语言笔记.docx(7页珍藏版)》请在冰豆网上搜索。
汇编语言笔记
MOV
说明:
指令中dest和src不能同时为存储器操作数,串操作指令除外;CS不能做为目标操作数使用;段寄存器之间不能互相传送;立即数不能送入段寄存器;不允许手工修改CS的值。
MOVCS,AX;非法指令
PUSH
说明:
PUSH指令的目标地址一定在当前堆栈中。
SS内容为段基址,偏移量由堆栈指针SP指出。
操作数一定是16位的寄存器或存储器操作数。
POP
说明:
目标操作数只能是16位的存储器或寄存器操作数(CS除外)。
XCHG
说明:
dest和src不能同时为存储器操作数;即不能在存储器与存储器之间交换据数;段寄存器、立即数都不能用作操作数。
XLAT
说明:
XLAT指令用于查表。
表的开始地址即表头地址由BX寄存器给出。
AL中的原始值
是要寻址的表中元素地址的位移量,规定表中第一个字节的位移量为0。
LEA
说明:
LEA指令是将源操作数地址的偏移量,即有效地址传送到目标操作数中。
源操作数必须是一个存储器操作数,目标操作数可以是任一16位通用寄存器、指针寄存器或变址寄存器。
LDS
说明:
LDS是将src指出的连续两个字的内容,即一个32位的指针变量传送到一对16位的目标寄存器中。
高位字内容为段基地址,LDS指令将其传送到数据段寄存器DS中,低位字内容为偏移量,传送到由dest指出的一个通用寄存器,指针寄存器或变址寄存器中,但不能是段寄存器。
LES
说明:
LES是将src指出的连续两个字的内容,即一个32位的指针变量传送到一对16位的目标寄存器中。
高位字为段基地址,LES指令将其传送到附加段寄存器ES中,低位字为偏移量,传送到由dest指出的一个通用寄存器,指针寄存器或变址寄存器中,但不能是段寄存器。
IN
说明:
acc为累加器AX或AL,取决于所访问端口的类型,若端口为16位长,则累加器为AX;若端口为8位长,则累加器为AL。
注意:
port为所访问的端口地址,其寻址方式有两种:
直接寻址和间接寻址。
若其值在0~255之间,则既可以使用直接寻址,也可以使用间接寻址;若其值大于255,则必须使用间接寻址。
直接寻址:
将端口地址直接在指令中给出;
间接寻址:
事先必须将端口地址存入DX寄存器,指令中不可直接出现地址值。
OUT(规定同IN)
ADD
说明:
dest和src不能同时为存储器操作数和段寄存器。
ADC
说明:
ADC指令主要用于多精度数据相加。
INC
说明:
INC指令不影响CF。
SBB
说明:
SBB指令主要用于多精度数据减法。
DEC
说明:
DEC指令不影响CF。
NEG
说明:
NEG指令对于带符号的数来说是取负,即改变操作数的符号。
CMP
说明:
CMP将两个操作数相减,两个操作数保持原值不变,但与SUB指令一样影响标志。
MUL
说明:
⑴源操作数src不能是立即数。
⑵如果乘积的高半部不为零时,CF和OF被置位,否则将被清除。
IMUL
说明:
①src不能是立即数。
②IMUL指令视操作数为带符号的数。
如果乘积的高半部不是符号位的扩展时,CF和OF被置位,否则将被清除。
DIV
①src不能是立即数;
②如果商数超过了允许的最大值(字节时为0FFH,字时为0FFFFH)时就产生一个方式0的中断,并且商和余数都不确定。
IDIV
说明:
①src不能是立即数;
②如果商数超过了允许的最大值(字节时为-128~127,字时为-32768~32767)时就产生一个方式0的中断,并且商和余数都不确定。
③余数始终与被除数同号,商向0靠拢。
CBW
说明:
CBW是将AL寄存器中数的符号位扩
展到整个AH寄存器中。
CWD
说明:
CWD将寄存器AX的符号位扩展到整个
寄存器DX中。
AND
说明:
AND指令可借助某个给定的操作数将另一个操作数中的某些位清除(这种操作也称设置屏蔽),使某些位保持不变,这个数通常称为掩码。
XOR
注意:
与0异或的位不变,与1异或的位取反。
TEST
说明:
TEST指令通过“与”的方式对两个源操作数进行比较,但不保留“与”的结果。
移位操作指令
说明:
①dest可以是任一通用寄存器,也可以是各种寻址方式给出的内存单元,cnt为移位次数。
②移位操作是将给定的目标操作数移动cnt次。
cnt可以为1,也可以是CL的内容。
③SHL/SAL,SHR,SAR影响CF,OF,PF,SF,ZF;ROL,ROR,RCL,RCR仅影响CF和OF位。
④CF的值总是最后一次被移入的值。
⑤在移动1位的移位中,如果目标操作数的最高位(符号位)改变了,那么OF就被置1,否则,OF就被清0。
串操作指令
说明:
(1)指令中要处理的两个数据串应分别在数据段(src)和附加段(dest)中定义。
(2)数据段中定义的数据串要用SI作指针;附加段中定义的数据串要用DI作指针。
(3)数据串操作指令每执行一次,指针SI和DI会自动修改。
增量修改还是减量修改取决于方向标志位DF的状态。
若DF=0,则指针增量修改,即
SI=SI+DELTADI=DI+DELTA
若DF=1,则指针减量修改,即
SI=SI-DELTADI=DI-DELTA
(4)修改指针时的增减量值DELTA为多少,取决于所处理的串的类型。
若串为字节类型,则DELTA=1;否则若为字类型,则DELTA=2。
重复前缀
说明:
重复前缀可以加在数据串基本操作指令前,此时,数据串基本操作指令将重复执行,每执行一次,则将CX的内容减1,直到CX等于零为止。
其控制结构属于先判断后执行的循环结构,即先判断CX的初值是否为0,若CX的初值为0,则数据串基本操作指令一次也不执行。
JMPtarg
说明:
指令中的targ可以是直接标号、寄存器间接或存储器间接寻址形式。
INT中断指令
说明:
n称为中断类型号,必须是0~255之间的立即数。
INTO溢出中断指令
说明:
INTO指令一般用在算术运算指令后面,在有溢出的情况下,启动一个溢出中断服务程序。
IRET中断返回指令
说明:
IRET指令是任何中断服务程序的最后一条要执行的指令,它使CPU从中断服务程序返回被中断程序的断点处继续执行。
HLT停机指令
说明:
CPU执行HLT指令后,就停止执行后续指令,只有当产生中断请求信号(发生中断)或有复位信号(RESET线变成低电平)时,才能退出暂停状态。
中断信号产生后,CPU停止执行HLT指令,而去执行中断服务程序,执行IRET后,CPU返回被中断程序的断点处,执行HLT的后续指令。
WAIT等待指令
说明:
CPU执行WAIT后,只有当TEST信号变成低电平时,才能执行的后续指令。
除此之外,任何情况也不能使CPU停止执行WAIT指令(退出等待状态)。
ESC交权指令
说明:
ESC指令称为换码指令,它使协处理器能够从8086/8088的指令流中获得一个操作码和一个操作数。
指令中exp_op为操作码,是一个6位二进制的数据。
LOCK锁定指令
说明:
LOCK指令是一个封锁前缀,它可以加在任何指令的前面,使CPU在执行该指令期间保持一个总线锁定信号。
在多处理机系统中用其实现对共享资源的存取控制。
NOP空操作指令
说明:
空操作指令NOP使CPU不进行任何操作,但要花费3个时钟周期,然后执行其后续指令,一般用于编制软件延时程序或用纠错程序调试程序时抹掉多余的指令。
注:
EQU与=用法的区别在于:
用EQU赋值后的符号其值不能再被改变;用=赋值后的符号其值可以再次被重新赋值
代码定位伪指令ORG
说明:
EXP是一个表达式,其值为16位的无符号二进制数,代表其所在逻辑段内某单元的偏移地址。
该条伪指令的作用是告诉汇编程序,在其后的数据或程序代码将从EXP指定的单元开始连续存储。
汇编语言的源程序格式
⑴汇编语言源程序由语句序列构成。
⑵源程序可以包含若干个代码段、数据段附加段或堆栈段。
⑶段与段之间的顺序任意。
⑷独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。
⑸所有可执行性语句必须位于某一个代码段内,说明语句性语句可根据需要位于任一段内。
⑹通常需要一个堆栈段。
⑺汇编语句最多由四个域组成:
[标号:
]操作符操作数[;注释]
标号
•标号不能重复定义:
一个标号在标号字段只能出现一次。
未定义标号不能引用。
•保留字不能用作自定义标号使用。