一个最基本的汇编程序如下所示:

.section .data

.section .text
.globl _start
_start:
movl $, %eax # the number 1 is the number of the exit system call movl $, %ebx int $0x80

1、.globl表示汇编器不能在汇编之后就丢弃该标识,因为接下来的连接器还会使用它。_start是一个特殊的标识,它必须用.globl修饰,因为它代表了程序开始的入口

否则在链接的时候会报“ld: warning: cannot find entry symbol _start; defaulting to 0000000000400078”的错误

2、几个通用寄存器如下所示:(但事实上,对每个通用寄存器,都至少在一条指令中它们是用于特殊用途的)

  • %eax
  • %ebx
  • %ecx
  • %edx
  • %edi
  • %esi

另外几个用于特殊目的的寄存器如下所示:

  • %ebp
  • %esp
  • %eip
  • %eflags

3、在每次系统调用过程中,%eax总是用于存放系统调用的编号,而对于其他寄存器,在不同的系统调用中有不同的用途。例如在上述例子中,%ebx就用于存储返回值

4、"int $0x80"中的int代表interrupt,而interrupt表示中断当前正常的程序执行流,并且将控制权转交给内核,让它能执行系统调用

5、几种寻址模型:

  • direct addressing mode:

    • movl ADDRESS, %eax  ----- 将地址ADDRESS中的内容放到%eax中
  • indexed addressing mode:
    • movl string_start(, %ecx, 1), %eax ---- 将地址string_start + %ecx * 1地址中的内容放到%eax中
  • indirect addressing mode:
    • movl (%eax), %ebx ----- 将地址%eax中的内容放到%ebx中
  • base pointer addressing mode:
    • movl 4(%eax), %ebx ----- 将地址%eax + 4中的内容放到%ebx中
  • immediate mode:
    • movl $12, %eax ----- 将立即数12放到%eax中,若没有$符号,则意为将地址12中的值放到%eax内

6、汇编函数调用规则

在调用一个函数之前,首先将所有参数以相反的声明顺序入栈,之后再调用call指令

call主要做两件事:1、它将下一条指令的地址入栈 2、将%eip设置为函数的初始地址、

接着进入函数内部,首先要做的就是将%ebp入栈,并将当前%esp的值赋值给%ebp。事实上,我们就是利用%ebp作为基准来获取函数的参数和局部变量

Parameter #N <--- N*4+4(%ebp)
...
Parameter 2 <--- 12(%ebp)
Parameter 1 <--- 8(%ebp)
Return Address <--- 4(%ebp)
Old %ebp <--- (%esp) and (%ebp)

最后在函数返回时,应该让%ebp恢复到上一个函数的状态,并调用ret返回,ret的作用是将上图的Return Address装入%eip中,恢复上一个函数的执行。具体的指令如下:

movl %ebp, %esp

popl %ebp

ret

7、mov指令不能用于内存和内存之间或者段寄存器和段寄存器之间的数据转移。不过其实内存和内存之间的数据转移是可以的,通过字符串的转移指令movs

8、pusha将8个通用寄存器入栈,入栈的顺序为:eax, ecx, edx, ebx, esp, ebp, esi, edi

9、inc/dec指令并不影响CF标志位

10、cr0中包含了系统控制的flag,包括标志位PE置位,则系统处于保护模式,标志位PG置位,则处理器利用页表将线性地址转换为物理地址

cr2用于保存导致缺页异常的线性地址,cr3用于保存页目录的地址

