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