hello,world初学汇编

来源:互联网 发布:婚庆电子相册制作软件 编辑:程序博客网 时间:2024/05/17 06:01

  绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的。但在 Unix 和 Linux 系统中,更多采用的还是 AT&T 格式。以下分别是这两种风格的汇编代码和汇编方法。

1、工具

Linux 平台下的汇编工具虽然种类很多,但同 DOS/Windows 一样,最基本的仍然是汇编器、连接器和调试器。

汇编器

  汇编器(assembler)的作用是将用汇编语言编写的源程序转换成二进制形式的目标代码。

链接器

  链接器通常用来将多个目标代码连接成一个可执行代码,这样可以先将整个程序分成几个模块来单独开发,然后才将它们组合(链接)成一个应用程序。使用ld 链接

调试器

  Linux 下调试汇编代码既可以用 GDB、DDD 这类通用的调试器,也可以使用专门用来调试汇编代码的 ALD(Assembly Language Debugger)。

2、AT&T格式

  • 源文件为 .s 后缀
  • Linux 平台的标准汇编器是 GAS,它是 GCC 所依赖的后台汇编工具,通常包含在 binutils 软件包中。GAS 使用标准的 AT&T 汇编语法,可以用来汇编用 AT&T 格式编写的程序。
#输出 hello,world#hello.s .data                    # 数据段声明        msg : .string "Hello, world!\n"                          # 要输出的字符串        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 -o hello.o hello.s

链接

ld -s -o hello hello.o

执行

./hello

这里写图片描述

3、Intel 格式

在 Linux 平台上你同样可以使用 Intel 格式来编写汇编程序。

  • ubuntu 下执行:sudo apt-get install nasm 安装
  • 源代码为 .asm 后缀
  • Linux 平台上另一个经常用到的汇编器是 NASM,它提供了很好的宏指令功能,并能够支持相当多的目标代码格式,包括 bin、a.out、coff、elf、rdf 等。NASM 采用的是人工编写的语法分析器,因而执行速度要比 GAS 快很多,更重要的是它使用的是 Intel 汇编语法,可以用来编译用 Intel 语法格式编写的汇编程序。
; 输出 Hello,World; hello.asm section .data            ; 数据段声明        msg db "Hello, world!", 0xA     ; 要输出的字符串        len equ $ - msg                 ; 字串长度section .text            ; 代码段声明global _start            ; 指定入口函数_start:                  ; 在屏幕上显示一个字符串        mov edx, len     ; 参数三:字符串长度        mov ecx, msg     ; 参数二:要显示的字符串        mov ebx, 1       ; 参数一:文件描述符(stdout)         mov eax, 4       ; 系统调用号(sys_write)         int 0x80         ; 调用内核功能                         ; 退出程序        mov ebx, 0       ; 参数一:退出代码        mov eax, 1       ; 系统调用号(sys_exit)         int 0x80         ; 调用内核功能

编译

 nasm -f elf hello.asm

链接

注:因为nasm只能是i386的,与64位不兼容,所以加 -m elf_i386 参数

ld -m elf_i386 -s -o hello hello.o

详细访问:http://www.ibm.com/developerworks/cn/linux/l-assembly/

0 0
原创粉丝点击