AT&T汇编语言——简单实例及工具演示
今天就来用详细实例代码来运用一下昨天所说的仅仅个工具的使用方法吧
这几个实例基本的目的是来熟悉一下汇编相关工具的使用方法及应用一下昨天刚说的汇编程序模板。
我们用到的工具主要有as,ld,gcc,gdb,当然。它们是执行在linux系统下的
废话少说,直接来样例了。嗯,再说一句,以下的样例是參考或来自《汇编语言程序设计》Richard Blum的
例一:打印出"hello,world!"
#hellowrold.s print "hello,world!" .section .data
output:
.ascii "hello,world\n" .section .text
.globl _start
_start:
movl $4, %eax
movl $1, %ebx
movl $output,%ecx
movl $12,%edx
int $0x80
movl $1, %eax
movl $0, %ebx
int $0x80
简单说一下代码:
首先,在数据段中声明一个字符串:
output:
.ascii "hello,world\n"
.asscii声明使用ASCII字符声明一个文本字符串。字符串元素被提前定义而且放在内存中,其起始内存位置由标签output指示。
以下是声明程序的指令码段和一般的起始标签,_start是链接器默认的起始代码:
.section .text
.globl _start
_start:
以下是直接调用write系统调用来显示文本内容
movl $4, %eax
movl $1, %ebx
movl $output,%ecx
movl $12,%edx
int $0x80
Linux下write系统调用的參数:
EAX包括系统调用值。write是4
EBX包括要写入的文件描写叙述符,我们知道,Linux终端中0表示标准输入。1表示标准输出。2表示错误输出,这里将1传入EBX,也就是表示标准输出
ECX包括字符串的开头
EDX包括字符串的长度
用样。以下也是系统调用 ,1表示退出函数,返回值为0
movl $1, %eax
movl $0, %ebx
int $0x80
编译执行结果例如以下:
先解释编译參数,
第一步:首先编译成二进制文件 as --32 -o hellowrold.o hellowrold.s
as表示用as汇编器。
--32表示将目标代码编译成ia-32代码格式
-o hellowrold.o 表示目标文件是hellowrold.o(好像,写错文件名称了Orz
)
hellowrold.s就是源码了(本来要定成helloworld.s的,错了就错了吧)
第二步:然后。将hellowrold.o链接成可运行文件
ld -m elf_i386 -o hellowrold hellowrold.o
ld表示是用ld链接
-m elf_i386 表示生成32 elf位 elf格式文件
-o hellowrold表示生成的文件是hellowrold
hellowrold.o 是在第一阶段生成的二进制文件
再来试试gdb这个调试工具。汇编器as的多了个參数 -g,表示生成debug 代码。gdb hellowrold执行调试,界面例如以下:
gdb的使用方法主要有几个:list显示代码,break设置段点。 info register显示全部寄存器的值。print打印特定变量的值。x显示特定内存位置的值,step下一指令,run执行代码。
演示一下:
list,列出代码
break设置断点。这里是在特定的标签中设置,break有下面方式设置断点:
1.到达某个标签
2.到达源码中的某个行号
3.数据值到达特定值
4.函数运行了指宝的次数之后
print 打印出对应的值。print 的输出格式有:
print/d 输出十进制值
print/t 输出二进制值
print/x 输出十六进制值
info register 打印出全部寄存器值
当然,我们的样例仅仅要改一下,将 代码入口标签_start改成main就能够用gcc来编译。
gcc -m32 -o hellowrold hellowrold.s
就能够编译成功了。
例二、以下再说个在汇编语言中调用c函数库的样例。
.section .data
output:
.ascii "The number is %d\n"
.section .bss
.lcomm buffer,18
.section .text .globl _start
_start: pushl $520
pushl $output
call printf
addl $8,%esp
pushl $0
call exit
例如以下方法编译该代码,能够看出。ld链接的时候多了几个參数。
让我来一一说一下多出来的两个參数的含义吧。
我们知道 ,在linux中,把C函数连接到汇编语言程序有两种方法。第一种中做静态链接(static linking).静态链接把函数目标代码直接连接到应用 程序的可运行程序文件里。
这样会创建巨大的可运行程序。并且,假设同一时候运行程序的多个实例,会造 成内在浪费(每一个函数都有其自己的同样函数拷贝)
另外一种方法是动态链接。
在Linux中,标准C的动态库位于lib.so.x文件里,在我的系统(ubutnu 14.04 )中,这个文件是libc.so.6。因为我採用兼容方式执行,所以,我的系统有两个该文件,一个是32位的(/lib/i386-linux-gnu/libc.so.6),另一个是64位的(/lib/x86_64-linux-gnu/libc.so.6)。在使用gcc时。gcc是自己主动将c语言链接到该库。我们使用ld。为了链接libc.so文件。必须使用gnu连接器的-l 參数,不用指定完整的库名称。连接器如果在它能找到的位置存在libxso文件。基中x是命令行參数指定的库名称。我们的是c,故使用
-lc
理论上,我们不用加參数 -dynamic-linker就能够执行了。可其实,编译是通过了。可是执行不了。
bash: ./print: No such file or directory
为什么呢?
问题在于连接器是可以解析C函数了,可是函数本身没有包括在终于可执行程序中。链接器如果执行时程序可以找到该库文件。所以编译进不出错。但其实。我们的程序找不到该库文件。为了解决问题,还必须指定在程序执行时载入动态库的程序。对于LINUX,这个程序是linux.so.2,在我的系统下,它位于/lib下。为了指定这个程序,必须使用gnu链接器的 -dynamic-linker,故还要加入參数
-dynamic-linker
事实上,我们也能够直接用 gcc编译,仅仅要把_start标签改成 main就能够例如以下方法 编译了
gcc -o print print.s
AT&T汇编语言——简单实例及工具演示的更多相关文章
- Hibernate(二)__简单实例入门
首先我们进一步理解什么是对象关系映射模型? 它将对数据库中数据的处理转化为对对象的处理.如下图所示: 入门简单实例: hiberante 可以用在 j2se 项目,也可以用在 j2ee (web项目中 ...
- 【转】Android Https服务器端和客户端简单实例
转载地址:http://blog.csdn.net/gf771115/article/details/7827233 AndroidHttps服务器端和客户端简单实例 工具介绍 Eclipse3.7 ...
- Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例
目录 [TOC] 1.环境准备 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...
- (Hibernate进阶)Hibernate搭建开发环境+简单实例(二)
hibernate是非常典型的持久层框架,持久化的思想是非常值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和 ...
- 简单实例一步一步帮你搞清楚MVC3中的路由以及区域
我们都知道MVC 3 程序的所有请求都是先经过路由解析然后分配到特定的Controller 以及 Action 中的,为什么这些知识讲完了Controller Action Model 后再讲呢?这个 ...
- 主题:Java WebService 简单实例
链接地址:主题:Java WebService 简单实例 http://www.iteye.com/topic/1135747 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...
- gtk+blade+anjuta 的简单实例
gtk+blade+anjuta 的简单实例我的系统 ubuntu 12.04 1> 选择源 不正确会有很多问题,速度慢,找不到安装的软件.163的源就不错 http://mirrors. ...
- Wordpress解析系列之PHP编写hook钩子原理简单实例
Wordpress作为全球应用最广泛的个人博客建站工具,有很多的技术架构值得我们学习推敲.其中,最著名最经典的编码技术架构就是采用了hook的机制. hook翻译成中文是钩子的意思,单独看这个词我们难 ...
- resteasy简单实例
1.建一个maven web项目 新建一个maven项目,next,第一个框不要勾选 选择maven-archetype-webapp,建一个web项目 键入项目组织id与项目id 一般此时搭建的只是 ...
随机推荐
- dhcp 提示could not load neutron.agent
错误日志如下: N版存在问题,其它版本不知道 解决方法(代码问题): /usr/lib/python2.7/site-packages/neutron/common/utils.py 在这个方法上(d ...
- Python下读取转换unicode的json格式
转自: https://blog.csdn.net/felcon/article/details/38524317 JSON(JavaScript Object Notation) 是一种轻量级的数据 ...
- xml javascript
1.XMLHttpRequest对象 创建XMLHttpRequest对象 xmlhttp=new XMLHttpRequest(); ##老版本的 Internet Explorer (IE5 和 ...
- hdu 4118 dfs
题意:给n个点,每个点有一个人,有n-1条有权值的边,求所有人不在原来位置所移动的距离的和最大值.不能重复 这题的方法很有看点啊,标记为巩固题 Sample Input 1 4 1 2 3 2 3 2 ...
- bzoj 2178
这题调精度真痛苦啊(向管理员要了数据才调出来). 用的是hwd在WC2015上讲的方法,考虑将原图分割,根据每个圆的左右边界和圆与圆交点的横坐标来分割,这样原图就被分成很多竖着的长条,并且每一条中间都 ...
- ROS知识(11)----同步两台机器时钟
两台机器同时运行过程中,对于ROS的tf变换,其要求两台机器的时钟要保持一致. 1.查询时间 首先通过以下命令,看两台机器时钟是否有差异.在本机上,查看远程master的机器时间: ntpdate - ...
- HDU 3726 Graph and Queries (离线处理+splay tree)
Graph and Queries Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- BitTorrent Sync 老版本
Sync version 1.4.111 Installer for Windows: BTSync.exe BTSync_x64.exe Installer for OSX: BTSync.dmgG ...
- 在 CentOS 和 RHEL 上安装 Puppet 服务器和客户端
https://linux.cn/article-3959-1.html https://docs.puppet.com/
- c#中何时使用Empty()和DefalutIfEmpty()
在项目中,当我们想获取IEnumerable<T>集合的时候,这个集合有可能是null.但通常的做法是返回一个空的集合. 假设有这样一个场景:当商店不营业时,返回一个空的IEnumerab ...