diff --git a/dios/include/rst/common.hpp b/dios/include/rst/common.hpp
index 44b0eb55d1331ac6a6589cfc847767eaf22cb270..20ff5a46095aa3b8d58b497d8cf09ea3dcf7e1d0 100644
--- a/dios/include/rst/common.hpp
+++ b/dios/include/rst/common.hpp
@@ -195,22 +195,19 @@ namespace __dios::rst::abstract {
     }
 
     template< typename T >
-    _LART_INLINE T * peek_object( void * addr ) noexcept
+    _LART_INLINE T * peek_object( void * addr_ ) noexcept
     {
-        struct { uint32_t off = 0, obj; } ptr;
-        ptr.obj = __vm_peek( addr, _VM_ML_User );
-
-        T * obj;
-        memcpy( &obj, &ptr, sizeof( T * ) );
-        return obj;
+        __vm_pointer_t addr = __vm_pointer_split( addr_ );
+        auto m = __vm_peek( _VM_ML_User, addr.obj, addr.off, 1 );
+        return static_cast< T * >( __vm_pointer_make( m.value, 0 ) );
     }
 
     template< typename T >
-    _LART_INLINE void poke_object( T obj, void * addr ) noexcept
+    _LART_INLINE void poke_object( T obj, void * addr_ ) noexcept
     {
-        struct { uint32_t off, obj; } ptr;
-        memcpy( &ptr, &obj, sizeof( T * ) );
-        __vm_poke( addr, _VM_ML_User, ptr.obj );
+        __vm_pointer_t addr = __vm_pointer_split( addr_ ),
+                       ptr  = __vm_pointer_split( static_cast< void * >( obj ) );
+        __vm_poke( _VM_ML_User, addr.obj, addr.off, 1, ptr.obj );
     }
 
     struct object_t