- 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
181 lines
4.7 KiB
NASM
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
|