Linux内核学习-汇编笔记

rax 返回值

eax

rcx

循环次数

this指针

rsi source

rdi destination

__fastcall传参,快速调用传参

xor eax, eax

mov eax, 0x0a

add eax, 1

mov ebp-8, eax //写回内存

xor eax, eax

xor ebx, ebx

mov eax, 10

mov ebx, 1

add eax, ebx

nasm\masm 结果存在左边

att 结果存在右边

编译优化

玩转汇编执行流

统一内存语义协议栈

伪指令:org、section、bits

特殊符号:$

org 定义一个锚点

ORG 0x7c00

SECTON .text

BITS 16

global _start //C语言和汇编互调

times 510-(-$) db 0

db 0x55,0xaa

$$ 所在段的起始位置

代码段 .text

数据段

赋值的全局数据区 .data

未赋值的全局数据区 .bss

CPU的两种运行模式:实模式、保护模式

汇编的注释是:

主板在运行os时,默认从MBR读数据,执行权交给MBR区域的代码

bios中断:0x10输出

boot loader ->setup ->装在os内核 ->实模式 ->保护模式

实模式下的内存布局

7C00~7DFF,512B,MBR被BIOS加载到此处

7E00~9FBFF,608KB,可用区域

1~3FF,1KB,中断向量表

bochs 调试汇编,默认停在bios程序入口位置。

Linux源码-启动流程

操作系统真相还原

cmake是一个命令工具,可用来生成makefile。但也要根据CMakeLists.txt中的内容生成,CMakeLists.txt就是写给cmake的规则。

Makefile是一个文件,make执行时,去读取Makefile文件中的规则。

函数调用前后,栈是不变的

esp 栈顶

ebp 栈底

堆栈执行流:

char code\[\] = {

0x55,

0x**,

0x5d,

0xc3}

//创建一块可读可写可执行的内存区域

temp = mmap()

memcpy(temp, code,sizeof(code))

p_fun fun = temp

return fun()

栈 递减 由大地址向小地址递减

esp指向栈顶

mov esp, REAL_MODE_STACK_BASE

栈帧重叠

eip 指令寄存器

jmp

jmp SETUP_ADDR_BASE 段内跳 短跳

jmp CODE_SELECTOR:KERNEL_ADDR 跨段跳 长跳

jcc

call

把call指令的下一条指令地址压入栈

再跳转

ret

void test(){

int a = 10;

if (10==a){

a=100;

}

a=1000;

}

// 第一个局部变量放在ebp-8的位置,

tmain:

call test

test:

push ebp

mov ebp, esp

mov ebp-8,10

mov eax, ebp-8

cmp eax, 10

jne .s1

mov ebp-8,100

.sl:

mov ebp -8, 1000

leave

ret

相关推荐
不能跑的代码不是好代码1 小时前
Linux系统常用命令中文速查表
linux·运维·服务器
石一峰6992 小时前
深入理解 Linux 中断三层机制与 1-Wire 时序锁原理
linux·运维·服务器
无限码农3 小时前
Linux上通过cmake编译uchardet
linux·运维·服务器
运维大师4 小时前
【Linux运维极简教程】06-网络配置与管理
linux·运维
探索云原生6 小时前
终于搞懂 Kueue:5 个核心对象一次讲透
linux·docker·ai·云原生·kubernetes
An_s7 小时前
机器学习python之识别图中物品信息
java·linux·开发语言
Championship.23.248 小时前
Linux 3.0 LVDS驱动开发详解
linux·运维·驱动开发·lvds
风向决定发型丶9 小时前
Shell中的特殊变量
linux·运维·bash
mounter6259 小时前
走向长时运行:引入协程(Coroutines),打破 BPF 程序的“一堂到底”限制
linux·ebpf·kernel
运维大师9 小时前
【Linux运维极简教程】05-软件包管理
linux·运维·服务器