Từ 1 tới 1 trên tổng số 1 kết quả

Đề tài: Con trỏ và bộ nhớ trong lập trình C for DOS

  1. #1
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mặc định Con trỏ và bộ nhớ trong lập trình C for DOS

    Lâu nay có nhiều người mới làm quen với lập trình thường hay gặp khó khăn khi tiếp xúc với khái niệm con trỏ. Do đó mục tiêu của bài tút này là giúp những ai còn lơ mơ về con trỏ sẽ cảm thấy thông suốt hơn. Phạm vi của bài tút này nói đến là các khái niệm về con trỏ trong mô hình bộ nhớ của dos, trong win có khác một chút tuy nhiên nền tảng cũng vẫn là như vậy. Bài tút xin phép bắt đầu.

    Trước hết các bạn cần phải nắm về cách mà dos quản lý bộ nhớ. Dos quản lý bộ nhớ theo chế độ thực, tức là dùng 24 bit để đánh địa chỉ. Do đó dẫu các bạn có gắn ram 4 gb đi nữa thì dos vẫn chỉ có thể thấy được 1 mb đầu tiên thôi. Do chế độ thực chỉ sử dụng các thanh ghi 16 bit nên để mô tả đuợc địa chỉ 24 bit thì người ta phải chia địa chỉ đó ra làm segment và offset. Theo đó địa chỉ được tính như sau :
    address = segment * 8 + offset
    và địa chỉ đuợc ký hiệu là Segment:Offset
    Thành phần segment được chứa trong các thanh ghi segment là CS, DS, SS, ES. Thanh ghi CS là lưu segment của vùng nhớ chứa đoạn mã của chương trình đang chạy, ngoài ra trong vùng nhớ này còn lưu thêm tất cả các hằng số có trong chương trình. Thanh ghi DS lưu segment của vùng nhớ heap của chương trình, trong vùng nhớ này sẽ lưu các biến toàn cục và các vùng nhớ cấp phát động.
    SS là thanh ghi lưu segment của vùng nhớ chứa stack hệ thống. Thường thì SS = DS do vùng nhớ chứa bíên chạy từ 0 trở lên còn stack lại chạy từ 0xFFFF trở xuống. Thanh ghi ES trong bài tút này chúng ta chưa cần quan tâm.

    Bây giờ mèo xin tiếp tục với phần con trỏ. Vậy con trỏ là gì ? Con trỏ là một bíên lưu địa chỉ của bíên khác. Nói cho cùng thì con trỏ đơn giản là một số kiểu long mà thôi. Giá trị của bíên long này là địa chỉ của bíên khác. Do mô hình bộ nhớ như mình đã trình bày ở trên nên mới có 2 lại con trỏ : con trỏ gần ( near pointer ) và con trỏ xa ( far pointer ). Con trỏ near chỉ dùng 2 byte thấp trong số 4 byte của kiểu long để lưu địa chỉ offset, segment thì được mặc định là thanh ghi DS. Con trỏ xa dùng cả 4 byte của nó để lưu địa chỉ : 2 byte thấp lưu offset và 2 byte cao lưu segment. Để cho dễ hiểu, mình xin phép cho một ví dụ :
    Giả sử ta có bíên a kiểu long nằm tại địa chỉ là 0x80FF:0x3000
    Con trỏ gần sẽ lưu : 0x00003000, segment tự hiểu là DS
    Con trỏ xa sẽ lưu : 0x80FF3000

    Trong C mảng thật ra cũng là một bíên con trỏ kiểu hằng. Biến mảng sẽ lưu địa chỉ của phần tử đầu tiên của mảng. Địa chỉ của các phần tử tíêp theo sẽ đuợc tính theo cách :
    address = address0 + index * sizeof (type)
    trong đó address0 là địa chỉ của phần tử đầu tiên.

    Bài tút kỳ này xin chấm dứt ở đây, hẹn các bạn trong các bài tút tiếp theo về ngắt và buffer màn hình và cấp phát động.

    Bài 2: Cấp phát động và chống memory leak trong lập trình C
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 06-11-2008 lúc 03:07 PM.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn