您的位置:首页 > 其它

汇编语言整理

2013-01-15 14:19 190 查看
用DB定义的数据,每个数据占用1B的存储器。可以出现用单或双引号括起来的单个或多个字符,每个字符占1B,按照它们出现的顺序用ASCII代码存储。DUP称为“重复定义符”,表示定义若干个相同的数据。伪指令DW用来定义字数据,每个数据占用2B,数据的高位存放在地址较大的单元里。注意:用DW定义字符串时,只能是两个,而用DB定义时,没有这个限制。

操作数:有3种类型的操作数:寄存器操作数、立即数操作数和存储器操作数。

寄存器操作数又包括段寄存器和通用数据、地址寄存器。段寄存器:CS,DS,SS,ES。通用数据寄存器:AX,BX,CX,DX。通用地址寄存器:SP,BP,SI,DI。在这么多的寄存器中,只有4个寄存器可以用来间接寻址:BX,BP,SI,DI(在8086中)。在这之中,默认情况下,BP与段寄存器SS搭配,其余3个与DS搭配。

立即数寄存器:二进制、十进制或十六进制常数,可求值的表达式、字符、标号等都可以用作操作数。

存储器操作数:它是由段基址和偏移地址组成。大多数情况下,指令使用DS寄存器的内容作为操作数的段基址,所以指令中不需要再指出段基址。为此,常常在程序开始处把数据段的段基址装入DS寄存器中。段基址的问题解决了。剩下的就是偏移地址的问题了。存储器的偏移地址可以由几个部分组合而成,合成后得到的偏移地址称作有效地址。指出偏移地址的方法有两种:直接的和间接的。所谓直接地址就是在指令里直接写出存储单元偏移地址。注意点:当变量名A定义之后,它的属性就确定下来了,而直接地址[0000H]却没有固定的属性,它可以代表字节地址,也可以代表字地址甚至是双字地址。所谓间接地址就是把存储单元的偏移地址事先装入某个寄存器中,需要时通过这个寄存器来找到这个存储单元,所以也称为寄存器间接寻址。这时就要用到上面提到的知识点,只有哪4个寄存器可以用来间接寻址。然后,就是还可以用两个寄存器联合起来寻址。但是只能从(BX,BP)和(SI,DI)中各选出一个使用。这时,就会有几个专有的名词需要知道:直接寻址,寄存器间接寻址,寄存器相对寻址,基址变址寻址和基址变址相对寻址。

请注意标号和变量名的区别:标号出现在指令行前面,标号与指令之间用冒号(:)分开。进入程序后,代码段寄存器CS已经由操作系统设置为代码段的段基址,数据段的段基址需要由用户装入到DS中。注意:ASSUME伪指令仅仅说明段和段寄存器之间的对应关系,段基址的装入仍然需要程序员通过指令实现。

关于MOV指令的使用有如下限制:

1.源操作数与目的操作数可以是字节、字或双字,但必须具有相同的类型。

2.源操作数与目的操作数不能同时为存储器操作数。

3.目的操作数不能是立即数。

4.FLAGS,EFLAGS,IP,EIP不要用作操作数。因为它们是专用寄存器。

5.对于段寄存器作为操作数的MOV指令:

(1).源操作数与目的操作数不能同时为段寄存器;

(2).目的寄存器是段寄存器时,源操作数只能是寄存器或存储器,不能是立即数;

(3).CS不能用作目的操作数。

当我们使用立即数作为源操作数时,该立即数会按照目的操作数的类型进行扩展。如果立即数本身没有符号,进行“零扩展”;如果立即数本身有符号,进行“符号扩展”。可以用“类型  PTR”指定,或强行改变操作数的类型。

LEA指令的作用:把源操作数的偏移地址装入目的操作数。其实OFFSET这个关键字的作用也是取偏移地址的。

存放地址的寄存器或存储单元称为地址指针或指针。

扩展指令CBW,CWD。这两个指令都会用到AX,DX这两个通用数据寄存器。

堆栈也是用户使用的存储器的一部分,它用来存放一些临时性的数据和其他信息。堆栈段和数据段、代码段的使用有以下不同:首先,它从较大地址开始分配合使用;然后,由SP中地址指出的存储单元称为栈顶,数据总是在栈顶位置存入、取出;最先进入的数据最后被弹出。

8086CPU的PUSH指令不支持立即数操作数。

