NO.2汇编初步

本文详细介绍了汇编语言的基础知识,包括CPU识别的机器指令和汇编语言的作用。重点讲解了MOV指令的不同寻址方式,如立即寻址、寄存器寻址、绝对寻址、间接寻址等,并通过实例展示了如何将数据存入内存。同时,还探讨了如何查看内存中的数据位置,以及如何利用LEA指令高效地进行地址计算。
摘要由CSDN通过智能技术生成

目录

1.汇编基础知识

2.MOV指令、  寻址方式

3.数据到内存

3.1传送数据至内存

3.2查看数据在内存中的位置


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分开,在一个时钟周期内就可完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值