一、预备知识
1.汇编语言基础
汇编语言是能直接转换成机器语言的语言,由高级语言编译生成,不同体系架构的计算机所能执行的汇编语言不同。
(1)寄存器
寄存器名 | 说明 | 功能 |
---|---|---|
eax: | 累加器 | 加法乘法指令的缺省寄存器 |
ecx: | 计数器 | REP&LOOP指令的内定计数器 |
esp: | 栈顶指针寄存器 | SS:ESP当前堆栈的栈顶指针 |
ebp: | 栈底指针寄存器 | SS:EBP当前堆栈的栈底指针 |
eip: | 指令寄存器 | CS:EIP指向下一条指令的地址 |
(2)汇编指令
命令 | 解释 |
---|---|
PUSH | %esp -= 4; movl %REG, (%esp) |
POP | movl (%esp), %REG; %esp += 4 |
JMP | movl addr, %eip |
CALL | pushl %eip; %eip =address; |
RET | popl %eip |
2.Linux进程地址空间布局
- 程序通常包含代码块和数据块,这些代码和数据本身都是静态的
程序想要运行,首先要由操作系统负责为其创建进程,并在进程的虚拟地址空间中为其代码块和数据块建立映射
进程在运行过程中还要有静态环境,其中最重要的就是堆栈
- HighestZone:保存进程环境参数和进程参数
- 栈:存储函数参数、本地参数和栈状态变量,向低地址增长
- 堆:动态分配变量(malloc),向高地址增长
- .bss:未初始化的数据
- .test:指令,只读数据
二、示例代码
#include <stdio.h>
int function(int a,int b,int c){
char buffer[14];
int sum;
int *ret;
ret = (int*) (buffer +20);
(*ret)+=8;
sum = a+b+c;
return sum;
}
void main(){
int x;
x=0;
function(1,2,3);
x=1;
printf("%d\n",x);
}
三、执行步骤
1.编译源代码文件test.c