汇编语言基础

来源:互联网 发布:windows凭据无法保存 编辑:程序博客网 时间:2024/06/05 16:20

在读完《程序是怎么跑起来以后》,结合以前的知识对汇编程序做一个小小的总结。 

首先,大家要知道,计算机CPU中能够直接解释运行的只有本地代码,也就是机器语言写的程序。而不管是C语言,Java语言亦或是其他编写的代码,都不能够在CPU上面直接运行,但是本地代码就是简单的数值,人类并不能够理解,因此,用英文单词缩写例如add,mov,push,pop等代表本机代码中相应功能的代码,这种语言就叫做汇编语言,而这些英文缩写则背称助记符。而汇编语言同样不能在CPU上直接运行,需要通过汇编转换成本地代码,然后才能在CPU上运行。不同种类的CPU可能采用不同的汇编语言。

使用汇编语言编写的程序由转换成本地代码的指令和针对汇编器的伪指令构成。

重点说一下指令的语法:指令=操作码+操作数

操作码代表指令的功能,操作数代表指令的操作对象,有可能是数字,有可能是地址,也有可能是寄存器,本质上是寻址的方式。对于指令具体结构,本文采用8086的指令格式“操作码 目的操作数 源操作数”。

根据操作数的种类不同,分为立即数,直接寻址和间接寻址。需要知道,在CPU中可以用来存储数据的寄存器是用特定的名字来代表的,例如x86的寄存器eax,ebx,ecx,edx,esi,edi,esp,ebp等,他们分别有自己不同的主要功能,这里不做具体介绍。

如果操作数为数字,例如mov eax,10,这里源操作数10则为立即数寻址,这条语句的功能,将数值10存入寄存器eax中;

如果操作数为[1108]这种形式,例如mov eax,[1108],]“[]”中的数字1108代表内存地址,而[1108]则代表内存地址1108的存储单元中存储的值,寻址方式为直接寻址;本条指令则意义为将内存地址1108的存储单元中存储的值,赋值给eax寄存器;

如果操作数为寄存器的名字,例如 add eax,10,eax则代表寄存器eax中的值,eax则是寄存器寻址

如果操作数形似[eax],例如mov eax,[ebx],假如寄存器ebx中存储的值为100。在这条指令中,100则代表内存地址,[ebx]则代表[100],内存地址为100的存储单元中存储的值,这条指令就代表将寄存器ebx中存储的内存地址中存储的值,存储到eax寄存器中。

根据指令码的不同,也存在操作数个数的不同,例如add eax,10,有两个操作数;inc eax,将eax中的值加1,只有目的操作数;ret ,子程返回,没有操作数。有的不需要源操作数,而有的则是目的操作数默认。

不同的CPU采用的指令的格式可能不同,但是意义都是一样的。所有程序就是都可以由这样一条一条指令构成。

0 0
原创粉丝点击