0%

NASM训练 - Lesson1 - 输出HelloWorld

Hello, world!

NASM训练 - Lesson1 - 输出HelloWorld

原版地址

NASM Assembly Language Tutorials - Lesson 1

需求

.data 段中创建一个名为 msg 的变量,并且为其分配我们想要输出的字符串HelloWorld
.text 段中标记_start标签来告诉内核此处为程序的入口函数

我们使用sys_write在控制台中输出信息,同时Linux System Call Table分配了OpCode 4给这个函数。

  • EAX承载了OpCode,告诉系统要执行什么函数

这个函数还使用了其他三个寄存器来承载参数:

  • EBX承载了写出的对象,也就是STDOUT
  • ECX承载了要写出的内容所在的地址,也就是我们创建的msg对象的地址
  • EDX承载了我们要输出的字符串的长度

随后编译并执行即可

实现

源码

1
2
3
4
5
6
7
8
9
10
11
section .data				; .data段声明 - 数据段
msg db 'HelloWorld',0xA ; 创建一个变量,名为msg,大小为1字节,内容为字符串,即数组,最后加了换行符

section .text ; .text段声明 - 代码段
global _start ; 声明入口函数 - _start
_start: ; 声明_start函数
mov eax, 0x4 ; 将eax置4,调用sys_write
mov ebx, 1 ; 将ebx置1,STDOUT
mov ecx, msg ; 将ecx置msg的地址,指定输出内容
mov edx, 11 ; 将edx置11,指定输出内容的长度
int 80h ; 触发System Call

编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌─[✗]─[[email protected]]─[~/Desktop/assemble/Lessons/1]
└──╼ $nasm -f elf64 source.asm -o source.o
┌─[✗]─[[email protected]]─[~/Desktop/assemble/Lessons/1]
└──╼ $ld -m elf_x86_64 source.o -o hw
┌─[[email protected]]─[~/Desktop/assemble/Lessons/1]
└──╼ $ll
total 20K
drwxr-xr-x 1 kami kami 40 5月 13 10:59 ./
drwxr-xr-x 1 kami kami 2 5月 13 10:34 ../
-rwxr-xr-x 1 kami kami 8.7K 5月 13 10:59 hw*
-rw-r--r-- 1 kami kami 143 5月 13 10:45 source.asm
-rw-r--r-- 1 kami kami 832 5月 13 10:59 source.o
┌─[[email protected]]─[~/Desktop/assemble/Lessons/1]
└──╼ $

执行

1
2
3
4
5
6
┌─[[email protected]]─[~/Desktop/assemble/Lessons/1]
└──╼ $./hw
HelloWorld
Segmentation fault
┌─[✗]─[[email protected]]─[~/Desktop/assemble/Lessons/1]
└──╼ $