汇编语言之基础(二)
常用的汇编是intel的x86汇编
基础点
-
寄存器操作数前要加%
-
绝对跳转/调用操作数前面要加*
-
立即操作数(直接写明数据)前面要字符$
-
源和目的操作数是从左到右,add1 $1, %eax
-
间接操作数含有实际操作数地址值,在前面加*指定间接操作数
-
mov专门用来在操作数间传递信息
movl mov long : 字长传送 : 32位 movw mov word:字传送 :16位 movb mov byte:字节传送 :8位
简单操作
-
leal指令
加载地址,和mov不同不会进行解引用直接把地址进行赋值
leal -8(%ebp), %eax
把ebp寄存器的值减8,赋值给eax
注意上面的是直接寄存器的值,不是值对应内存地址的值
-
push %%eax
代表把当前寄存器的值推入栈帧,一般用于接下来要使用这个寄存器,先退入栈帧保存
push指令其实有一个前置操作。它会先取出 ESP 寄存器里面的地址,将其减去4个字节,然后将新地址写入 ESP 寄存器 -
pop %%eax
把当前栈帧最上层的值写入到寄存器eax,然后栈帧后退
-
decl %3 ;把%3的值--
-
js 2 ;对上一条汇编的值进行判断,小于0,跳转到标号为2的地方
-
sub减法指令 sub a,b b = b - a, SUB将目的操作数减源操作数,结果送目的操作数
概念
-
符号 字符组成的标识符就是c语言定义的变量,不能使用数字开头
-
语句 用换行符或者分隔符 ;结束,文件最后的语句必须用换行符结束,一行加入\就可以使用多行,当读到\ \n就会连接
由零或者多个标号组成,后面跟随确定语句类型的关键符号。标号由符号后面跟随冒号组成,关键符号确定剩下语句的含义,如果是. 开头,那么就是汇编命令(伪指令或者指示符) 汇编语言自带的一些指令可以进行使用。如果关键符号用字母开始,那么当前语句就是汇编语言指令语句
通用的格式:
标号: . 汇编命令 注释(可选)
或
标号: 指令助记符 操作数1, 操作数2
-
指令是CPU执行的操作,也被称为操作码。操作数是指令操作的对象,地址是数据在内存中的位置
指令语句:
标号(可选)
操作码(指令助记符)
操作数(有具体指令决定)
两个操作数的指令,左边是源操作数,右边是目的操作数
操作数可以是立即数(常数值的表达式),寄存器(值在CPU的寄存器)、内存(值在内存中)。
-
内存引用
mov1 var,%eax ;把内存地址var处的内容,放到寄存器eax中
mov1 %cs:var,%eax 把代码段中内存地址var处的内容放到eax寄存器中
movb $0x0a,%es:(%ebx) 把字节码0x0a保存到es段,指定的偏移处
mov1 $var, %ear 把var地址放到ear寄存器中
-
跳转指令
把执行点跳转到程序另一个位置,跳转的目的位置通常使用标号表示
JMP 是无条件跳转,分为直接跳转和间接跳转。条件跳转只有直接跳转
jmp NewLoc 直接跳转到NewLoc标号处执行
jmp *%eax 间接跳转,必须在寄存器值前加 * ,跳转到eax寄存器的值的位置
jmp *(%eax) 间接跳转,必须在寄存器值前加 * ,跳转到eax寄存器代表的地址处