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

.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. WCF问题集锦:未依照DataMember定义的名称序列化对象

    今遇到WCF序列化BUG,代码例如以下: /// <summary> /// 包括数据的返回对象 /// </summary> /// <typeparam name=& ...

  2. numpy.ravel()/numpy.flatten()/numpy.squeeze()

    numpy.ravel(a, order='C') Return a flattened array numpy.chararray.flatten(order='C') Return a copy ...

  3. 设置VMware随系统开机自动启动并引导虚拟机操作系统

    设置VMware随系统开机自动启动并引导虚拟机操作系统 转载 2012年03月15日 19:50:53 标签: vmware / 虚拟机 / windows / parameters / tools  ...

  4. linux学习笔记8--命令touch

    linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. touch命令有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认 ...

  5. Django - 安装wagtail

    感觉这个CMS系统不错,试用了一下,记录过程: 1. 安装Virtualenv mkdir wagtail virtualenv --no-site-packages --python=3.5 wag ...

  6. 【转】SetThreadLocale解决越南文乱码问题

    转自http://hi.baidu.com/killwolf110/item/838d56224067c63395f62b70 程序需要运行在越南地区,语言为越南文,操作系统为英文版,程序支持unic ...

  7. 将socket5代理转换为http代理

    归根结底还是万恶的ZFW,MD弄得现在Google,gmail,dropbox都用不了了,看来这是要万民欢迎大中华局域网的到来了.最近在使用一同学的Shadowsocks来突破GFW的限制,可是电脑o ...

  8. 数码相机常用CCD/CMOS尺寸对比

    数码相机的关键元件CCD或CMOS又称为“影像传感器”,其作用相当于感光胶片.CCD尺寸越大,采集光线的效果越好,画面记录的信息就越多,保留的细节也就越丰富,所以图像更完美漂亮. CCD尺寸的大小与像 ...

  9. sizeWithFont:方法使用明细

    个人总结: Computing Metrics for a Single Line of Text– sizeWithFont: 同下面,换行方式默认取NSLineBreakByWordWrappin ...

  10. html ; css ; javascript ; json ;

    [说明]今天因为看到了前端的js页面和html页面,觉得有必要熟悉一下他们的基本语法,所以花了一天的时间去复习巩固了一下(之前学习过),包括html语法,css语法,javascript语法,对象.B ...