2025-1-9-NASM学习一

2025-1-9-NASM学习一

一月 09, 2025

Nasm 1Day

全部代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
extern _printf,_system ;声明外部的 printf 函数
section .data
cmd db 'chcp 65001',0 ; 设置终端的编码
msg db 'Hello,World!', 0;定义字符串常量
newline db 10,0
info_1 db 'qwq,This is my first nasm code',0
info_2 db '这下是中文输出',0
test_1 db 'mkdir 1',0

section .text
global _main ; 设置入口函数为 _main

_main:
push test_1
call _system ; 调用系统参数执行命令

push msg ;将字符串地址推入栈中,作为参数传递给printf
call _printf ;调用prinf 函数
add esp,4 ;清理栈上的参数
push newline
call _printf
add esp,4
push info_1
call _printf
add esp,4

push newline
call _printf
add esp,4

push info_2
call _printf
add esp,4

ret ;函数返回

代码执行:

- 打印 Hello,World! qwq,This is my first nasm code ... 等
- 执行了两个cmd命令 设置编码和创建了名为1的文件夹

代码分段分析

主要分为三个部分

声明部分

1
extern _printf,_system ;声明外部的 printf 函数

定义部分

1
2
3
4
5
6
7
8
9
section .data
cmd db 'chcp 65001',0 ; 设置终端的编码
msg db 'Hello,World!', 0;定义字符串常量
newline db 10,0
info_1 db 'qwq,This is my first nasm code',0
info_2 db '这下是中文输出',0
test_1 db 'mkdir 1',0
section .text
global _main ; 设置入口函数为 _main

执行部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
_main:
push test_1
call _system ; 调用系统参数执行命令

push msg ;将字符串地址推入栈中,作为参数传递给printf
call _printf ;调用prinf 函数
add esp,4 ;清理栈上的参数
push newline
call _printf
add esp,4
push info_1
call _printf
add esp,4

push newline
call _printf
add esp,4

push info_2
call _printf
add esp,4

ret ;函数返回

关键字

extern

作用:

  • 用于声明外部符号
  • 告诉汇编器某个符号在当前之外的文件定义

section

  • 用于指定代码或数据的段,告诉汇编器代码应该放在特定的段中
  • 常见的段有
    • .text(代码段)
    • .data(数据段)
    • .bss(未初始化数据段)

push

  • 该指令将一个值压入栈中
  • 会将操作数(寄存器、立即数、内存中的数据)压入栈并更新栈指针
  • 常用于保存寄存器的值

call

  • 用于调用函数
  • call 将返回地址压入栈中,然后跳转到目标地址
  • 也就是将函数调用后继续执行的地方放到函数的入口点

add

  • 将两个操作数相加 并将结果存储到第一个操作数中
  • 支持将寄存器 立即数 以及内存地址作为操作数

ret

  • 用于从函数返回
  • 执行ret时 会从栈中弹出返回地址 将控制权传递给该地址处的代码(通常是函数调用的下一条指令)

知识点

PE文件节

想了解什么是PE文件的 节 ,先要搞懂什么是PE文件

PE (Portable Executable) 译作:便携式可执行文件

用于

  • 可执行程序
  • 动态链接库
  • 系统驱动程序

等文件格式

PE文件是Windows平台上执行程序的标准格式

基于COFF(Common Object File Format)格式

包含了不同的结构和信息来帮助操作系统 加载、执行、调试程序

是PE文件内部的重要概念

指的是 文件中存储程序代码、数据、资源的区域

每个节都有特定的功能和属性 可以满足不同部分代码和数据的存储需求

PE文件结构简述
  1. DOS头:

    • 标记PE文件开始部分
    • 包含魔数 MZ
    • 包含指向PE头部的指针
  2. PE头:

    • PE文件的结构核心
    • 包含文件格式关键信息
      • 机器平台
      • 目标平台
      • 节表位置
  3. 节表:

    • 记录文件中各个节

      • 位置
      • 大小
      • 属性
      1. 节:
      • 实际存储程序
        • 代码
        • 数据
        • 资源
      • 的区域

节的功能与属性

  • 代码节 .text :包含程序的机器代码,通常 只读可执行

  • 数据节 .data : 包含已初始化的全局变量和静态变量,通常 可读写

  • 未初始化数据节 .bss:包含未初始化的全局变量和静态变量,不占磁盘空间,加载时会被初始化为0

  • 只读数据节.rdata1:存放数据的只读数据,如字符串常量,这部分数据通常是共享的,不允许修改

  • 导入/导出节 .idata.edata:用于动态链接 导入节存储程序所需的外部函数和符号,导出节用于存储程序希望其他程序调用的函数和符号(感觉像头文件)