汇编语言之基础(二)

常用的汇编是intel的x86汇编

基础点

  1. 寄存器操作数前要加%

  2. 绝对跳转/调用操作数前面要加*

  3. 立即操作数(直接写明数据)前面要字符$

  4. 源和目的操作数是从左到右,add1 $1, %eax

  5. 间接操作数含有实际操作数地址值,在前面加*指定间接操作数

  6. mov专门用来在操作数间传递信息

    movl
                mov long : 字长传送 : 32位
            movw
                mov word:字传送 :16位
            movb
                mov byte:字节传送 :8位 
    

    简单操作

  7. leal指令

    加载地址,和mov不同不会进行解引用直接把地址进行赋值

    leal -8(%ebp), %eax

    把ebp寄存器的值减8,赋值给eax

    注意上面的是直接寄存器的值,不是值对应内存地址的值

  8. push %%eax
    代表把当前寄存器的值推入栈帧,一般用于接下来要使用这个寄存器,先退入栈帧保存
    push指令其实有一个前置操作。它会先取出 ESP 寄存器里面的地址,将其减去4个字节,然后将新地址写入 ESP 寄存器

  9. pop %%eax

    把当前栈帧最上层的值写入到寄存器eax,然后栈帧后退

  10. decl %3 ;把%3的值--

  11. js 2 ;对上一条汇编的值进行判断,小于0,跳转到标号为2的地方

  12. sub减法指令 sub a,b b = b - a, SUB将目的操作数减源操作数,结果送目的操作数

概念

  1. 符号 字符组成的标识符就是c语言定义的变量,不能使用数字开头

  2. 语句 用换行符或者分隔符 ;结束,文件最后的语句必须用换行符结束,一行加入\就可以使用多行,当读到\ \n就会连接

    由零或者多个标号组成,后面跟随确定语句类型的关键符号。标号由符号后面跟随冒号组成,关键符号确定剩下语句的含义,如果是. 开头,那么就是汇编命令(伪指令或者指示符) 汇编语言自带的一些指令可以进行使用。如果关键符号用字母开始,那么当前语句就是汇编语言指令语句

    通用的格式:

    标号: . 汇编命令 注释(可选)

    标号: 指令助记符 操作数1, 操作数2

  3. 指令是CPU执行的操作,也被称为操作码。操作数是指令操作的对象,地址是数据在内存中的位置

    指令语句:

    标号(可选)

    操作码(指令助记符)

    操作数(有具体指令决定)

    两个操作数的指令,左边是源操作数,右边是目的操作数

    操作数可以是立即数(常数值的表达式),寄存器(值在CPU的寄存器)、内存(值在内存中)。

  4. 内存引用

    mov1 var,%eax ;把内存地址var处的内容,放到寄存器eax中

    mov1 %cs:var,%eax 把代码段中内存地址var处的内容放到eax寄存器中

    movb $0x0a,%es:(%ebx) 把字节码0x0a保存到es段,指定的偏移处

    mov1 $var, %ear 把var地址放到ear寄存器中

  5. 跳转指令

    把执行点跳转到程序另一个位置,跳转的目的位置通常使用标号表示

    JMP 是无条件跳转,分为直接跳转和间接跳转。条件跳转只有直接跳转

    jmp NewLoc 直接跳转到NewLoc标号处执行

    jmp *%eax 间接跳转,必须在寄存器值前加 * ,跳转到eax寄存器的值的位置

    jmp *(%eax) 间接跳转,必须在寄存器值前加 * ,跳转到eax寄存器代表的地址处

posted @ 2020-12-08 22:45  make_wheels  阅读(307)  评论(0编辑  收藏  举报