汇编知识总结.docx
《汇编知识总结.docx》由会员分享,可在线阅读,更多相关《汇编知识总结.docx(14页珍藏版)》请在冰豆网上搜索。
汇编知识总结
寄存器
标志寄存器
1、进位标志CF(CarryFlag)
进位标志CF主要用来反映运算是否产生进位或借位。
如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
使用该标志位的情况有:
多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
2、奇偶标志PF(ParityFlag)
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。
如果“1”的个数为偶数,则PF的值为1,否则其值为0。
3、零标志ZF(ZeroFlag)
零标志ZF用来反映运算结果是否为0。
如果运算结果为0,则其值为1,否则其值为0。
在判断运算结果是否为0时,可使用此标志位。
4、符号标志SF(SignFlag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。
在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。
运算结果为正数时,SF的值为0,否则其值为1。
5、溢出标志OF(OverflowFlag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。
如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
字
字节是最基本的寻址单位,一个字等于多个字节,一般一个字等于两个字节16位。
逻辑地址
逻辑地址由段基地址和偏移地址组成,段基地址确定段在主存中的起始地址,偏移地址是相对于段基地址进行定义。
用“:
”分割段基地址和偏移地址,例如CS:
EIP,CS指当前段,EIP指向下一条要执行的指令。
语句格式
●标号和名字
1.表达处理器执行的语句称为执行性语句(真指令,硬指令)。
2.表达汇编语言命令的语句称为说明性语句(伪指令)。
3.标识符最多由31个字母、数字、及规定的特殊符号组成,但不能以数字开头,不能是汇编语言的保留字,汇编语言不区分大小写。
●助记符
助记符是帮助记忆指令的符号,反映指令的功能。
例如调用指令call,以及字节变量定义伪指令byte。
●操作数和参数
双操作数中目的操作是写在逗号前面,逗号后面的为源操作数。
●注释和分隔符
分号“;”为注释符,续行符“\”表示本行内容与上一行内容同属于一个语句。
源程序框架
includeio32.inc
.data;数据区
.code;代码区
start:
;主程序
exit0
;子程序
endstart
变量定义
Byte字WORD字节DWORD双字FWORD三字QWORD四字TBYTE10个字节
重复次数DUP(重复参数)例如BVAR4byte5dup(‘$’)
●数据存储方式
小端方式“低对低高对高”大端方式“高对低低对高”
●ALIGN伪指令
AlignNN为对齐的边界,为偶数。
如果当前位置为0101H,ALIGN2则为0102开始,下一个位置为0104,如果是align4,则从0104开始,下一个位置为0108.
常用的地址、类型操作符
Byte返回一个数值,表明多少个字节。
SIZEOF=TYPE*LENGTHOF。
数据寻址方式
由于指令系统设计了多种操作数的来源,寻找操作数的过程就是操作数的寻址,不同的寻址方式执行的速度和效率不一样。
注意两个操作数字长要一致
1.立即寻址方式MOVAX,5(直接给出操作数)
2.寄存器寻址方式MOVAX,BX(在寄存器中给出操作数,CS指令不能用MOV改变)
3.直接寻址方式MOVAX,VALUE或MOVAX,[VALUE]或MOVAX,[2000H](直接给出有效地址,在内存中寻找操作数,隐含段为DS,可使用段跨越前缀指定其它段)
4.寄存器间接寻址方式MOVAX,[BX](有效地址在寄存器中,不允许使用AX/CX/DX存放有效地址)
5.寄存器相对寻址方式MOVAX,COUNT[SI]或MOVAX,[COUNT+SI](可用寄存器BX/BP/SI/DI)
6.基址变址寻址方式MOVAX,[BX][SI](必须是一个基址寄存器和一个变址寄存器的组合)
7.相对基址变址寻址方式MOVAX,MASK[BX][SI]
8.比例变址寻址方式MOVEAX,ARRAY[ESI*4]
9.基址变址寻址方式MOVEAX,[EBX][ESI*6]
10.相对比例变址寻址方式MOVEAX,ARRAY[EBX][ESI*8]
通用数据处理指令
1.Mov指令
目的操作数和源操作数类型要相同,否则用ptr。
立即数和寄存器间接寻址都没有明确的操作数类型,所以必须要确定其中一个的类型。
不允许两个操作数都是存储单元。
2.XCHG指令
可以是寄存器与寄存器,可以是寄存器与主存。
不允许两个操作数都是存储单元。
3.堆栈操作
PushR/M/S/I
PopR/M/S
4.地址传送指令
LEAR16/R32,MEM相当于Movr16/r32,offsetMEM
算数运算类指令
CF是为无符号整数运算设计的,OF是为有符号证书运算设计的
1.加法指令
ADD/ADC/INC(除INC不影响CF标志外,都对条件标志位有影响)
两个操作数不能都为变量
ADC表示带上进位标志中的值,1或0.
2.减法指令
SUB/SBB/NEG/CMP (除DEC不影响CF标志外,都对条件标志位有影响)
SBB表示带上进位标志中的值,1或0.
NEG将操作数取反加一(求补),在16位汇编语言中,NEG命令无论你是否为正负数,都会按照取反+1或用0减去这个数的二进制的办法去计算
3.比较指令
Cmp差值不回送,但依据运算结果影响标志位(SUB的变形)。
4.乘法指令
5.除法指令
6.符号位扩展
符号位扩展只改变数据长度,并没有改变数据大小。
逻辑运算
NOT/AND/OR/XOR/TEST,TEST不返回结果,只改变标志位。
移位指令
条件转移指令
循环指令
LOOP隐含使用ECX作为计数器,每执行一次LOOP,ECX减1,直到ECX为0便退出循环。
但是当ECX本来就是0时会出现“无限”循环。
过程定义伪指令
过程名proc
……….;过程体
过程名endp
子程序的调用用Call,子程序中要记得保持堆栈平衡,不能忘记在子程序中写好ret。
不带任何参数时,用于在子程序的结束位置,被调用的子程序必须有ret指令,否则调用没有ret指令的子程序会导致自陷,子程序执行完之后处于失控状态。
带参数retn表示子程序返回主程序的同时,堆栈弹出n个字节(栈顶指针减n)
●参数传递方法
1.寄存器传递参数
2.共享变量传递参数
3.堆栈传递参数