C指针原理(1)-AT&T汇编
来源:互联网 发布:软件腰带剑开刃多少钱 编辑:程序博客网 时间:2024/05/29 18:01
我们在LINUX下用C编写一段最简单的helloworld程序,命令为hello.c
#include <stdio.h> int main(){ printf("hello,world\n"); exit(0); }
然后,使用GCC编译,同时使用-s参数生成中间汇编代码,看看AT&T汇编的真实面目
.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#内核软中断,退出系统
gcc -S hello.c
.file"hello.c".section.rodata.LC0:.string"hello,world".text.globl main.typemain, @functionmain:pushl%ebpmovl%esp, %ebpandl$-16, %espsubl$16, %espmovl$.LC0, (%esp)callputsmovl$0, (%esp)callexit.sizemain, .-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汇编经常会涉及字节顺序反转,比较加载,交换,压入弹出所有寄存器等操作,以下例子涉及了这些操作,
每行代码都有详细的注释。
本博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/myhaspl/
- C指针原理(1)-AT&T汇编
- C指针原理(2)-AT&T汇编
- C指针原理(3)-AT&T汇编
- C指针原理(4)-AT&T汇编
- C指针原理(5)-AT&T汇编
- C指针原理(28)-AT&T汇编
- C指针原理(29)-AT&T汇编
- C指针原理(30)-at&t汇编-快速排序
- AT&T汇编语法-1
- AT&T汇编(1)
- AT&T 汇编调用C库函数
- C指针原理(94)-汇编基础(1)
- (1)AT&T汇编笔记
- AT&T汇编学习总结-1
- AT & T汇编简介
- AT&T 汇编参考
- AT&T汇编格式
- AT & T汇编简介
- 一个女孩的就业之路(同济大学BBS上两年不沉的帖子)
- Problem 2089 数字游戏 大数问题
- 在线更新ubuntu 服务器补丁
- SCI论文编辑教你如何准备SCI论文和写作
- 优化的最长上升子序列LIS算法 O(nlogn)
- C指针原理(1)-AT&T汇编
- 35岁前成功的12条黄金法则
- 怎样写好一份IT技术岗位的简历
- DB2日志基本概念及归档日志模式设置
- HEVC的帧内预测模式的底层计算
- 揭示真相——移动电源转换效率解析
- 程序员的职业规划
- uva193继续回溯!!
- 硕博经验——科研论文阅读与写作实战技巧