目录
1.汇编基础知识
●机器指令:机器指令是CPU能直接识别并执行的指令,它的表现形式是二进制编码。CPU只能执行机器指令。
▲优点:编写出来的程序执行效率高。
▲缺点:用机器语言编写程序有很高的要求和许多不便。
●汇编语言:为了改善机器指令的可读性,将各种操作以及一些物理资源使用单词或者词组代替,汇编语言是机器语言的助记符,与指令集架构密切相关。
●寄存器命名(以80386为例):
通用寄存器:
AX,BX,CX,DX ; SI,DI ; SP,BP; (16位)
AH,AL ; BH,BL; CH,CL; DH,DL(8位)
EAX,EBX,ECX,EDX; ESI,EDI; ESP,EBP(32位)
2.MOV指令、 寻址方式
●mov指令:
▲movl: 用于传送32位的长字值
▲movw: 用于传送16位的字值
▲movb: 用于传送8位的字值
格式:指令 源操作数, 目的操作数
1).movl $1,%eax#立即数寻址
前面添加了‘$'符号的数为立即数,该指令表示将数值4写入寄存器eax中。
该指令中movl也可写成mov,因为根据后面eax可知该条指令需传送32位的值。
2).movl %ebx,%eax#寄存器寻址
该指令表示将寄存器ebx内的值写入到寄存器eax中。
3).movl 0x08048054,%eax#绝对寻址
该指令表示将地址08048054上保存的值写入到寄存器eax中。
4).movl (%ebx),%eax#间接寻址
该指令表示将寄存器ebx中的值作为一个地址,并将该地址中的值写入到寄存器eax中。
5).movl 0x8(%ebx),%eax#基址偏移量寻址
该指令表示将寄存器ebx中的值作为一个地址,并将该地址加上偏移量0x8得到一个新的地址,最后将该新地址中的值写入到寄存器eax中。
6).movl (%ebx,%edx),%eax#变址寻址
该指令表示将寄存器ebx与寄存器edx的值相加得到一个地址,并将该地址中的值写入到寄存器eax中。
7).movl 0x8(%ebx,%edx),%eax#变址基址寻址
该指令表示将寄存器ebx与寄存器edx的值相加得到一个地址,并将该地址加上偏移量0x8得到一个新的地址,最后将该新地址中的值写入到寄存器eax中。
8).movl (%ebx,%ecx,0x2),%eax#比例变址寻址
该指令表示将寄存器ecx中的值乘以2再加上寄存器ebx中的值作为一个地址,并将该地址中的内容写入到寄存器eax中。
注意:该比例值只能为1,2,4,8…
为什么?
因为:当该比例值为1,2,4,8…时,寄存器所做的操作仅仅是移位而已,速度很快;而设置为其他值时,涉及到乘法操作,速度很慢。
9).movl 0x8(%ebx,%ecx,0x2),%eax#比例变址基址寻址
该指令表示将寄存器ecx中的值乘以2再加上寄存器ebx中的值作为一个地址,并将该地址加上偏移量0x8得到一个新的地址,最后将该新地址中的值写入到寄存器eax中,在该指令中,括号中第一个参数可缺省。
{movl 0x8( ,%ecx,0x2)}
10)movb $oxff65, %dh
该指令将一个2字节的值传入1字节的寄存器,其结果为将最后一个字节的值(0x65)传入目的寄存器。
3.数据到内存
3.1传送数据至内存
格式:指令 操作数,变量名
例:
value:
short 2
1).movl value, %ecx
此处value为short型,占两个字节,而寄存器ecx有四个字节大小,该指令的操作将value后四个字节的值写入ecx,此处value应理解为一个地址,而不是一个占两个字节的变量。
2).movl value,%al
此处理解同上,该指令将value后一个字节的值写入al。
3).movl %ecx, value
理解同上,该指令将ecx中的值写入value后四个字节,此类指令中value都应理解为地址。
3.2查看数据在内存中的位置
把变量的地址写入寄存器:
1).movl $value, %edi #取value的地址写入edi
2).leal value, %esi #用lea指令直接将value的地址写入esi
3).leal 5(%edx, %edx, 2), %eax
将3*edx+5写入寄存器eax,此操作比直接计算3*edx+5再写入eax要快。
原因:
直接计算3*edx+5涉及到乘法运算,速度相对较慢,该方式的计算电路与ALU分开,在一个时钟周期内就可完成。