可以用EQU,=来定义一个符号。汇编时,对EQU定义的符号名用对应的表达式进行替换。使用等号‘=’定义符号名时,只能使用常数表达式,而且对一个符号可以多次定义。一个新的定义出现后原来的定义自动停止。用EQU定义的符号名不允许重复定义。

用于计算有效地址表达式有3个运算符:+,-和[]。+,-运算符对构成有效地址的各个分量进行加、减操作。[]称为索引运算符,用来括起组成有效地址的一个分量,各个分量相加,得到最后的有效地址。

用于产生立即数操作数的表达式有4类运算符:算术运算符、逻辑运算符、关系运算符、地址运算符。在这4个中值得注意的是关系运算符,它用于两个数的比较,结果为真(-1)或假(0)。地址运算符对变量名、标号、地址表达式进行计算,得到作为立即数的运算结果。SEG取地址表达式所在段的段基址。

众多指令的汇总:

ADD:加法指令。ADC:带进位的加法指令,主要用于两个数据分段相加时高位的加法运算。INC:增量指令。

SUB:减法指令。SBB:带借位的减法指令,主要用于两个数据段相减时高位的减法运算。DEC:减量指令。NEG:求补指令。

MUL:无符号数乘法。这时这个源操作数不可以是立即数。这个指令又要用到AX,DX这两个寄存器。两个N位操作数相乘,得到2N位的乘积。IMUL:有符号数乘法。这条指令有3种格式。IMUL  源操作数、IMUL  目的操作数,源操作数和IMUL 目的操作数,源操作数1,源操作数2。注意点:第一种形式和无符号乘法用法一致,第二种和第三种形式首先源操作数可以使立即数,但不能是8位,且两个N位操作数相乘,得到的还是N位的乘积。

DIV:无符号除法。IDIV:有符号除法。两个N位操作数相除,应首先把被除数零扩展为2N位。

LOOP:循环指令。这个指令要用到CX这个寄存器,并且把CX当做无符号数。也有标号的用法。LOOP 标号,CX寄存器被称为计数器。还有就是有条件的循环指令(主要是看CX的值)LOOPZ/LOOPE、LOOPNZ/LOOPNE。

DAA:十进制加法调整。功能:对AL中的加法结果进行BCD运算调整。DAS:十进制减法调整。

AAA:非压缩十进制加法调整。AAS:非压缩十进制减法调整。AAM:非压缩十进制乘法调整。功能:对AX中的乘法结果进行非压缩BCD数运算调整。AAD:非压缩十进制除法调整。

AND:逻辑乘指令。使用它可以对操作数有选择地部分清零。OR:逻辑加指令。XOR:逻辑异或指令。NOT:逻辑非指令。

输出单个字符(存放在DL中的字符):INT 21H的2号功能。输出一个字符串(DX中存放的输出字符串的首地址):INT 21H的9号功能。要求字符串以‘$'为结束标志,且该字符不会输出。字符的输入:INT 21H的1号、7号、8号和6号功能。其中还有一个10号功能,需要与一个缓冲区搭配使用,然后将DX存放缓冲区的首地址。

移位指令:SHL,SHR。形如:SHL 目的操作数,移位次数。其中的移位次数只能是常数1或寄存器CL。SAR,SAL。与上面功能相似。ROL,ROR:功能是将目的操作数向左或右移动指定的位数,移出的高位顺序进入地位,最后移出的位同时进入CF。RCL、RCR都是带进位的循环左移或右移。(CF中保存最后移出的那一位)STD,CLD分别将DF位置成1和0。JMP:无条件转移指令。CMP:比较指令。目的操作数和源操作数中至少有一个寄存器。TEST:测试指令。主要是用到ZF这个标志位。Jcc:有条件转移指令。cc可以被替换成1~3个字母。其中G,L,E,N是用于有符号的字母。而A,B,E,N是用于无符号的字母。

CALL  子程序名。调用指令。RET返回指令:用来从子程序返回主程序。子程序的定义要用到PROC和ENDP这两个关键字。

MOVSB/MOVSW/MOVSD:MOVS指令可以把1B,2B,4B的源数据区数据传送到目的存储单元,同时根据方向标志对源变址寄存器和目的变址寄存器进行修改。这组指令的寻址方式是隐含的,源操作数地址由DS:SI提供,目的串操作数地址由ES:DI提供。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  汇编 语言