AT&T汇编指令学习(GCC)

  1. 寄存器命名原则:

    相比inter语法,AT&T语法格式要求所有的寄存器都必须加上取值符"%".

  2. 操作码命令格式:

    1. 源/目的操作数顺序:

      Intel语法格式中命令表示格式为:"opcode dest, src"; "操作码 目标, 源"

      AT&T语法格式表示为:"opcode src, dest"; "操作码 源, 目标"

    2. 操作数长度标识:

      在AT&T语法中,通过在指令后添加后缀来指明该指令运算对象的尺寸.

      后缀 'b' 指明运算对象是一个字节(byte)

      后缀 'w' 指明运算对象是一个字(word)

      后缀 'l' 指明运算对象是一个双字(long)

      Intel语法中指令'mov'在AT&T语法必须根据运算对象的实际情况写成:'movb','movw'或'movl'。

      注:若在AT&T中省略这些后缀,GAS将通过使用的寄存器大小来猜测指令的操作数长度.

    3. 另外,

      'FAR'不是GAS的关键字,因此对far的call或jmp指令须加前缀 'l', 'far call'要写成 'lcall' , 'far jmp' 要写成 'ljmp' , 'ret far' 写成 'lret'。

  3. 常数/立即数的格式:

    在AT&T语法中对立即数,须在其前加前缀 $ 来指明,而Inter语法则不需要。

    另外, 在常数前也必须加一个前缀字符 * ,而Inter语法则也是不需要的。

  4. 内存寻址方式:

    在Intel语法中,使用下面格式来表示存储器寻址方式:

    SECTION:[BASE + INDEX*SCALE + DISP];段:[基地址+变址*比例因子+偏移量]

    BASE是基地址索引寄存器(可以是任一通用寄存器),

    INDEX是变址寄存器(除ESP外的任一通用寄存器),

    SCALE是变址寄存器的比例常数,

    DISP是基址/变址寄存器的位移量。

    AT&T语法则使用不同的格式来表示寻址方式:

    SECTION:DISP(BASE, INDEX, SCALE);段:偏移量(基地址,变址,比例因子)

  5. 标号 & 标识符:

    所有的标号必须以一个字母,点或下划线开始,标号后加一个冒号表示标号的结束。

    局部标号使用数字0-9后跟一个冒号,使用局部标号时要在数字后跟一个字符'b'(向后引用)或字符'f'(向前引用)。因为只能使用数字0-9作为局部标号名,所以最多只能定义10个局部标号.一个标识符能给它赋于一个值。(如:'TRUE=1', 或者使用 .set 或 .equ 指令)。

  6. 基本的行内汇编格式:

    asm("statements");

    例如:asm("nop"); asm("movl %eax,%ebx");

    asm 和 __asm__是完全一样的.

    如果有多行汇编,则每一行都要加上 "\n\t"

  7. 扩展的行内汇编格式:

    asm ( "statements" : output_regs : input_regs : clobbered_regs);

    冒号后的语句指明输入,输出和被改变的寄存器.

  8. IA32整数寄存器:

  9. 常用指令:

    1. 数据传送指令:move,push,pop;
    2. 加载有效地址指令:leal;
    3. 一元操作指令:inc(加1),dec(减1),neg(取负),not(取补);
    4. 二元操作指令:add,sub,imul,idivl(有符号除法),xor,or,and;
    5. 移位指令:sal(左移),shl,sar(算数右移),shr(逻辑右移);
    6. 跳转指令:jmp,je,jne,js,jns,jg,jl,ja,jb,jbe...
  10. 条件码寄存器(单个bit):

    cf(进位标志),zf(零标志),sf(符号标志),of(溢出标志)...

    访问条件码指令:cmp,test,set...

    t = a + b;
    cf: (unsigned) t < (unsigned) a;//无符号溢出
    zf: t == 0;//零
    sf: t < 0;//负数
    of: (a < 0 == b < 0) && (t < 0 != a < 0)//有符号溢出

