• Linux GNU GAS introduction


    Linux汇编语法简介(GNU GAS)
     
     
    声明:本教程不是介绍汇编语言和CPU指令的书籍,只是对gas的用法做一简单介绍。市面上所有讲汇编的书都是在微软的环境下,使用的是Intel的语法格式,因此,本教程的目的是想给在Linux下学习汇编的初级用户提供一些帮助。(详细请参阅 GNU GAS 手册)
    本人也是初学者,在以后的不断学习中,此教程也会慢慢修改,使得更加完善,希望阅读者给予宝贵意见。谢谢!
    一、 通用语法
    指令格式: 操作码 源操作数, 目的操作数(在有两个操作数的情况下)。
    常量表示: 在常量前加上$,例:$1
    $的另一种用法:用于符号时,表示的是一个首地址。 
    例:
    string:
    .ascii "hello world "
    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 "字符串":以''为结束符,例:.ascii "hello"
    .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
  • 相关阅读:
    自我分析和展望
    测试设计说明及结队反思总结
    WordCount项目
    结对编程
    第一周的博客作业
    第一次作业:统计文件字符串字符行的个数
    系统分析与设计结对项目———Wordcount
    第一周的博客作业
    第一次 作业 workcount (基础功能实现)
    触摸点为scrollview上的子控件时,scrollview不能滚动(iOS8)
  • 原文地址:https://www.cnblogs.com/bittorrent/p/3375975.html
Copyright © 2020-2023  润新知