核心热路径(数学/内存/字符串/性能分析)用MASM汇编(SSE/AVX2) 外围系统(窗口/渲染/ECS/音频/UI/脚本)用C语言 含自研编辑器、VisualScript积木编程、中文渲染(glyph_atlas)
178 lines
4.4 KiB
NASM
178 lines
4.4 KiB
NASM
; ============================================================================
|
|
; memory.asm - 对齐内存分配器 (x86-64 MASM)
|
|
; 支持 16/32/64 字节对齐 (SIMD 需要)
|
|
; ============================================================================
|
|
|
|
include asm_macros.inc
|
|
|
|
.DATA
|
|
ALIGN 16
|
|
_alloc_header_size EQU 32 ; 分配头大小 (包含对齐偏移和原始指针)
|
|
|
|
.CODE
|
|
|
|
; ============================================================================
|
|
; 对齐内存分配
|
|
; ============================================================================
|
|
|
|
; void* mem_aligned_alloc(uint64_t size, uint64_t alignment)
|
|
; RCX = size, RDX = alignment
|
|
; 返回: RAX = 对齐指针
|
|
mem_aligned_alloc PROC
|
|
push rbx
|
|
push rdi
|
|
push rsi
|
|
sub rsp, 40 ; 保留栈空间
|
|
|
|
mov rbx, rcx ; rbx = size
|
|
mov rdi, rdx ; rdi = alignment
|
|
|
|
; 验证 alignment 是 2 的幂
|
|
mov rax, rdi
|
|
dec rax
|
|
test rdi, rax
|
|
jnz alloc_invalid_alignment
|
|
|
|
; 确保 alignment >= 16
|
|
cmp rdi, 16
|
|
jae alloc_alignment_ok
|
|
mov rdi, 16
|
|
|
|
alloc_alignment_ok:
|
|
; 需要的总大小 = size + alignment + header
|
|
mov rax, rbx
|
|
add rax, rdi ; + alignment
|
|
add rax, _alloc_header_size ; + header
|
|
mov rsi, rax ; rsi = total size
|
|
|
|
; 调用 malloc
|
|
mov rcx, rsi
|
|
call malloc
|
|
test rax, rax
|
|
jz alloc_failed
|
|
|
|
; rax = 原始指针
|
|
; 计算对齐后的地址
|
|
mov rcx, rax
|
|
add rcx, _alloc_header_size ; 跳过 header
|
|
; 对齐
|
|
mov rdx, rdi
|
|
dec rdx
|
|
not rdx
|
|
add rcx, rdx ; 加上 alignment-1
|
|
and rcx, rdx ; 对齐到 alignment
|
|
|
|
; rcx = 对齐后的指针
|
|
; 在对齐指针前存储原始指针
|
|
mov [rcx - 8], rax ; 存储原始 malloc 指针
|
|
mov [rcx - 16], rbx ; 存储请求的 size
|
|
mov [rcx - 24], rdi ; 存储 alignment
|
|
mov [rcx - 32], rsi ; 存储 total size
|
|
|
|
mov rax, rcx ; 返回对齐指针
|
|
jmp alloc_done
|
|
|
|
alloc_invalid_alignment:
|
|
xor rax, rax ; 返回 NULL
|
|
jmp alloc_done
|
|
|
|
alloc_failed:
|
|
xor rax, rax
|
|
|
|
alloc_done:
|
|
add rsp, 40
|
|
pop rsi
|
|
pop rdi
|
|
pop rbx
|
|
ret
|
|
mem_aligned_alloc ENDP
|
|
|
|
; void mem_aligned_free(void* ptr)
|
|
; RCX = ptr (对齐指针)
|
|
mem_aligned_free PROC
|
|
test rcx, rcx
|
|
jz free_done
|
|
|
|
; 获取原始 malloc 指针
|
|
mov rax, [rcx - 8]
|
|
test rax, rax
|
|
jz free_done
|
|
|
|
; 调用 free
|
|
mov rcx, rax
|
|
call free
|
|
|
|
free_done:
|
|
ret
|
|
mem_aligned_free ENDP
|
|
|
|
; void* mem_aligned_realloc(void* ptr, uint64_t size, uint64_t alignment)
|
|
; RCX = ptr, RDX = size, R8 = alignment
|
|
; 返回: RAX = 新对齐指针
|
|
mem_aligned_realloc PROC
|
|
push rbx
|
|
push rdi
|
|
push rsi
|
|
push r12
|
|
sub rsp, 40
|
|
|
|
mov rbx, rdx ; rbx = new size
|
|
mov rdi, r8 ; rdi = alignment
|
|
|
|
; 如果 ptr 为 NULL, 直接分配
|
|
test rcx, rcx
|
|
jz realloc_alloc
|
|
|
|
; 保存旧信息
|
|
mov rsi, [rcx - 8] ; 原始指针
|
|
mov r12, [rcx - 16] ; 旧 size
|
|
|
|
; 分配新内存
|
|
mov rcx, rbx
|
|
mov rdx, rdi
|
|
call mem_aligned_alloc
|
|
test rax, rax
|
|
jz realloc_failed
|
|
|
|
; 复制旧数据 (取较小值)
|
|
mov rdx, r12
|
|
cmp rdx, rbx
|
|
jbe realloc_copy_ok
|
|
mov rdx, rbx
|
|
|
|
realloc_copy_ok:
|
|
mov rdi, rax ; 保存新指针
|
|
mov rcx, rax ; dst
|
|
; rsi = 旧数据起始
|
|
mov rsi, [rcx - 8] ; 旧原始指针
|
|
; 需要获取旧的对齐偏移
|
|
; 简化: 直接复制
|
|
call fast_memcpy
|
|
|
|
; 释放旧内存
|
|
mov rcx, rsi
|
|
call mem_aligned_free
|
|
|
|
mov rax, rdi ; 返回新指针
|
|
jmp realloc_done
|
|
|
|
realloc_alloc:
|
|
mov rcx, rbx
|
|
mov rdx, rdi
|
|
call mem_aligned_alloc
|
|
jmp realloc_done
|
|
|
|
realloc_failed:
|
|
xor rax, rax
|
|
|
|
realloc_done:
|
|
add rsp, 40
|
|
pop r12
|
|
pop rsi
|
|
pop rdi
|
|
pop rbx
|
|
ret
|
|
mem_aligned_realloc ENDP
|
|
|
|
END
|