最近在学习x86_64汇编,简单的写了个hello world,用strace跟踪和c语言对比,发现果然还是汇编简单粗暴
section .data hello db 'Hello, World!',0 ; 字符串以null结尾 section .text global _start _start: ; 调用write系统调用 (syscall) 来写入字符串到标准输出 (文件描述符 1) mov rax, 1 ; 系统调用号: 1 (write) mov rdi, 1 ; 文件描述符: 1 (标准输出) mov rsi, hello ; 字符串的地址 mov rdx, 13 ; 字符串的长度 syscall ; 调用exit系统调用 (syscall) 来退出程序 mov rax, 60 ; 系统调用号: 60 (exit) xor rdi, rdi ; 退出码: 0 syscall
接下来需要下载asm汇编器和ld链接器,一般这两个ubuntu会预装,或者gcc顺带着
sudo apt-get updata sudo apt-get install nasm nasm -v sudo apt install binutils ld -v
接下来需要用汇编器将汇编代码装换成二进制文件,再用链接器连接到同一个执行文件
nasm -f elf64 -o hello.o hello.asm ld -o hello hello.o
接下来直接执行./hello
execve是用来执行一个新程序的系统调用,可以看到,整个过程就执行了一个write和一个exit ,我们来就看一下c语言
这里面主要是调用一些动态库(用mmap),最后还是调用write 来进行写入。
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!