В реальном режиме процессора всё адресное пространство делится на одинаковые сегменты размером 65536 байт (
2
16
{\displaystyle 2^{16}} байт). Начало каждого последующего сегмента (так называемая База сегмента) смещено относительно базы предыдущего на минимальный размер сегмента, то есть на 16 байт (т. н. параграф). Таким образом, сегменты могут частично перекрывать друг друга. (Например, байт 17 сегмента 2 — это также и байт
1
=
17
−
16
{\displaystyle 1=17-16} сегмента 3, и байт
33
=
17
+
16
{\displaystyle 33=17+16} сегмента 1.)
База сегмента) смещено относительно базы предыдущего на минимальный размер сегмента, то есть на 16 байт (т. н. параграф). Таким образом, сегменты могут частично перекрывать друг друга.
let TEST = 123;
let test = &TEST;
let test2 = test as *const i32;
let test3 = test2 as usize;
println!("{} {}", test3, test3);
let dataAddr: *mut u32 = usize::from_str_radix(&format!("{test3:X}"), 16).unwrap() as *mut u32;
println!("{dataAddr:?}");
unsafe {
let data = core::ptr::read_volatile(dataAddr);
println!("{data}{test3:X}");
}