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
- hello,world初学汇编
- extjs初学hello world
- 汇编hello world
- 汇编的HELLO WORLD!
- 汇编 Hello World
- 汇编的hello world
- 汇编hello world
- 汇编 Hello World
- 汇编hello world!
- 汇编-Hello world!
- 汇编的“Hello World!”
- 汇编写出"hello world!"
- 汇编hello world
- Hello World 汇编语言版
- hello world linux汇编
- 汇编Hello World
- 初学汇编--Hello Wrod
- 初学汇编--Hello Wrod
- JNI初体验
- jQuery提交数据给php,serialize()方法提交所有数据,不发生页面跳转
- NYOJ 179 LK‘problem
- IO流与异常
- Java servlet 之过滤器Filter详解
- hello,world初学汇编
- java实现堆排序
- linux日志系统syslog
- 浅谈Android的三种数据持久化技术之数据库存储
- 关于邮箱的三种协议POP3、SMTP和IMAP
- 常用的Linux操作
- 并发基础(1)
- java中的&与&&
- 黑马程序员-java基础-内部类