Linux汇编语法简介(GNU GAS)
 
 
声明:本教程不是介绍汇编语言和CPU指令的书籍,只是对gas的用法做一简单介绍。市面上所有讲汇编的书都是在微软的环境下,使用的是Intel的语法格式,因此,本教程的目的是想给在Linux下学习汇编的初级用户提供一些帮助。(详细请参阅 GNU GAS 手册)
本人也是初学者,在以后的不断学习中,此教程也会慢慢修改,使得更加完善,希望阅读者给予宝贵意见。谢谢!
一、 通用语法
指令格式: 操作码 源操作数, 目的操作数(在有两个操作数的情况下)。
常量表示: 在常量前加上$,例:$1
$的另一种用法:用于符号时,表示的是一个首地址。 
例:
string:
.ascii "hello world\n\0"
movl $string, %eax # 首地址复制到eax
寄存器表示: 在寄存器名前加上%,例:%eax
对不同长度的操作数操作:分别在指令后加上b、w、l,表示字节(8位)、字(16位)、双字(32位)。
例:movb $1, %al, movw $1, %ax, movl $1, %eax (注:一般情况下,都是32位操作)。
不同进制数的表示: 
十六进制以0x开头,例:$0xffff
十进制没有符号,例:$1
八进制以0开头,例:$0777
二进制以0b开头,例:$0b1111
注释:
#号开头用于单行
/* 
…………
…………
…………
*/
用于多行。
每条汇编语句以换行和回车这两个字符为结束。(注意:当写完程序的最后一条语句,不要忘记按enter键,否则编译时会提示最后一条语句的出错)
二、 寻址
通用内存寻址:地址或偏移量(%首地址或偏移量, %索引, 字节数),其中所有的参量都是可选的。
以下的几种寻址是通用方式的变形:
直接寻址:movl 0xff11, %eax
索引寻址:movl string(, %ecx, 1), %eax # string是事先已定义过的标签,代表一个首地址。整个意思是读取一组数据的某一个,长度为一个字节,复制到eax。(相当于数组)适用于数据段寻址。
间接寻址:movl (%eax), %ebx # 把eax所指向的值复制到ebx(相当于指针操作)
基址寻址:movl 4(%ebp), %ebx # 把ebp的地址偏移4个字节所取得的值复制到ebx(通过基址指针加偏移量来寻找数据)。适用于堆栈寻址。
立即数寻址:movl $1, %eax # 把一个常量直接复制到寄存器
三、 常用伪指令
段表示:
.data 数据段
.bss(block started by symbol) 符号开始段
.text 代码段
基本数据类型(可以用逗号分割多个表达式或字符串):
.byte 表达式:8位(0 - 255)例:.byte 100, 200, 300
.int 表达式:16位(0 - 65535) 例:.int 1000
.long 表达式:32位(0 - 4294967295) 例:.long 100000
.ascii "字符串":以'\0'为结束符,例:.ascii "hello\0"
.global(或.globl) 符号:定义全局符号,例:.global _start,这是每个Linux下的汇编程序代码段的第一个定义,它指定了整个程序与运行环境交互的入口(相当于C中的main函数)。
.equ 符号, 表达式:等价替换(可用于局部变量的定义)。例:.equ LINUX_SYSCALL 0x80
.lcomm 符号, 字节数:在.bss段中声明未初始化变量的内存空间(适用于全局和静态变量的声明)。
例:
.bss
.lcomm buffer, 256
函数表示:
.type 符号, @function
例:
.type func, @function
func:
...
.include 文件:外部文件的调用 例:.include "outside.s"
四、 程序基本结构
.data
...
.bss
...
.text
.global _start
_start:
...
五、 系统调用
Linux的系统调用的中断号是0x80,参数的传递要通过通用寄存器来完成。这里对寄存器的使用有一些约定:eax存放系统调用的编号,参数依次放入ebx,ecx,edx,esi,edi,最后用int $0x80指令完成调用。
例:程序结束后的正常退出
movl $1, %eax
movl $0, %ebx
int 0x80
这相当于在C中执行了exit(0)。
六、 程序的编译
汇编器命令:as
参数:
--gstabs:产生符号表,用于调试
-o:自定义输出的文件名,由于通过汇编器产生的是目标文件,因此,必须是后缀名为.o的文件
--help:帮助
例:as --gstabs test.s -o test.o
连接器命令:ld,只有通过连接器才能完成最后的可执行文件。
参数:
-o:自定义输出文件名,文件没有后缀名
--help:帮助
例:ld test.o -o test

