Sau khi đọc bài: https://daohainam.com/2021/08/13/cau-chuyen-ve-con-tro-pointer, bạn đã biết biến con trỏ là một số nguyên chứa địa chỉ của một vùng nhớ. Tuy nhiên đôi khi bạn còn nghe về khái niệm con trỏ gần và con trỏ xa (near pointer và far pointer), vậy chúng là gì?
Với các CPU đời cũ thời 16bit (đọc tiếp: 64 bit? 32 bit?), để định vị được đến tất cả các địa chỉ trong bộ nhớ, CPU dùng cơ chế segment:offset. Như đã đọc trong bài con trỏ, nếu thanh ghi địa chỉ có kích thước 16 bit, nó chỉ có thể chứa một địa chỉ từ 0-65535 (64KB), một biến con trỏ khi đó cũng chỉ chứa được một địa chỉ trong phạm vi tương tự.
Tuy nhiên, các CPU này lại có tới 20 đường địa chỉ, tức là giữa CPU và MCU (Memory Control Unit) có tới 20 “sợi dây điện” (gọi vậy cho dễ hình dung :D, đặt tên là A0-A19), do vậy CPU có thể gửi 1 con số lớn tới 20 bit đến MCU mỗi khi nó cần đọc/ghi 1 giá trị trong bộ nhớ. Vì một thanh ghi chỉ có kích thước 16 bit, do vậy nếu muốn lưu lại một địa chỉ, CPU phải kết hợp 2 thanh ghi lại với nhau. Người ta chia bộ nhớ thành từng phân đoạn (segment), mỗi segment sẽ bắt đầu tại một địa chỉ cách nhau 16 byte (1). Như vậy, segment 0 bắt đầu từ địa chỉ 0, segment 1 bắt đầu từ địa chỉ 16, segment 2 bắt đầu từ 32… và cứ như vậy.
Continue reading “Con trỏ gần, con trỏ xa”