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

相关推荐
Web3探索者15 小时前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo17 小时前
Linux系统中网线与USB网络共享冲突
linux
Sokach10152 天前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
AlfredZhao3 天前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3104 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode4 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
A小辣椒6 天前
TShark:Wireshark CLI 功能
linux
A小辣椒6 天前
TShark:基础知识
linux
AlfredZhao6 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao7 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi