ubuntu下使用nasm写汇编的尝试与记录

环境说明

用parallels 虚拟器安装的 ubuntu 22.04

parallels@dev:~/temp$ uname -a
Linux dev 5.15.0-52-generic #58-Ubuntu SMP Thu Oct 13 08:03:55 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

汇编与链接

在这里插入图片描述
如上图所示,汇编代码码会经过汇编器汇编成目标文件,然后目标文件再经过链接器链接成可执行文件。
汇编源代码文件有两种格式,一个是unix下的AT$T格式,另一个是window下的Intel格式。PS: unix系统下也可以用intel格式去写汇编代码。
下面将用网络上的源码代做个操作演示

AS 汇编器

专门处理AT&T格式
在这里插入图片描述

NASM汇编器

可以处理两种汇编格式
在这里插入图片描述

操作示例

AT&T示例

代码文件 hello-AT.asm

# AT&T 格式
# 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_AT.o hello-AT.asm
ld -s -o~ hello_AT hello_AT.o
./hello_AT

Intel示例

代码文件 hello-Intel.asm

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

操作指令

// 如果是32位,就是elf
nasm -f elf64 hello-Intel.asm
ld -s -o hello_Intel hello-Intel.o
./hello_Intel

代码目录的文件如下

![在这里插入图片描述](https://img-blog.csdnimg.cn/7041b33b262541a899f8297ff3eb3ed1.png)

参考文档

猜你喜欢

转载自blog.csdn.net/SCHOLAR_II/article/details/127736295