汇编学习笔记(1)

基本知识

  1. 不同的系统有不同的汇编语法。 在Linux系统下,可以使用as命令来编译会变程序。
  1. 任何以小数点开头的单词表示一个指令 如 .section
  2. .section 命令将程序分段。
    • .section .data 定义数据段
    • .section .text 定义文本段, 存放指令。
  3. .global _start 定义符号。_start是一个特殊符号,代表着程序开始的入口。符号供链接器使用。
  4. _start: 这样表示开始定义一个标签
  5. 两个操作数的指令,源操作数一般不会改变。当然,有些特殊命令会。
  6. 进行系统调用时,要提前将系统调用号加载到 %eax, 参数放到其它的寄存器中。 $1 是系统调用exit的系统调用号。而exit退出的参数就放在%ebx中。
  7. int $0x80 //该命令将通知内核进行终端,使用系统调用。int代表中断。
  8. 流程控制包括跳转和循环:
    1. 跳转包括条件跳转和无条件跳转,前者对应if判断,后者对应break跳出。
    2. 循环就是跳转的应用,条件跳转跳出循环,无条件跳转跳到循环开始处。
  9. movl data_items(, %edi, 4), %eax //这里用了索引寻址的方式, movl 起始地址(, %索引寄存器, 字长) 表示从起始地址开始, 加上%索引寄存器 * 字长的位置,提取数字。

    寻址方式

  10. 内存地址引用通用格式: 地址或偏移 (%基址寄存器,%索引寄存器, 比例因子) 结果地址 = 地址或偏移 + %基址或偏移量寄存器 + 比例因子 * %索引寄存器

  11. 直接寻址 movl ADDRESS, %eax
  12. 立即寻址 movl $1, %eax
  13. 索引寻址 movl string_start(, %ecs, 1), %eax
  14. 间接寻址 movl (%eax), %ebx
  15. 基址寻址 movl 4(%eax), %ebx
  16. 寄存器寻址 就是将数据移入或者移出寄存器