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

相关推荐
Mapleay10 分钟前
创建 Linux SDK包源码阅读环境
linux·运维·服务器
hong781711 分钟前
阿里coding plan qwen3.6-plus 不支持图片上下文长度只有200K,问题出在哪?
linux·运维·数据库
rebekk12 分钟前
claude工作区与git仓库的关系
linux·git·python
Skilce26 分钟前
K8S部署
linux·运维·服务器·容器·kubernetes
重生的黑客38 分钟前
Linux :vim 深入与 gcc 编译详解
linux·运维·vim
屈九歌39 分钟前
【Linux】V4L2框架分析《四》media_controller
linux
小成2023032026541 分钟前
Linux高级03
linux·开发语言
南境十里·墨染春水1 小时前
linux学习进展 进程
linux·运维·学习
cyber_两只龙宝1 小时前
【Oracle】Oracle之DQL中SELECT的基础使用
linux·运维·服务器·数据库·云原生·oracle
云栖梦泽1 小时前
Linux内核与驱动:10.平台总线platform
linux