首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >从一个简单的汇编程序学习汇编程序的结构以及编译链接的过程

从一个简单的汇编程序学习汇编程序的结构以及编译链接的过程

作者头像
Elapse
发布2020-08-17 11:41:57
发布2020-08-17 11:41:57
1.9K0
举报
文章被收录于专栏:E条咸鱼E条咸鱼

本篇原创作者:Rj45

由于大部分的pwn都是在Linux平台下的,故下面所涉及到的汇编都是在Linux平台下的汇编。

汇编指令和伪指令

在汇编语言源程序中,包含两种指令,一种是汇编指令,一种是伪指令。汇编指令是有对应机器码的指令,可以被编译为机器指令,最终被CPU执行。伪指令没有对应的机器指令,最终不被CPU执行,而是被编译器执行,编译器根据伪指令进行相关的编译工作。

汇编程序的结构

一个linux平台下的汇编程序的结构如下:

代码语言:javascript
复制
global _start
section .data
section .bss
section .text
_start:
    ...
    ...

1、伪指令 global_start

global是告诉编译器,其后是全局可见的名字【变量或函数名】。

_start是一个函数的起始地址,也是编译链接后程序的起始地址, _start必须定义为全局的,以便存在于编译后的全局符号表中。

2、伪指令 .section.data

section.data是数据段的开始,数据段中要列出程序数据和其所需要的所有内存存储空间。

3、伪指令 section.bss

section.bss是声明全局变量的,其内声明的变量,不会包含在可执行程序中,而是在一个内存区域被保留在运行时候使用。

4、伪指令 section.text

section.text是文本段,也是存放程序汇编指令的部分。

5、例子 下面为一个打印hello,world的汇编程序

代码语言:javascript
复制
global _start

section .data
    msg db "hello,world",0xa   ;设置要输出的字符
    len equ $ - msg            ;$代表当前行的内存地址,$ - msg 代表msg的长度

section .text

_start:                         ;链接器从这里开始执行
    mov eax,4
    mov ebx,1
    mov ecx,msg
    mov edx,len
    int 0x80
    mov eax,1
    mov ebx,0
    int 0x80

_start后的汇编指令代码下期详细介绍。

编译链接的过程

1、过程 在编译链接的过程中,第一步是使用汇编编译程序nasm(linux)将源程序编译为目标文件, 然后再用链接程序ld(linux)对目标文件进行链接,生成可在操作系统中直接执行的可执行文件。

2、命令 编译

代码语言:javascript
复制
nasm -f elf32 hello.asm -o hello.o
nasm -f elf64 hello.asm -o hello.o

链接

代码语言:javascript
复制
ld -m elf_i386 hello.o -o hello//使用elf_i386链接器
ld -m elf_x86_64 hello.o -o hello//使用elf_x86_64链接器

3、例子

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 E条咸鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 汇编指令和伪指令
  • 汇编程序的结构
  • 编译链接的过程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档