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