(深入理解计算机系统)AT&T汇编指令的更多相关文章

  1. 深入理解计算机系统(4.1)---X86的孪生兄弟,Y86指令体系结构

    引言 各位猿友们好,计算机系统系列很久没更新了,实在是抱歉之极.新的一年,为了给计算机系统系列添加一些新的元素,LZ将其更改为书的原名<深入理解计算机系统>.这本书非常厚,而且难度较高,L ...

  2. 深入理解计算机系统(1.1)------Hello World 是如何运行的

    上一篇序章我谈了谈 程序员为啥要懂底层计算机结构 ,有人赞同也有人反对,但是这并不影响 LZ 对深入理解计算机系统研究的热情.这篇博客以案例驱动的模式,通过跟踪一个简单 Hello World 程序的 ...

  3. 深入理解计算机系统(4.1)------Y86指令集体系结构

    本章我们将进入处理器体系结构介绍的神秘海洋中,我们熟悉的手机,电脑等设备的核心硬件都离不开处理器.处理器可以称的上是人类创造的最复杂的系统之一,一块手指大小的硅片,可以容纳一个完整的高性能处理器.大的 ...

  4. CSAPP深入理解计算机系统(第二版)第三章家庭作业答案

    <深入理解计算机系统(第二版)>CSAPP 第三章 家庭作业 这一章介绍了AT&T的汇编指令 比较重要 本人完成了<深入理解计算机系统(第二版)>(以下简称CSAPP) ...

  5. 4.2《深入理解计算机系统》笔记(五)并发、多进程和多线程【Final】

    该书中第11章是写web服务器的搭建,无奈对web还比较陌生.还没有搞明白. 这些所谓的并发,其实都是操作系统做的事情,比如,多进程是操作系统fork函数实现的.I/O多路复用需要内核挂起进程.多线程 ...

  6. 深入理解计算机系统 BombLab 实验报告

    又快有一个月没写博客了,最近在看<深入理解计算机系统>这本书,目前看完了第三章,看完这章,对程序的机器级表示算是有了一个入门,也对 C 语言里函数栈帧有了一个初步的理解. 为了加深对书本内 ...

  7. 深入理解计算机系统 Start && 第一章要点

    对此书已经慕名已久了,抽空看了第1,2,3,5章,其他章节等有空闲继续看吧. 我的许多博客是给自己快速复习使用的,比如此读书后感,你可以根据我下面的建议读完原书几章再回来复习一下(或许那时候就没必要回 ...

  8. 《深入理解计算机系统》(CSAPP)读书笔记 —— 第一章 计算机系统漫游

    本章通过跟踪hello程序的生命周期来开始对计算机系统进行学习.一个源程序从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止.我们将沿着这个程序的生命周期,简要地介绍一些逐步出现的关键概念 ...

  9. 深入理解计算机系统(1.2)---hello world的程序是如何运行的

    在写本章的内容之前,LZ先做个小广告.其实也不算是什么广告,就是LZ为了和各位猿友交流方便,另外也确实有个别猿友留言或者在博客里发短消息给LZ要联系方式.因此LZ斗胆建立了一个有关<深入理解计算 ...

随机推荐

  1. Codeforces Gym 100733I The Cool Monkeys 拆点+最大流

    原题链接:http://codeforces.com/gym/100733/problem/I 题意 有两颗树(只是树,不是数据结构),每棵树上有不同高度的树枝,然后有m只猴子在某棵树的前m高的树枝上 ...

  2. Parallel Database for OLTP and OLAP

    Parallel Database for OLTP and OLAP Just asurvey article on materials on parallel database products ...

  3. 了解使用Android ConstraintLayout

    说明 Google I/O 2016 上发布了 ConstraintLayout, 简直是要变革 Android 写界面方式. 于是第二天我立即找到相关文档尝试, 这是官方提供的 Codelab 项目 ...

  4. mac os安装jdk、卸载

    1.JAVA版本8u171与8u172的区别  https://blog.csdn.net/u014653815/article/details/80435226  奇数版本是稳定版本,上面修订的所有 ...

  5. jenkins执行单元测试,会产生大量临时文件,要及时删除,不然会把inode耗尽

    jenkins的build命令:clean test -U findbugs:findbugs pmd:pmd sonar:sonar -Djava.io.tmpdir=/tmp/ -Dsonar.p ...

  6. 表现层 JSP 页面实现

    一.实验介绍 1.1 实验内容 本节课程主要利用 easyUI 实现系统的前端页面. 1.2 实验知识点 easyUI JavaScript html 1.3 实验环境 JDK1.8 Eclipse ...

  7. C#中toolStrip或statusStrip遮挡了SplitContainer怎么办?

    如果在一个项目中先增添了SplitContainer,然后再添加的Toolbar或statusStrip,结果后者把前者上部或下部挡住了一条,造成界面别扭. 解决办法是右键点击Toolba或statu ...

  8. Spring集成JDBC

    不同spring版本合成的方式,有时候不一样,需要查看帮助文档来看如何集成,帮助文档在spring发行包中. 1.导入spring的包(这里吧Spring-3.1.3 Release的所有jar包都导 ...

  9. 用DD-WRT自建计费WiFi热点

    架设无线网络(Wlan)向周围的用户有偿共享网络. 传统的方法,能够使用专业的无线与宽带计费网关设备和软件.比方MikroTik等. 只是,对于个人架设WiFi热点来说.这些方案太过昂贵,安装设置也很 ...

  10. android4.4 evaluateJavascript 到android2.X上不能调用的问题

    android4.4上想用js注入的话.不能用旧的loadUrl()方法,每次load都会将页面又一次刷新一次. 可是在2.X的系统版本号上,evaluateJavascript 方法会报异常.解决的 ...