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

相关推荐
刚入门的大一新生9 分钟前
Linux-线程概念
linux·jvm
H.莓飛18 分钟前
【数据结构】排序总结与规模实测
linux·服务器·开发语言·数据结构·visual studio·1024程序员节
Zenova EdgeOS44 分钟前
Linux 日志实战:用 journalctl 精准检索与治理工业边缘日志
linux·运维·chrome
Dxy12393102161 小时前
Linux 压缩解压相关命令介绍
linux·运维·服务器
eleven_4u1 小时前
QPS如何计算,如何部署架构
java·linux·运维·jvm·中间件
东城居士2 小时前
理解Linux RTC驱动
linux·嵌入式系统
蘑菇小白2 小时前
Linux多线程开发
linux·开发语言·线程
Ruiery2 小时前
Linux 6.6内核内存管理深度解析(十):KSM 同页合并 — 内容去重,把 N 份相同内存合并成 1 份
linux·运维·服务器
Huangjin007_2 小时前
【Linux 系统篇(三十三)】通信(三):System V 共享内存详解
linux·运维·服务器
叼烟扛炮3 小时前
Linux 学习笔记(三十八):从实模式到分页——处理器内存管理的发展史
linux·运维·服务器