Linux GNU GAS introduction的更多相关文章

  1. alias function varibales in Linux/GNU and Mac alias命令细说

    细说,在古文言中是”奸细佞臣的话“,现如今成了”详细说明“的缩略. alias是MS-DOC中cmds中doskey的counterpart,是”别名“或者”化名“的意思 alias强大之处在于可以化 ...

  2. How-to Install VMware Tools on Debian Stretch 9 32/64bit Linux+GNU

    在虚拟机VMWARE上安装debian9 安装vmwaretools时候遇到问题 询问我IFCONFIG安装在哪里? 新版的debian不知道是用户权限问题还是使用了其他网络配置工具 vmwareto ...

  3. Linux GNU C

    Linux 系统上可用的C编译器是GNU C编译器,它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布.GNU C对标准C 进行一系列扩展,以增强标准C的功能. 1.零长度数组GNU C 允 ...

  4. Beginning Linux Programming 学习--chapter 1 Getting start--What's linux,GNU,HeaderFiles, Libraries

    "文明的建立的不是机器而是思想" -- 托尔斯泰 Linux truly become a viable operating system, especially in the s ...

  5. Terminal的快捷键 for Terminal for Mac OS 10.10, Linux/GNU(Ubuntu, deepin, elementory os,CentOS)

    对于习惯用windows键盘的,突然转成Mac蓝牙键盘真的有点不习惯,尤其是多了⌘这个键,还有Alt键也成了Option 但是对于Windows下熟悉的快捷键,它们真的失效了,还好Ubuntu也常用, ...

  6. history and its relevant variables in Linux/GNU and Mac OS history命令以及相关环境变量

    对于Terminalor们,history命令并不陌生,什么!n, !!更是很常用的,而且您在命令行敲的cmds是默认保存在/home/$USER/.bash_history(linux) /User ...

  7. 你可能不知道的Linux/GNU bash sort多列排序功能

    (转载请注明原创于潘多拉盒子) Linux man pages的缺点就是,如果你不会用某个命令,那么看完了多半还是不会.原因是,没有例子!比较囧吧? sort是提供了多列排序的功能的.通过-k选项,可 ...

  8. 世纪大争论:Linux还是GNU/Linux?

    我们在网上已经习惯用“Linux”来称呼Linux操作系统了,然而,偶尔也用“GNU/Linux”来称呼和指代同样的操作系统和软件.同时人们也在争论这两种称呼哪个更合适. 本文将不会选边站队,仅力图向 ...

  9. GNU/Linux 介绍

    在了解Linux之前要先了解什么是GNU / GNU官方解释? GNU是一个自由软件操作系统.就是说,它尊重其使用者的自由.GNU操作系统包括GNU软件包(专门由GNU工程发布的程序)和由第三方发布的 ...

随机推荐

  1. elasticsearch 深入 —— 地理位置

    地理位置 我们拿着纸质地图漫步城市的日子一去不返了.得益于智能手机,我们现在总是可以知道 自己所处的准确位置,也预料到网站会使用这些信息.我想知道从当前位置步行 5 分钟内可到的那些餐馆,对伦敦更大范 ...

  2. https://blog.csdn.net/eguid_1/article/category/6270094

    https://blog.csdn.net/eguid_1/article/category/6270094

  3. javaweb各种框架组合案例(四):maven+spring+springMVC+spring data jpa(hibernate)【失败案例】

    一.失败案例 1. 控制台报错信息 严重: Exception sending context initialized event to listener instance of class org. ...

  4. 4——class和struct

    class的定义看上去很像struct定义的扩展, 事实上,类定义时的关键字class完全可以替换成struct,也就是说,结构体变量也可以有成员函数. class和struct的唯一区别在于:str ...

  5. JS中常见的几种报错类型

    1.SyntaxError(语法错误) 解析代码时发生的语法错误 var 1a; //Uncaught SyntaxError: Invalid or unexpected token 变量名错误 c ...

  6. Android中实现Activity的启动拦截之----实现360卫士的安装应用界面

    第一.摘要 今天不是周末,但是我已经放假了,所以就开始我们的技术探索之旅,今天我们来讲一下Android中最期待的技术,就是拦截Activity的启动,其实我在去年的时候,就像实现这个技术了,但是因为 ...

  7. [ZJOI2019]开关

    以下的方案数默认是带权方案数.设\(P=\sum_{i=1}^np_i\). 设\(F(x)\)为按\(i\)次开关后到达终止态的方案数的EGF,\(f\)为\(F\)的OGF,显然\(F(x)=\p ...

  8. paper 161:python的Json数据解析

    概念 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON.XML等.反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态 ...

  9. 微信小程序相关操作

    显示用户基本信息 在微信小程序中,经常会碰到需要展示微信用户的基本信息,如果只是为了显示用户信息,最简单有效的办法是使用open-data,这是微信小程序内置的用于展示微信开放数据的组件,通过改变ty ...

  10. 禁止多用户进入win7系统的方法(图文)

    windows7系统可以支持多用户登陆,虽然它能为使用者提供方便,但是为安全起见,一些用户想要禁止多用户进入win7系统,因为我们并不能保证其他账户用户在使用过程中是否会安装病毒程序.那么如何禁止多用 ...