今天就来用详细实例代码来运用一下昨天所说的仅仅个工具的使用方法吧

这几个实例基本的目的是来熟悉一下汇编相关工具的使用方法及应用一下昨天刚说的汇编程序模板

我们用到的工具主要有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汇编语言——简单实例及工具演示的更多相关文章

  1. Hibernate(二)__简单实例入门

    首先我们进一步理解什么是对象关系映射模型? 它将对数据库中数据的处理转化为对对象的处理.如下图所示: 入门简单实例: hiberante 可以用在 j2se 项目,也可以用在 j2ee (web项目中 ...

  2. 【转】Android Https服务器端和客户端简单实例

    转载地址:http://blog.csdn.net/gf771115/article/details/7827233 AndroidHttps服务器端和客户端简单实例 工具介绍 Eclipse3.7 ...

  3. Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例

    目录 [TOC] 1.环境准备 ​ 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...

  4. (Hibernate进阶)Hibernate搭建开发环境+简单实例(二)

    hibernate是非常典型的持久层框架,持久化的思想是非常值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和 ...

  5. 简单实例一步一步帮你搞清楚MVC3中的路由以及区域

    我们都知道MVC 3 程序的所有请求都是先经过路由解析然后分配到特定的Controller 以及 Action 中的,为什么这些知识讲完了Controller Action Model 后再讲呢?这个 ...

  6. 主题:Java WebService 简单实例

    链接地址:主题:Java WebService 简单实例    http://www.iteye.com/topic/1135747 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...

  7. gtk+blade+anjuta 的简单实例

    gtk+blade+anjuta 的简单实例我的系统 ubuntu 12.04   1>  选择源 不正确会有很多问题,速度慢,找不到安装的软件.163的源就不错 http://mirrors. ...

  8. Wordpress解析系列之PHP编写hook钩子原理简单实例

    Wordpress作为全球应用最广泛的个人博客建站工具,有很多的技术架构值得我们学习推敲.其中,最著名最经典的编码技术架构就是采用了hook的机制. hook翻译成中文是钩子的意思,单独看这个词我们难 ...

  9. resteasy简单实例

    1.建一个maven web项目 新建一个maven项目,next,第一个框不要勾选 选择maven-archetype-webapp,建一个web项目 键入项目组织id与项目id 一般此时搭建的只是 ...

随机推荐

  1. NetCore+Dapper WebApi架构搭建(二):底层封装

    看下我们上一节搭建的架构,现在开始从事底层的封装 1.首先需要一个实体的接口IEntity namespace Dinner.Dapper { public interface IEntity< ...

  2. 凡信(超仿微信Android版)开源了,内有源码下载 -

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 凡信(超仿微信Android版)开源了,内有源码下载 - IM Geek开发者社区-移动 ...

  3. 每一个JavaScript开发者应该了解的浮点知识

    在JavaScript开发者的开发生涯中的某些点,总会遇到奇怪的BUG——看似基础的数学问题,但却又觉得有些不对劲.总有一天,你会被告知JavaScript中的数字实际上是浮点数.试图了解浮点数和为什 ...

  4. 【BZOJ】2730: [HNOI2012]矿场搭建【Tarjan找割点】【分联通块割点个数】

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3230  Solved: 1540[Submit][Stat ...

  5. Codeforces Round #353 (Div. 2) E. Trains and Statistic dp 贪心

    E. Trains and Statistic 题目连接: http://www.codeforces.com/contest/675/problem/E Description Vasya comm ...

  6. trigger、procedure和event如何同步

    最近遇到一个需求涉及存储过程,被突然问题到如何同步问题问到了,赶紧补课学习一下. 首先,先看一下trigger.procedure和event的定义都是什么? trigger: 触发器是一个被指定关联 ...

  7. Google的Shell开发规范

    官方:https://google.github.io/styleguide/shell.xml 中文: http://zh-google-styleguide.readthedocs.io/en/l ...

  8. 浅入浅出---JQuery究竟是什么?

    学习完了JQuery之后.我便感觉云里雾里的,JQuery究竟是什么.朦朦胧胧感觉到JQuery应该是javascript函数的封装.就应该像WinForm窗口应用程序中能够调用的系统函数,据之前所学 ...

  9. XPROG-m编程器

    XPROG-m编程器是为取代较早版本的XPROG编程器而设计的. XPROG-m编程器硬件完全与XPROG编程器向上兼容,还具有其它许多功能. 该XPROG - M支持摩托罗拉68HC05,68HC0 ...

  10. 深入浅出-网络七层模型&&网络数据包

    网络基本概念 OSI模型 OSI 模型(Open System Interconnection model)是一个由国际标准化组织