`
deepfuture
  • 浏览: 4400350 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80073
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:70040
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103346
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:285798
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15012
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:67554
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32147
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45986
社区版块
存档分类
最新评论

算法下午茶系列-重温汇编(1)[AT&T汇编基础]

 
阅读更多

     汇编在LINUX系统下的意义远远大于WINDOWS系统,LINUX内核部分代码就是汇编编写的。然后,绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的。但在 Unix 和 Linux 系统中,更多采用的还是 AT&T 格式,两者在语法格式上有着很大的不同,因此应对AT&T汇编应有一个基本的了解和熟悉。 

    我们在LINUX下用C编写一段最简单的helloworld程序,命令为hello.c

#include <stdio.h>
 int main()
{ 
printf("hello,world\n");
 exit(0); 
} 







然后,使用GCC编译,同时使用-s参数生成中间汇编代码,看看AT&T汇编的真实面目


gcc -S  hello.c

 

 

.file	"hello.c"

	.section	.rodata

.LC0:

	.string	"hello,world"

	.text

.globl main

	.type	main, @function

main:

	pushl	%ebp

	movl	%esp, %ebp

	andl	$-16, %esp

	subl	$16, %esp

	movl	$.LC0, (%esp)

	call	puts

	movl	$0, (%esp)

	call	exit

	.size	main, .-main

	.ident	"GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"

	.section	.note.GNU-stack,"",@progbits

 

汇编器(assembler)的作用是将用汇编语言编写的源程序转换成二进制形式的目标代码。Linux 平台的标准汇编器是 GAS,它是 GCC 所依赖的后台汇编工具,通常包含在 binutils 软件包中。
AT&T汇编主要有以下特点:
1、在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀。

如:

把eax寄存器的内容复制到ebx中

movl %eax,%ebx
2、用 '$' 前缀表示一个立即操作数。

如:将1复制到eax中

movl $1, %eax
3、目标操作数在源操作数的右边

movl %eax,%ebx
eax是源操作数,ebx是目标操作数
4、在 AT&T 汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀'b'、'w'、'l'分别表示操作数为字节(byte,8 比特)、字(word,16 比特)和长字(long,32比特)

比如:

movl对32位进行操作,将eax寄存器32位的内容复制到ebx中

movl %eax, %ebx

movw对16位进行操作,将ax寄存器的内容复制到bx中

movw %ax, %bx

movb对8位进行操作,将al寄存器的内容复制到bl中

movb %al, %bl

 

我们再以入栈为例:

pushl %ecx  # 32位ecx的内容入栈

pushw %cx   # 16位ecx的内容入栈

pushl $180  # 80做为一个32位整数入栈

pushl data  # data变量内容入栈,长度为32位

pushl $data # 这一个操作很特别,在变量前面加上$表示取变量的地址,这是将data变量的地址入栈
5、在 AT&T 汇编格式中,绝对转移和调用指(jump/call)的操作数前要加上'*'作为前缀
6、远程转移指令和远程子调用指令的操作码,在 AT&T 汇编格式中为 ljump和lcall
我们从生成的中间代码可以看出这几个特点。

我们再来看一段用AT&T汇编编写的helloworld程序

 

.section .data#初始化的变量
output:
   .ascii "hello,world\n"
   #要打印的字符串,.data为初始化值的变量。output是标签,指示字符串开始的位置,ascii为数据类型
.section .bss#未初始化的变量,由0填充的缓冲区
   .lcomm num,20
   #lcomm为本地内存区域,即本地汇编外的不能进行访问。.comm是通用内存区域。
.section .text#汇编语言指令码
   .globl _start#启动入口
   _start:
   movl $4,%eax#调用的系统功能,4为write   
   movl $output,%ecx#要打印的字符串
   movl $1,%ebx#文件描述符,屏幕为1   
   movl $12,%edx#字符串长度
   int $0x80#显示字符串hello,world
   
   movl $0,%eax
   movl $num,%edi
   movl $65,1(%edi)#A 的ascii
   movl $66,2(%edi)#B 的ascii 
   movl $67,3(%edi)#C 的ascii 
   movl $68,4(%edi)#D 的ascii
   movl $10,5(%edi)#\n的ascii 
   
   movl $4,%eax#调用的系统功能,4为write    
   movl $num,%ecx#要打印的字符串  
   movl $1,%ebx#文件描述符,屏幕为1   
   movl $6,%edx#字符串长度
   int $0x80#显示字符串ABCD
         
   movl $1,%eax#1为退出
   movl $0,%ebx#返回给shell的退出代码值

   int $0x80#内核软中断,退出系统
   
   
   

 我们对上面这段汇编代码的结构和内容进行解说:

1、.section .data段存放着初始化的变量, .section .bss段存放着未初始化的变量

2、变量的定义采用以下格式:

变量名:

  变量类型 变量值

上面代码中的output变量就是这么定义的

output:
   .ascii "hello,world\n"

下面例子定义了多个变量

.section .data
msg:
.ascii “This is a text”
x:
.double 109.45, 2.33, 19.16

y:
.int 89

z:
.int 21, 85, 27

 

.equ  a 8

 

其中,msg为字符符,x为双精度符点数,y和z为整数,a是一个特别的定义,它的是一个静态变量的定义,使用.equ 变量名 变量值来实现

3、.section .bss段中变量访问区域的定义规则为:
lcomm为本地内存区域,即本地汇编外的不能进行访问,而.comm是通用内存区域
比如上面的定义
 .lcomm num,20  
num为本地内存区域。
4、section .text段为汇编语言指令码,使用.globl _start指示_start标记后的代码为程序启动入口。
5、#表示注释,上面代码的其它部分均有注释,有汇编基础的程序员应很容易理解
 

变量的类型有以下几种:

.ascii 文本字符串

.asciz 以NULL结束的文本字符串

.byte  字节值

.double 双精度符点数

.float 单精度符点数

.int 32位整数

.long 32位整数

.octa 16位整数

.quad 8位整数

.short 16位整数

.single 单精度符点数

 

此外,AT&T汇编经常会涉及字节顺序反转,比较加载,交换,压入弹出所有寄存器等操作,以下例子涉及了这些操作,

每行代码都有详细的注释。 

 

.section .text
  data:
   .byte 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01#8字节
.globl main
main:
  movl $0x12345678,%edx
  bswap %edx#反转字符顺序 ,结果为0x87654321 
  movl %edx,%eax
  movl $1,%ebx
  xadd %ebx,%eax#交换%eax和%ebx的值,并相加,结果放在目标位置%eax
  cmpxchg %edx,%ebx#如果目标操作数%ebx等于%eax、16位是ax,8位是al,则把源操作数%edx的值加载到%eax中、16位
  #是ax,8位是al,如果不等,则把目标操作数%ebx加到源操作数%edx加载到%eax中、16位是ax,8位是al
  
  
  movl $2,%edx#高位
  movl $3,%eax#低位
  cmpxchg8b data#如果%edx:%eax组成的8字节值与目标值data匹配,则把%edx:%eax组成的8字节值传送到目标内存位置
  #,否则将目标值data加载到%edx:%eax
pushad 
popad
#pusha/popa 压入弹出所有16位通用寄存器
#pushad/popad 压入弹出所有32位通用寄存器 
#pushf/popf 压入弹出EFLAGS寄存器的低16位
#pushf/popf 压入弹出EFLAGS寄存器的全部32位
  

 

AT&T汇编关于地址和取地址操作的示例代码如下:

.section .data
   mynum:
   .int 8
   mygs:
   .asciz "%x----%x----%x\n"
.section .text
   .globl main
   main:
   	  leal mynum,%eax #将mynum地址复制到%eax  
   	  movl (%eax),%ebx#将%eax内地址所指内容复制到%ebx
   	  movl mynum,%ecx#将mynum内容复制到%ecx中
      
   	  push %ecx
   	  push %ebx
  	  push %eax
   	  push $mygs
   	  call printf
   	  
   	  push $0
   	  call exit
   	  

 

 

乘法和除法操作如下:

 

.section .data

.section .text

  .globl main

  main:

    movl $2,%eax

    movl $5,%ebx

    mul  %ebx#%eax*%ebx->%eax,无符号乘法

    movl $-2,%eax

    movl  $5,%ebx

    imul  %ebx#%eax*%ebx->%eax,有符号乘法 

 #除法使用dev和idev(有符号)

 

 

引用来源:
1、http://www.ibm.com/developerworks/cn/linux/l-assembly/

扩展阅读:

《Professional Assembly Language》  作者: Richard Blum



如果转载请注明来源,如有错误之处,请及时指出。

 

分享到:
评论

相关推荐

    AT&T汇编语言与GCC内嵌汇编简介[定义].pdf

    1. AT&T 汇编语言语法 AT&T 汇编语言的语法与 Intel 汇编语言有所不同。主要的区别在于: * 指令大小写:AT&T 汇编语言使用小写字母,而 Intel 汇编语言使用大写字母。 * 操作数赋值方向:AT&T 汇编语言的操作数...

    AT&T ASM汇编语言入门教程

    通过以上章节的学习,读者不仅可以掌握AT&T ASM汇编语言的基础知识,还能了解如何使用这些知识解决实际问题。此外,《从零开始编程》还强调了理论与实践相结合的重要性,鼓励读者动手实践所学内容,从而更好地理解和...

    AT&T(ORL)、MIT、Yale三大人脸识别数据库,完全

    1. AT&T(ORL)人脸识别数据库: AT&T实验室的人脸识别数据库,也被称为ORL(Oxford Reasearch Laboratory)数据库,是早期广泛使用的公开人脸识别数据集之一。该数据库包含了40个人的不同面部图像,每个人有10个不同...

    Linux内核中的汇编语言

    在AT&T汇编中,如果未指定scale而指定了index,则scale默认值为1。下面是一些示例: - Intel语法:`mov eax, [ebx + ecx * 2]` - AT&T语法:`movl (%ebx, %ecx, 2), %eax` 这些差异体现了两种汇编语言在设计思路上...

    可能是最快的算法alpha-blend汇编源代码,排序算法数据结构.doc

    可能是最快的算法alpha-blend汇编源代码,排序算法数据结构.doc

    计算机系统1-汇编语言实验.docx

    * 选择排序是一种简单的排序算法,它的思路是:进行 n-1遍循环,每次找到最大的数与当前最大的数交换。 * 选择排序的时间复杂度为 O(n^2),空间复杂度为 O(1)。 知识点6:汇编语言代码设计 * 汇编语言代码设计需要...

    做好的沈美明主编IBM-PC汇编实验详细报告

    **汇编语言基础** 在IT领域,汇编语言是一种低级编程语言,它与机器语言密切相关,每一个指令都对应一个特定的机器码。IBM-PC汇编是针对IBM个人计算机系列(包括兼容机)的汇编语言,它主要用于对硬件进行直接控制...

    Linux中的汇编语言

    #### 一、AT&T与Intel汇编语言的比较 在Linux系统中,汇编语言主要用于底层编程,特别是在处理硬件接口、性能优化等方面具有不可替代的作用。由于Linux系统的起源和发展背景,它主要采用了AT&T风格的汇编语言。这与...

    GCC内联汇编基础.pdf

    ### GCC内联汇编基础知识点 #### 一、GCC内联汇编概述 **GCC内联汇编**是一种特殊的编程技术,允许开发人员在C/C++程序中直接嵌入汇编语言指令。这种方式有助于实现高性能的代码片段或访问特定硬件功能,而无需...

    清风汇编-易语言汇编学习.rar

    《清风汇编-易语言汇编学习》资料包是一个专注于易语言与汇编结合的学习资源,主要针对游戏辅助开发领域。在这个压缩包中,核心文件是“清风汇编.ec”,这很可能是易语言的一个模块,用于扩展其功能,以便在编写游戏...

    IBM-PC汇编语言程序设计

    1. **x86指令集**:IBM-PC使用的是Intel 8088/8086系列处理器,它们的指令集构成了x86架构的基础。学习这本书需要理解各种指令,如数据传送指令、算术运算指令、逻辑运算指令、控制流程指令、输入输出指令等。 2. *...

    汇编语言-使用汇编实现的飞机大战小游戏-纯汇编实现.zip

    一、汇编语言基础 汇编语言是由字母、数字和符号组成的,每一个指令代表一个特定的机器码。程序员通过汇编器将这些指令翻译成机器可执行的二进制代码。汇编语言的学习涉及到寄存器、指令集、寻址模式等基本概念。...

    Ubuntu下的x86-64汇编(x86-64 Assembly Language with Ubuntu)

    - **核心概念**:编写汇编语言程序需要熟悉一系列开发工具,包括编译器、链接器等。 - **实际应用**:通过亲手编写和调试汇编程序,可以增强对整个编译过程的理解。 - **1.3.3 提高算法开发技能** - **核心概念**...

    DES算法的汇编语言程序

    DES算法的主要流程包括初始置换(IP)、16轮迭代运算和逆初始置换(IP-1)。 初始置换(IP)的作用是将64位的明文按照特定规则重新排列,分为L0和R0两部分,每部分32位。IP置换规则是将原始64位数据重新排序,例如...

    算法技术概述,汇编

    【算法技术概述,汇编】 在信息技术领域,算法扮演着至关重要的角色,它们是解决问题和优化任务的关键工具。本文将探讨几种重要的算法类型,包括统计分析类算法、聚类算法和分类算法,以及它们在实际问题中的应用。...

    [CH04]MCS-51汇编语言程序设计1

    第四章 MCS-51汇编语言程序设计主要探讨了如何使用汇编语言来编写针对MCS-51系列单片机的程序。汇编语言是一种低级编程语言,它的指令直接对应于计算机的机器指令,因此对于单片机的硬件控制具有很高的效率。相比...

    IBM-PC 汇编语言程序设计(第五版)Peter Abel著 沈美名等译

    1. **汇编语言基础**:汇编语言是一种低级编程语言,每条指令与计算机硬件的机器码相对应,它允许程序员直接控制计算机的硬件资源。IBM-PC汇编语言是针对Intel x86架构设计的,包括8088、8086、386、486、Pentium等...

    IBM-PC汇编语言程序设计第二版

    1. 汇编语言基础:介绍汇编语言的基本概念、汇编语言与机器语言的关系、以及为什么在当今的编程环境中还需要学习汇编语言。 2. IBM-PC体系结构:详细解释IBM-PC的硬件结构,包括处理器、内存、I/O系统等,以及它们...

    UCB伯克利经典人工智能project-Pacman吃豆人-code,测试满分&有bonus(针对project1,project2-4后续更)

    针对UCB伯克利的CS188经典项目-Pacman吃豆人,人工智能课常用作业,附件为project1的code,文本文档格式,包括search.py和searchAgent.py两个文件,已通过autograder测试,26/25分,有1分bonus

Global site tag (gtag.js) - Google Analytics