Files
lity3d/Engine/ASM/memory.asm
T
shuiyu1123 0669d102ce feat: major engine overhaul - scene demo with lighting, sphere, ground
- Scene Demo: cube + sphere + ground plane with proper lighting
- Audio: XAudio2 dynamic loading + WAV playback
- Physics: expanded collision system
- Renderer: improved pipeline with materials
- UI: extended widget system
- VisualScript: enhanced serializer + block interactions
- ASM: optimized math/memory/profiling routines
- Window: mouse input + scroll support
2026-07-12 08:21:07 +08:00

181 lines
4.7 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, 56 ; shadow + 3 saved qwords
mov rbx, rdx ; rbx = new size
mov rdi, r8 ; rdi = alignment
; 如果 ptr 为 NULL, 直接分配
test rcx, rcx
jz realloc_alloc
; 保存旧信息
mov [rsp + 32], rcx ; 旧对齐指针(即用户数据起始)
mov rax, [rcx - 8]
mov [rsp + 24], rax ; 旧原始 malloc 指针
mov rax, [rcx - 16]
mov [rsp + 16], rax ; 旧 size
; 分配新内存
mov rcx, rbx
mov rdx, rdi
call mem_aligned_alloc
test rax, rax
jz realloc_failed
mov rsi, rax ; rsi = 新对齐指针
; 复制旧数据 (取较小值)
mov rdx, [rsp + 16] ; 旧 size
cmp rdx, rbx
jbe realloc_copy_ok
mov rdx, rbx
realloc_copy_ok:
; fast_memcpy(dst, src, count): rcx=dst, rdx=src, r8=count
mov rcx, rsi
mov r8, rdx
mov rdx, [rsp + 32] ; 旧对齐指针
call fast_memcpy
; 释放旧内存(使用原始 malloc 指针)
mov rcx, [rsp + 24]
call mem_aligned_free
mov rax, rsi ; 返回新指针
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, 56
pop r12
pop rsi
pop rdi
pop rbx
ret
mem_aligned_realloc ENDP
END