前言:
有时,我们跟Unix/Linux打交道,难免会碰到汇编语言写的的源文件,特别是很多时候C/C++编译器 解析出来的汇编源文件看不懂就一脸懵逼了。于是笔者对常用的命令过一遍。本系列随笔不会深入探讨汇编语言。只是简易介绍一些汇编语言中可能碰到的常用的命令和概念。
Unix/Linux天然集成了汇编语言的编译器nasm,笔者写这遍随笔时用的机器ubuntu x86_64
以下是以一个典型的Hello World程序开遍,在unix/linux使用你最喜欢的编辑器敲入以下代码
/*hello.asm*/
section .data
text db "Hello World",10
section .text
global _start
_start:
mov rax,1
mov rdi,1
mov rsi,text
mov rdx,14
syscall
mov rax,60
mov rdi,0
syscall
编译和连接
/*elf64代表这个是一个64位的汇编程序*/
//编译
nasm -f elf64 -o hello.o hello.asm
//链接
ld hello.o -o hello
语法简单解析
db 是汇编语言中的关键字,代表“定义字节(define bytes)”,类似与C/C++中的字符串序列,它意味着我们将定义一些原始字节数据插入到我们的代码中。
"Hello World",10:这是我们定义的数据字节,文本字符串中的每个字符都是单个字节。“10”是换行符,就是C/C++中的'\ n'字符。
"text":这是一个分配给内存中地址的名称,该名字保存着一个指向字符串序列的内存地址。这类似于C中的指针变量。每当我们在代码中使用“text”时,编译代码时,编译器将检测该数据在内存中的实际位置并替换所有未来 带有该内存地址的“text”实例.
备注:由于我们在汇编语言中无法像C/C++直接使用'\n',所以使用ascii的字符值10表示