• Thứ Năm, 12/06/2008 17:44 (GMT+7)

    Lập trình đọc - hiển thị - thay đổi nội dung một ô nhớ với địa chỉ ô nhớ đã biết

    Câu hỏi :
    Đề nghị hướng dẫn lập trình đọc - hiển thị - thay đổi nội dung một ô nhớ với địa chỉ ô nhớ đã biết. 
     

    Trả lời :
    Bộ nhớ của 1 phần mềm là danh sách nhiều ô nhớ liên tiếp, mỗi ô nhớ dài 1 byte (8 bit) được nhận dạng thông qua địa chỉ của nó (đánh số từ 0 - ô nhớ đầu tiên - đến n). Tùy vào hệ điều hành mà bộ nhớ của ứng dụng là bộ nhớ thật (bộ nhớ RAM) hay là bộ nhớ ảo (luận lý). Trên Windows, mỗi chương trình có bộ nhớ luận lý riêng biệt và độc lập gồm tối đa 4G ô nhớ được đánh địa chỉ từ 0 đến 4GB-1, mỗi chương trình chỉ có thể truy xuất các ô nhớ trong bộ nhớ luận lý của riêng mình. Thí dụ, ta có 2 chương trình P1 và P2 đang chạy đồng thời, P1 truy xuất ô nhớ địa chỉ 3000 thì không ảnh hưởng gì đến ô nhớ 3000 của P2 và ô nhớ RAM 3000.

     Nếu dùng ngôn ngữ máy hay assembly, ta có thể truy xuất nội dung từng ô nhớ chương trình bằng địa chỉ của ô nhớ đó. Nếu dùng ngôn ngữ cấp cao, ta ít khi quan tâm trực tiếp đến địa chỉ ô nhớ mà chỉ quan tâm đến việc truy xuất dữ liệu của ứng dụng thông qua tên biến gợi nhớ. Thí dụ trong 1 chương trình được viết bằng ngôn ngữ VC++, có 1 biến "tuoi" thuộc kiểu dữ liệu "long", ta có thể truy xuất nội dung biến "tuoi" thông qua các phát biểu gán dễ đọc và dễ hiểu như:

     long tuoi;
     //hiệu chỉnh nội dung biến tuoi
     tuoi = 20;
     //đọc nội dung biến tuoi và hiển thị lên màn hình
     printf("Giá trị biến tuoi hiện hành là : %ld\n",tuoi);
     Thực ra biến "tuoi" thuộc kiểu "long" trên VC++ sẽ được đặt ở 1 vùng nhớ gồm 4 ô nhớ liên tiếp từ địa chỉ luận lý &tuoi, (&tuoi)+1,(&tuoi)+2, (&tuoi)+3. Do đó nếu muốn truy xuất nội dung từng ô nhớ của chương trình bằng ngôn ngữ C hay C++, ta có thể dùng các lệnh sau:
     unsigned char *ptuoi;
     ptuoi = (unsigned char *)&tuoi;
     //hiển thị 4 địa chỉ của 4 ô nhớ chứa biến tuoi
     printf("Biến tuoi nằm ở 4 ô nhớ từ 0x%.8lx tới 0x%.8lx\n", ptuoi, ptuoi+3);
     //đọc nội dung ô nhớ &tuoi và hiển thị lên màn hình
     printf("Nội dung Ô nhớ 0x%.8lx = %d\n",ptuoi, *ptuoi);
     printf("Nội dung Ô nhớ 0x%.8lx = %d\n",ptuoi+1, *(ptuoi+1));
     printf("Nội dung Ô nhớ 0x%.8lx = %d\n",ptuoi+2, *(ptuoi+2));
     printf("Nội dung Ô nhớ 0x%.8lx = %d\n",ptuoi+3, *(ptuoi+3));
     //hiệu chỉnh nội dung ô nhớ có địa chỉ &tuoi
     *ptuoi = 1;
     *(ptuoi+1) = 2;
     *(ptuoi+2) = 3;
     *(ptuoi+3) = 4;
     //đọc nội dung biến tuoi và hiển thị lên màn hình
     printf("Giá trị biến tuoi hiện hành là : 0x%.8lx = %ld\n",tuoi,tuoi); 
    Chuyên mục: Lập trình