汇编学习笔记(AT&T语法)的更多相关文章

  1. 汇编学习笔记(11)int指令和端口

    格式 int指令也是一种内中断指令,int指令的格式为int n,n是中断类型码.也就是说,使用int指令可以调用任意的中断例程,例如我们可以显示的调用0号中断例程,还记得在汇编学习笔记(10)中我们 ...

  2. python3.4学习笔记(一) 基本语法 python3不向下兼容,有些语法跟python2.x不一样

    python3.4学习笔记(一) 基本语法 python3不向下兼容,有些语法跟python2.x不一样,IDLE shell编辑器,快捷键:ALT+p,上一个历史输入内容,ALT+n 下一个历史输入 ...

  3. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  4. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  5. Java学习笔记之---基础语法

    Java学习笔记之---基础语法 一. Java中的命名规范 (一)包名 由多个单词组成时,所有字母小写(例如:onetwo) (二)类名和接口 由多个单词组成时,所有单词首字母大写(例如:OneTw ...

  6. CUBRID学习笔记 41 sql语法之select

    cubrid的中sql查询语法 SELECT [ ] [{TO | INTO} ][FROM ] [WHERE ][GROUP BY {col_name | expr} [ASC | DESC], . ...

  7. 汇编学习笔记(3)[bx]和loop

    本文是<汇编语言>一书的学习笔记,对应书中的4-6章. 汇编程序的执行 要想将源代码变为可执行的程序需经过编译.连接两个步骤,WIN7操作系统下需要MASM程序来进行编译连接工作.将MAS ...

  8. java web jsp学习笔记--概述-常用语法,指令,动作元素,隐式对象,域对象

     JSP学习笔记 1.什么是jsp JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP/Servlet规范.JS ...

  9. Angular 5.x 学习笔记(1) - 模板语法

    Angular 5.x Template Syntax Learn Note Angular 5.x 模板语法学习笔记 标签(空格分隔): Angular Note on github.com 上手 ...

  10. Webpack4 学习笔记三 ES6+语法降级为ES5

    前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 Webpack 将es6.es7语法降级为es5 需要通过 babel JavaScript编译器. 安装: npm i babel ...

随机推荐

  1. flink on yarn部分源码解析 (FLIP-6 new mode)

    我们在https://www.cnblogs.com/dongxiao-yang/p/9403427.html文章里分析了flink提交single job到yarn集群上的代码,flink在1.5版 ...

  2. iOS swift 富文本显示 富文本在iOS中使用场景和解决方案

    项目中很多地方都会用到富文本的内容:比如一般的商品详情,视频详情,资讯详情等,运营人员通过后台的富文本编辑器编辑的内容,前端拿到的就是一段富文本的字符串,这富文本大多都是图片和文字的组合.我们今天介绍 ...

  3. linux apache Tomcat配置SSL(https)步骤

    https简介 它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果.HTTPS实际上应用了Netscape的安全套接字层(SSL)作为HTTP应用层的 ...

  4. python 2个版本如何共存

    我们在安装Python3(>=3.3)时,Python的安装包实际上在系统中安装了一个启动器py.exe,默认放置在文件夹C:\Windows\下面.这个启动器允许我们指定使用Python2还是 ...

  5. mysql delimiter 存储过程

    命令行登录mysql cd /d D:\database\mysql1\bin mysql.exe -P 3306 -h 127.0.0.1 -u root -p USE tbschedule del ...

  6. wireshark in text mode: tshark

    tshark -i <interface> -w "output.data" 抓到的数据可用wireshark打开查看.

  7. 框架应用 : Spring - 开发详述

    Spring framework简介 spring framework这个框架是spring项目中的核心项目,所有框架都依赖于这个框架. 它是一个一站式的开源框架,基础技术是IoC. 按官方文档主要分 ...

  8. 【微信小程序】支付过程详解

    一.介绍 今天跟大家分享微信小程序集成支付. 二.分析 1.小程序支付API 地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-pay.html ...

  9. Qt 配置文件QSettings读取以及中文问题

    QSettings settings("xxxx.ini",QSettings::IniFormat);settings.setIniCodec(QTextCodec::codec ...

  10. python中的str()与eval函数

    author:headsen chen   date:2018-04-09   10:48:22 eval函数是把str转化成list.dict.tuple str函数把list,dict,tuple ...