Linux汇编语言编译

Linux中汇编的使用

    • 一、安装nasm编译器
    • 二、编译过程简介
    • 三、编译实例

一、安装nasm编译器

输入以下命令安装nasm编译器

sudo apt install nasm

Linux汇编语言编译_第1张图片

二、编译过程简介

1、预处理
预处理的过程主要包括以下过程:
(1) 将所有的#define 删除,并且展开所有的宏定义,并且处理所有的条件预编 译指令,比如#if #ifdef #elif #else #endif 等。
(2) 处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置。
(3) 删除所有注释“//”和“/* */”。
(4) 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
(5) 保留所有的#pragma 编译器指令,后续编译过程需要使用它们。

2、编译
就是对预处理完的文件进行一系列的词法分析,语法分析,语义分析及 优化后生成相应的汇编代码。

3、汇编
汇编过程调用对汇编代码进行处理,生成处理器能识别的指令,保存在后缀为.o
的目标文件中。由于每一个汇编语句几乎都对应一条处理器指令,因此,汇编相
对于编译过程比较简单,通过调用 Binutils 中的汇编器 as 根据汇编指令和处理
器指令的对照表一一翻译即可。
当程序由多个源代码文件构成时,每个文件都要先完成汇编工作,生成.o 目标 文件后,才能进入下一步的链接工作。注意:目标文件已经是最终程序的某一部 分了,但是在链接之前还不能执行。

4、链接
链接到静态库或动态库,可参考另一篇文档
https://blog.csdn.net/zmhDD/article/details/109100294

三、编译实例

1、编辑文档 hello.asm

; 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         ; 调用内核功能

2、先生成中间 .o 文件

nasm -f elf64 hello.asm

Linux汇编语言编译_第2张图片
3、生成可执行文件

ld -s -o hello hello.o

在这里插入图片描述
4、执行结果
在这里插入图片描述

你可能感兴趣的:(linux)