汇编语言再学习:
做了几天拆炸弹之后,觉得对汇编语言的理解还不是特别好,准备再系统的学习一下。
汇编语言是一种符号语言,与机器语言一一对应;它使用助记符表示相应的操作,并遵循一定的语法规则。
它的优点是面向机器编程,在”时间“和”空间“上效率,缺点是涉及硬件细节,要求熟悉计算机系统的内部结构。
机器语言
机器语言是机器指令的集合,机器指令展开来讲就是一台机器可以正确执行的命令,电子计算机的机器指令是一列二进制数字的。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。 计算机是指由CPU和其受CPU直接或者间接控制的芯片,器件,设备组成的计算机系统,如PC机。 CPU是一种微型处理器,由于硬件设计和内部结构的不同,就需要用不同的电脉冲来控制,使他工作,每一种微型处理器都有自己的机器指令集,也就是机器语言。
寄存器
简单地讲,寄存器是CPU中存储数据的器件,一个CPU中有多个寄存器,AX是其中一个寄存器的代号,BX是另一个寄存器的代号。程序员用汇编语言写出源程序,再用汇编编译器编译成机器码。
汇编语言的组成
汇编语言由三类指令组成:
- 汇编指令:机器码的助记符,有对应的机器码。
- 伪指令:没有对应的机器码,由编译器执行,计算机并不执行。
- 其它符号:如+ - * /等,由编译器识别。
汇编指令
-
add表示两个整数相加。add %ebp %eax
add指令操作数有两个,实际上就是x加y等于t。因为是两个操作数,那么就是说 肯定是ebp eax相加,加起来之后的和放到eax里面去。也就是说这个指令的操作数是两个,目的寄存器是在右侧那个。当然它既是目的又是源,实际上两个都是源,加完之后放到目的寄存器。目的寄存器就是右侧的第二个源,加起来就完了。
- mov数据传送指令。 注:不能两个操作数都是内存地址
- movl $0x4,%eax 类似于C语言 temp=0x4
- movl $-147,(%eax ) 类似于C语言 *p=-147
- movl %eax,%edx 类似于C语言 temp2=temp1
- movl %eax,(%edx) 类似于C语言 *p=temp
- movl (%eax),%edx 类似于C语言 temp=*p
-
push指令。push 3
push指令用于将运算子放入 Stack,这里就是将3写入main这个帧。 虽然看上去很简单,push指令其实有一个前置操作。它会先取出 ESP 寄存器里面的地址,将其减去4个字节,然后将新地址写入 ESP 寄存器。使用减法是因为 Stack 。从高位向低位发展,4个字节则是因为3的类型是int,占用4个字节。得到新地址以后, 3 就会写入这个地址开始的四个字节。
-
call指令。用来调用函数的指令。
-
pop指令。
pop指令用于取出 Stack 最近一个写入的值(即最低位地址的值),并将这个值写入运算子指定的位置。pop %ebx表示取出 Stack 最近写入的值(即 EBX 寄存器的原始值),再将这个值写回 EBX 寄存器(因为加法已经做完了,EBX 寄存器用不到了)。 注意,pop指令还会将 ESP 寄存器里面的地址加4,即回收4个字节。