`
myway84
  • 浏览: 205511 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类
最新评论

Linux下的汇编程序学习体会(1)(转载)

阅读更多
Linux下的汇编程序学习体会(1)

一、为什么学习linux下的汇编
Linux的应用领域越来越广泛,特别是在嵌入式领域有着得天独厚的优势。涉及到硬件相关的开发自然少不了汇编语言。
大学里学习的汇编都是16位的,与现在32位芯片有些出入。
而且很多AT/T的汇编格式代码也让我们感到困惑
Linux内核代码由一些核心部分也是用汇编写的。为了读懂linux内核,需要对汇编有一定的了解。本人正是基于这个目的出发,才学习汇编的。

二、硬件和汇编语言
汇编语言根机器语言是一一对应的;所以,不同型号的机器有不同的汇编语言,本文所有的论述都是基于X86的体系结构。
Linux汇编按照语法格式可以分为两种inter格式和AT/T格式。前者跟我们大学里学习的汇编语言格式相近;后者在linux内核代码中得到了广泛的应用。关于这两种格式的详细描述请参考《linux下的汇编程序学习体会(2)》。Linux下还有一个小工具,intel2gas可以把inter格式转换成AT/T格式。本文所涉及的都是AT/T格式的汇编。
三、开发环境
编辑器
Linux下任何一款文本编辑器,vi, emac, etc. 如果喜欢直接写屏,也没什么不妥(男人就要对自己狠一点)。不过本人还是钟爱vi.

编译器
推荐as, 没啥可说的,看man page吧。

连接器
当然是老牌劲旅ld, (其实我没用过别的),用法还是参考man page.

调试器
可以用gdb, 不过康奈尔大学的好事者Patrick Alken先生独立开发了一个ald。本人就是用ald, 这个软件可以从http://ald.sourceforge.net/ 获得,它的编译需要依赖行编辑器readline, readline可以从http://www.gnu.org/ 上找到。

教材
推荐ProgrammingGroundUp, 浅显易懂实用


四、入门实例
先来个感性的认识,用一个Hello World程序把汇编语言的开发过程完整的走一编。

第一步,编辑程序。

用编辑器编译下列程序保存文件名为hello.s

#hello.s

.data # 数据段声明

msg : .string "Hello, world!" # 要输出的字符串

len = . - msg # 字串长度


.text # 代码段声明

.global _start # 指定入口函数


_start: # 在屏幕上显示一个字符串

movl $len, %edx # 参数三:字符串长度

movl $msg, %ecx # 参数二:要显示的字符串

movl $1, %ebx # 参数一:文件描述符(stdout)

movl $4, %eax # 系统调用号(sys_write)

int $0x80 # 调用内核功能


# 退出程序

movl $0, %ebx # 参数一:退出代码

movl $1, %eax # 系统调用号(sys_exit)

int $0x80 # 调用内核功能


第二步,编译

运行命令as –gstabs –o hello.o hello.s 就得到了二进制目标文件hello.o, 参数—gstabs 的意义是保存符号表,以方便将来的调试。

第三步,连接

运行命令ld –o hello hello.o 就输出了可执行程序hello.

第四步,运行

敲入命令./hello, 就看到了输出。

第五步,调试

这个程序工作正常,实际上无需调试。这里只是介绍调试器的使用方法。运行命令ald hello

就进入了调试状态。

Assembly Language Debugger 0.1.7

Copyright (C) 2000-2004 Patrick Alken



hello: ELF Intel 80386 (32 bit), LSB - little endian, Executable, Version 1 (Current)

Loading debugging symbols...(15 symbols loaded)

ald>

用反汇编命令得到程序的代码段

ald> d -s .text

Disassembling section .text (0x08048074 - 0x08048096)

08048074:<_start> BA0E000000 mov edx, 0xe

08048079 B998900408 mov ecx, 0x8049098

0804807E BB01000000 mov ebx, 0x1

08048083 B804000000 mov eax, 0x4

08048088 CD80 int 0x80

0804808A BB00000000 mov ebx, 0x0

0804808F B801000000 mov eax, 0x1

08048094 CD80 int 0x80

设置断点

ald> b 0x0804807E

Breakpoint 1 set for 0x0804807E

运行程序

ald> r

Starting program: hello

Breakpoint 1 encountered at 0x0804807E

eax = 0x00000000 ebx = 0x00000000 ecx = 0x08049098 edx = 0x0000000E

esp = 0xBFFFFCC0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000

ds = 0x007B es = 0x007B fs = 0x0000 gs = 0x0000

ss = 0x007B cs = 0x0073 eip = 0x0804807E eflags = 0x00200212



Flags: AF IF ID





0804807E BB01000000 mov ebx, 0x1

单步运行到结束

ald> n

eax = 0x00000000 ebx = 0x00000001 ecx = 0x08049098 edx = 0x0000000E

esp = 0xBFFFFCC0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000

ds = 0x007B es = 0x007B fs = 0x0000 gs = 0x0000

ss = 0x007B cs = 0x0073 eip = 0x08048083 eflags = 0x00200312



Flags: AF TF IF ID





08048083 B804000000 mov eax, 0x4

ald> n

eax = 0x00000004 ebx = 0x00000001 ecx = 0x08049098 edx = 0x0000000E

esp = 0xBFFFFCC0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000

ds = 0x007B es = 0x007B fs = 0x0000 gs = 0x0000

ss = 0x007B cs = 0x0073 eip = 0x08048088 eflags = 0x00200312



Flags: AF TF IF ID





08048088 CD80 int 0x80

ald> n

Hello, world!eax = 0x0000000E ebx = 0x00000000 ecx = 0x08049098 edx = 0x0000000E

esp = 0xBFFFFCC0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000

ds = 0x007B es = 0x007B fs = 0x0000 gs = 0x0000

ss = 0x007B cs = 0x0073 eip = 0x0804808F eflags = 0x00200312
分享到:
评论

相关推荐

    一步一步学习linux汇编语言程序设计

    1. **编写简单的汇编程序**:通过实例演示如何编写第一个汇编程序,包括设置开发环境、编写代码、编译和运行程序。 2. **函数调用和参数传递**:讲解在 Linux 系统下调用函数时的栈帧布局、参数传递规则等关键概念。...

    Linux下的汇编语言.pdf

    Intel格式是我们在DOS操作系统下编写汇编程序时所熟悉的格式,而AT&T格式则是Linux下的标准格式。了解这两种格式的差异非常重要,以便我们更好地编写汇编程序。 在AT&T格式中,寄存器和立即数都有前缀,寄存器前冠...

    Linux的x86汇编程序设计.pdf

    Linux 下的汇编程序需要编译和链接才能生成可执行文件。Nasm 是一种自由的汇编器,可以生成 ELF 格式的目标文件。GCC 是一个常用的编译器,可以链接生成的目标文件。 3. IO 端口编程 IO 端口编程是 Linux x86 汇编...

    [一步一步学习linux汇编语言程序设计

    在本书中,读者将学习如何使用GCC来编译汇编程序。 - **GDB(GNU Debugger)**:GDB是一款强大的调试工具,可以帮助开发者定位和修复程序中的错误。书中详细介绍了如何利用GDB进行调试的基本操作。 ##### 2.3 汇编...

    一步一步学习linux汇编语言程序设计.rar

    编写汇编程序时,我们需要使用特定的指令来调用Linux系统调用,以便与操作系统交互,执行诸如读写文件、创建进程等功能。 在Linux系统中,汇编程序通常与C语言混合编程,因为C语言可以提供更高级别的抽象,而汇编...

    一步一步学习linux汇编语言程序设计 3rd

    一步一步学习linux汇编语言程序设计 第三版 最新版

    Linux下的汇编语言学习笔记 .pdf

    Linux下的汇编语言是深入理解操作系统底层工作原理和优化程序性能的关键。在Linux环境中,汇编语言主要分为两种格式:Intel格式和AT&T格式。由于Linux操作系统起源于Unix,因此在Linux内核和一些关键程序中,常使用...

    Linux下的汇编语言程序开发.pdf

    了解并掌握这些差异对于在Linux环境下编写高效的汇编程序至关重要。由于Linux和Unix系统更倾向于使用AT&T格式,因此程序员需要适应这种新的语法结构。通过实际的编程实践,可以更好地理解和应用这些概念,从而提高在...

    一步一步学习linux汇编语言程序设

    《一步一步学习Linux汇编语言程序设计》是一本深入浅出地介绍Linux环境下汇编语言编程的书籍。本书由Jeff Duntemann撰写,并由Wiley Publishing出版。作为该领域的权威著作之一,这本书不仅适合初学者入门,也适用于...

    linux下hello的汇编程序

    本主题将深入探讨在Linux环境下编写和运行一个简单的"hello world"汇编程序。 标题“linux下hello的汇编程序”表明我们将关注的是如何在Linux系统中使用汇编语言来创建一个输出"hello world"的程序。汇编程序通常以...

    [一步一步学习linux汇编语言程序设计].Assembly.Language.Step-by-Step.-.Programming.with.Linux,.3rd.Edition.Oct.2009

    在Linux环境中,汇编程序员还需要了解如何使用调试工具,如GDB(GNU Debugger)来调试汇编程序,以及如何使用AS(GNU Assembler)和LD(GNU Linker)来组装和链接程序。这些工具的熟练运用能极大地提高开发效率。 ...

    深入理解程序设计使用Linux汇编语言

    《深入理解程序设计:使用Linux汇编语言》介绍了Linux平台下的汇编语言编程,教你从计算机的角度看问题,从而了解汇编语言及计算机的工作方式,为成就自己的优秀程序员之梦夯实基础。 很多人都认为汇编语言晦涩难懂...

    Linux设备驱动程序学习

    Linux设备驱动程序学习(1)-字符设备驱动程序 ·Linux设备驱动程序学习(0)-Hello, world!模块 ·Linux设备驱动程序学习(2)-调试技术 ·Linux设备驱动程序学习(3)-并发和竞态 ·Linux设备驱动程序学习(4)-...

    Linux下ARM汇编语法

    ### Linux下ARM汇编语法详解 #### 一、引言 在嵌入式系统和低级别编程领域,...以上是Linux下ARM汇编语法的基础内容及常用工具介绍,对于希望深入学习嵌入式系统和底层编程的开发者来说,掌握这些基础知识至关重要。

    linux下开源高级汇编语言

    linux下开源高级汇编语言linux下开源高级汇编语言linux下开源高级汇编语言linux下开源高级汇编语言linux下开源高级汇编语言linux下开源高级汇编语言linux下开源高级汇编语言linux下开源高级汇编语言linux下开源高级...

    linux环境下的汇编语言

    在Linux环境下学习汇编语言,是一项对计算机底层工作原理深入理解的重要实践。汇编语言,是一种低级编程语言,它与机器语言紧密相关,每条指令都直接对应于计算机硬件的特定操作。在Linux系统中,汇编语言的运用可以...

Global site tag (gtag.js) - Google Analytics