System API (CPU & Disassembly)
Low-level CPU information, high-precision timing, and full multi-instruction x64 disassembly using Zydis.
📌 Overview
The System API provides:
CPU Information
High-Resolution Performance Timers
x64 Instruction Disassembly using Zydis
Full operand breakdown: registers, memory operands, immediates, pointer operands, etc.
All functions are global inside AngelScript.
📘 Available Functions
🔧 CPU Information
string cpu_vendor()
"AuthenticAMD", "GenuineIntel"
CPU vendor ID
string cpu_brand()
"AMD Ryzen 9 7900X 12-Core Processor"
Human-readable CPU model
⏱ Timing
uint64 rdtsc()
Raw CPU timestamp counter
Fast but CPU-frequency dependent
int64 perf_time()
High-resolution performance counter
Use with perf_frequency()
int64 perf_frequency()
Ticks per second
For converting perf_time → seconds
📌 Example (timing a loop)
int64 freq = perf_frequency();
int64 t0 = perf_time();
for (uint i = 0; i < 1000000; i++) { }
int64 t1 = perf_time();
double dt_sec = double(t1 - t0) / double(freq);
log("Elapsed seconds: " + dt_sec);🧩 Zydis Disassembly API
Functions
void zydis_disasm(const array<uint8>& in bytes, array<dictionary@>& out out_insts)
array<dictionary@>
Full decode starting at RIP=0
void zydis_disasm(const array<uint8>& in bytes, uint64 runtime_rip, array<dictionary@>& out out_insts)
array<dictionary@>
Full decode with custom RIP
Both return a list of instructions, where each item is a dictionary with metadata and operand array.
🧱 Instruction Structure (disasm_instruction_t)
disasm_instruction_t)Each instruction dictionary contains:
"runtime_address"
int64
Instruction RIP
"length"
int64
Size in bytes
"mnemonic"
string
"mov", "push", "lea"
"text"
string
Full Intel disassembly text
"operand_count"
int64
Total operands
"operand_count_visible"
int64
Non-hidden operands
"operands"
array<dictionary@>
List of operand tables
🔍 Operand Structure (operand_t)
operand_t)Each operand dictionary contains:
"id"
int64
0
Operand index
"type"
string
"reg" / "mem" / "imm" / "ptr"
Operand type
"visibility"
string
"explicit" / "hidden"
"size"
int64
64
Bit size
Register operand
"reg_name"
string
"rax", "rcx", "xmm0"
Memory operand
"mem_segment"
string
"ss"
"mem_base"
string
"rbp"
"mem_index"
string
"rax" or ""
"mem_scale"
int64
Scale (1,2,4,8)
"mem_has_displacement"
int64 (0/1)
Whether displacement exists
"mem_displacement"
int64
Signed displacement
Immediate operand
"imm_is_signed"
int64 (0/1)
Signed flag
"imm_is_relative"
int64 (0/1)
Is relative jump?
"imm_value"
int64
Immediate value
"imm_absolute_address"
int64
Computed RIP + relOffset
Pointer operand
"ptr_segment"
int64
"ptr_offset"
int64
🚀 AngelScript Example
This example shows CPU info, timing, and full multi-instruction disassembly — the same script you used for validation.
int main()
{
log("=== AS SYSTEM / ZYDIS FULL TEST START ===");
// CPU info
log("CPU Vendor: " + cpu_vendor());
log("CPU Brand : " + cpu_brand());
// Timing test
int64 freq = perf_frequency();
int64 t0 = perf_time();
uint64 sum = 0;
for (uint i = 0; i < 1000000; i++) sum += i;
int64 t1 = perf_time();
log("perf_frequency (ticks/sec): " + freq);
log("perf_time delta seconds : " + double(t1 - t0) / double(freq));
log("RDTSC: " + rdtsc());
// Example code to disassemble
array<uint8> bytes = {
0x55, // push rbp
0x48, 0x89, 0xE5, // mov rbp, rsp
0x48, 0x83, 0xEC, 0x30 // sub rsp, 0x30
};
array<dictionary@> ins;
zydis_disasm(bytes, 0x140000000, ins);
log("=== ZYDIS TEST (HARDCODED BYTES) ===");
for (uint i = 0; i < ins.length(); i++)
{
dictionary@ inst = ins[i];
int64 addr;
inst.get("runtime_address", addr);
string text;
inst.get("text", text);
log(formatInt(addr, "0x%X") + ": " + text);
}
log("=== AS SYSTEM / ZYDIS FULL TEST END ===");
return 1;
}🔥 Example Output
=== AS SYSTEM / ZYDIS FULL TEST START ===
CPU Vendor: AuthenticAMD
CPU Brand : AMD Ryzen 9 7900X 12-Core Processor
perf_frequency (ticks/sec): 10000000
perf_time delta seconds : 0.0094
RDTSC: 161134003150540
=== ZYDIS TEST (HARDCODED BYTES) ===
0x140000000: push rbp
0x140000001: mov rbp, rsp
0x140000004: sub rsp, 0x30
=== AS SYSTEM / ZYDIS FULL TEST END ===📅 Date & Time API
Provides local date/time information, including readable names, 12-hour formatting, and Unix timestamps.
🧭 Functions
dictionary@ get_datetime()
dictionary@ get_datetime()Returns a dictionary with the following keys:
"year"
int
e.g. 2025
"month"
int
1–12
"day"
int
1–31
"hour"
int
0–23
"minute"
int
0–59
"second"
int
0–59
"msec"
int
0–999
"day_name"
string
"Monday", "Tuesday", ...
"month_name"
string
"January", "February", ...
"hour12"
int
1–12
"ampm"
string
"AM" or "PM"
uint64 get_timestamp()
uint64 get_timestamp()Returns a Unix timestamp in UTC, measured in seconds since 1970-01-01.
🧪 Example: Getting Time & Date
int main()
{
dictionary@ dt = get_datetime();
int year, month, day, hour12, minute;
string dayName, monthName, ampm;
dt.get("year", year);
dt.get("month", month);
dt.get("day", day);
dt.get("hour12", hour12);
dt.get("minute", minute);
dt.get("day_name", dayName);
dt.get("month_name", monthName);
dt.get("ampm", ampm);
log("Today is: " + dayName + ", " + monthName + " " + day + ", " + year);
log("Local Time: " +
hour12 +
":" +
(minute < 10 ? "0" + formatInt(minute) : formatInt(minute)) +
" " + ampm);
uint64 ts = get_timestamp();
log("Unix Timestamp: " + ts);
return 1;
}
Last updated