Menu English Ukrainian Tiếng Nga Trang Chủ

Thư viện kỹ thuật miễn phí cho những người có sở thích và chuyên gia Thư viện kỹ thuật miễn phí


Ghi chú bài giảng, phiếu đánh giá
Thư viện miễn phí / Cẩm nang / Ghi chú bài giảng, phiếu đánh giá

Tin học và công nghệ thông tin. Cheat sheet: ngắn gọn, quan trọng nhất

Ghi chú bài giảng, phiếu đánh giá

Cẩm nang / Ghi chú bài giảng, phiếu đánh giá

Bình luận bài viết Bình luận bài viết

Mục lục

  1. Tin học. Thông tin
  2. Biểu diễn các số trong máy tính. Khái niệm chính thức về một thuật toán
  3. Giới thiệu về Pascal
  4. Các thủ tục và chức năng tiêu chuẩn
  5. Toán tử ngôn ngữ Pascal
  6. Khái niệm về một thuật toán phụ trợ
  7. Các thủ tục và hàm trong Pascal
  8. Chuyển tiếp mô tả và kết nối các chương trình con. Chỉ thị
  9. Tham số chương trình con
  10. Các kiểu tham số chương trình con
  11. Kiểu chuỗi trong Pascal. Thủ tục và hàm cho các biến kiểu chuỗi
  12. Entries
  13. Bộ
  14. Các tập tin. Hoạt động tệp
  15. Mô-đun. Các loại mô-đun
  16. Kiểu dữ liệu tham khảo. bộ nhớ động. biến động. Làm việc với bộ nhớ động
  17. Cấu trúc dữ liệu trừu tượng
  18. Ngăn xếp
  19. Hàng đợi
  20. Cấu trúc dữ liệu cây
  21. Hoạt động trên cây
  22. Ví dụ về triển khai hoạt động
  23. Khái niệm về đồ thị. Các cách biểu diễn đồ thị
  24. Các biểu diễn đồ thị khác nhau
  25. Kiểu đối tượng trong Pascal. Khái niệm về một đối tượng, mô tả và sử dụng nó
  26. Kế thừa
  27. Tạo đối tượng
  28. Các thành phần và phạm vi
  29. Phương pháp
  30. Bộ tạo và bộ hủy
  31. Kẻ hủy diệt
  32. Phương pháp ảo
  33. Các trường dữ liệu đối tượng và các tham số phương thức chính thức
  34. Инкапсуляя cải
  35. Mở rộng đối tượng
  36. Tương thích loại đối tượng
  37. Giới thiệu về trình biên dịch
  38. Mô hình phần mềm vi xử lý
  39. Người dùng đăng ký
  40. Sổ đăng ký mục đích chung
  41. đăng ký phân đoạn
  42. Thanh ghi trạng thái và điều khiển
  43. Đăng ký hệ thống vi xử lý
  44. Đăng ký điều khiển
  45. Đăng ký địa chỉ hệ thống
  46. Đăng ký gỡ lỗi
  47. Cấu trúc chương trình lắp ráp
  48. Hợp ngữ cú pháp
  49. Chỉ thị phân đoạn
  50. Cấu trúc hướng dẫn máy
  51. Các phương pháp xác định toán hạng lệnh
  52. Các phương pháp giải quyết
  53. Các lệnh truyền dữ liệu
  54. Lệnh số học
  55. Lệnh logic
  56. Điều khiển các lệnh chuyển

1. Khoa học máy tính. Thông tin

Đại diện và xử lý / thông tin. Hệ thống số

Tin học tham gia vào việc biểu diễn chính thức các đối tượng và cấu trúc các mối quan hệ của chúng trong các lĩnh vực khoa học, công nghệ và sản xuất khác nhau. Các công cụ chính thức khác nhau được sử dụng để mô hình hóa các đối tượng và hiện tượng, chẳng hạn như công thức logic, cấu trúc dữ liệu, ngôn ngữ lập trình, v.v.

Trong khoa học máy tính, một khái niệm cơ bản như thông tin có nhiều nghĩa khác nhau:

1) trình bày chính thức các dạng thông tin bên ngoài;

2) ý nghĩa trừu tượng của thông tin, nội dung bên trong, ngữ nghĩa của nó;

3) mối quan hệ của thông tin với thế giới thực.

Nhưng, như một quy luật, thông tin được hiểu theo nghĩa trừu tượng của nó - ngữ nghĩa. Nếu chúng ta muốn chia sẻ thông tin, chúng ta cần có quan điểm nhất quán để tính đúng đắn của việc diễn giải không bị vi phạm. Để làm điều này, việc giải thích biểu diễn thông tin được xác định với một số cấu trúc toán học. Trong trường hợp này, việc xử lý thông tin có thể được thực hiện bằng các phương pháp toán học nghiêm ngặt.

Một trong những mô tả toán học của thông tin là biểu diễn của nó dưới dạng một hàm

y = f (x, t)

t là thời gian,

x là một điểm trong một số trường mà giá trị của y được đo. Tùy thuộc vào các tham số hàm x và t, thông tin có thể được phân loại.

Nếu các tham số là đại lượng vô hướng nhận một chuỗi giá trị liên tục, thì thông tin thu được theo cách này được gọi là liên tục (hoặc tương tự). Nếu các tham số được đưa ra một bước thay đổi nhất định, thì thông tin được gọi là rời rạc. Thông tin rời rạc được coi là phổ biến.

Thông tin rời rạc thường được xác định với thông tin kỹ thuật số, đây là một trường hợp đặc biệt của thông tin ký hiệu của biểu diễn chữ cái. Bảng chữ cái là một tập hợp hữu hạn các ký hiệu có tính chất bất kỳ. Rất thường xuyên trong khoa học máy tính, một tình huống phát sinh khi các ký tự của một bảng chữ cái này phải được biểu diễn bằng các ký tự của bảng chữ cái khác, tức là phải thực hiện một thao tác mã hóa.

Như thực tế đã chỉ ra, bảng chữ cái đơn giản nhất cho phép bạn mã hóa các bảng chữ cái khác là nhị phân, bao gồm hai ký tự, thường được ký hiệu là 0 và 1. Sử dụng n ký tự của bảng chữ cái nhị phân, bạn có thể mã hóa 2n ký tự và như vậy là đủ để mã hóa bất kỳ bảng chữ cái nào.

Giá trị có thể được biểu diễn bằng ký hiệu của bảng chữ cái nhị phân được gọi là đơn vị thông tin hoặc bit tối thiểu. Dãy 8 bit - byte. Một bảng chữ cái chứa 256 chuỗi 8 bit khác nhau được gọi là bảng chữ cái byte.

Hệ thống số là một tập hợp các quy tắc đặt tên và viết số. Có hệ thống số vị trí và không vị trí.

Hệ thống số được gọi là có vị trí nếu giá trị của chữ số của số phụ thuộc vào vị trí của chữ số trong số. Nếu không, nó được gọi là nonpositional. Giá trị của một số được xác định bởi vị trí của các chữ số này trong số.

2. Biểu diễn số trong máy tính. Khái niệm chính thức về một thuật toán

Bộ xử lý 32-bit có thể hoạt động với RAM lên đến 232-1 và địa chỉ có thể được ghi trong dải 00000000 - FFFFFFFF. Tuy nhiên, ở chế độ thực, bộ xử lý hoạt động với bộ nhớ lên đến 220-1 và các địa chỉ nằm trong khoảng 00000 - FFFFF. Các byte bộ nhớ có thể được kết hợp thành các trường có độ dài cố định và thay đổi. Một từ là một trường độ dài cố định bao gồm 2 byte, một từ kép là một trường 4 byte. Địa chỉ trường có thể chẵn hoặc lẻ, với các địa chỉ chẵn thực hiện các thao tác nhanh hơn.

Số điểm cố định được biểu diễn trong máy tính dưới dạng số nhị phân nguyên và kích thước của chúng có thể là 1, 2 hoặc 4 byte.

Số nhị phân số nguyên được biểu diễn trong phần bù của hai. Mã phần bù của một số dương bằng chính số đó và mã phần bù của một số âm có thể nhận được theo công thức sau:

x = 10n - \ x \, trong đó n là độ sâu bit của số.

Trong hệ thống số nhị phân, một mã bổ sung có được bằng cách đảo các bit, tức là thay thế các đơn vị bằng các số không và ngược lại, và thêm một mã vào bit ít quan trọng nhất.

Số bit của phần định trị xác định độ chính xác của việc biểu diễn số, số bit thứ tự máy xác định phạm vi biểu diễn của số dấu phẩy động.

Khái niệm chính thức về một thuật toán

Thuật toán chỉ có thể tồn tại nếu đồng thời tồn tại một số đối tượng toán học. Khái niệm chính thức hóa của một thuật toán được kết nối với khái niệm hàm đệ quy, thuật toán Markov thông thường, máy Turing.

Trong toán học, một hàm được gọi là có giá trị đơn nếu, đối với bất kỳ tập đối số nào, có một luật mà theo đó giá trị duy nhất của hàm được xác định. Một thuật toán có thể hoạt động như một luật như vậy; trong trường hợp này, hàm được cho là có thể tính toán được.

Các hàm đệ quy là một lớp con của các hàm có thể tính toán được và các thuật toán xác định tính toán được gọi là các thuật toán hàm đệ quy đồng hành. Đầu tiên, các hàm đệ quy cơ bản được cố định, trong đó thuật toán đi kèm là nhỏ, không rõ ràng; sau đó ba quy tắc được giới thiệu - các toán tử thay thế, đệ quy và tối thiểu hóa, với sự trợ giúp của các hàm đệ quy phức tạp hơn trên cơ sở các hàm cơ bản.

Các chức năng cơ bản và các thuật toán đi kèm của chúng có thể là:

1) một hàm gồm n biến độc lập, giống hệt nhau bằng không. Khi đó, nếu dấu của hàm là φn, thì bất kể số đối số là bao nhiêu, giá trị của hàm phải được đặt bằng XNUMX;

2) hàm đồng nhất của n biến độc lập có dạng Ψ ni. Sau đó, nếu dấu của hàm là Ψ ni, thì giá trị của hàm phải được lấy làm giá trị của đối số thứ i, đếm từ trái sang phải;

3) λ-hàm của một đối số độc lập. Sau đó, nếu dấu của hàm là λ, thì giá trị của hàm phải được coi là giá trị theo sau giá trị của đối số.

3. Giới thiệu về ngôn ngữ Pascal

Các ký hiệu cơ bản của ngôn ngữ - chữ cái, số và các ký tự đặc biệt - tạo nên bảng chữ cái của nó. Ngôn ngữ Pascal bao gồm tập hợp các ký hiệu cơ bản sau:

1) 26 chữ thường Latinh và 26 chữ hoa Latinh:

2) _ (gạch dưới);

3) 10 chữ số: 0 1 2 3 4 5 6 7 8 9;

4) dấu hiệu hoạt động:

+ - Ơ / = <> <> <=> =: = @;

5) ограничители:., ( ) [ ] (..) { } (* *).. : ;

6) các thông số: ^ # $;

7) từ dịch vụ (dành riêng): ABSOLUTE, ASSEMBLER, AND, ARRAY, ASM, BEGIN, CASE, CONST, CONADING, DESTRUCTOR, DIV, DO, DOWNTO, ELSE, END, EXPORT, EXTERNAL, FAR, FILE, FOR, FORWARD, FUNCTION, GOTO, IF, IMPERITED, IN, INDEX, INHERITED, INLINE, INTERFACE, INTERRUPT, LABEL, LIBRARY, MOD, NAME, NIL, NEAR, NOT, OBJECT, OF, OR, PACKED, PRIVATE, PROTEST,

CHƯƠNG TRÌNH, CÔNG KHAI, GHI, LẶP LẠI, LƯU TRỮ, BỘ,

SHL, SHR, CHUỖI, SAU ĐÓ, ĐẾN, LOẠI, ĐƠN VỊ, CHO ĐẾN KHI, SỬ DỤNG,

VAR, ẢO, KHI, VỚI, XOR.

Ngoài những ký tự được liệt kê, tập hợp các ký tự cơ bản bao gồm một khoảng trắng.

Có một quy tắc trong Pascal: kiểu được chỉ định rõ ràng trong khai báo của một biến hoặc hàm trước khi sử dụng nó. Khái niệm kiểu Pascal có các thuộc tính chính sau:

1) bất kỳ kiểu dữ liệu nào xác định một tập hợp các giá trị mà một hằng số thuộc về, mà một biến hoặc biểu thức có thể nhận, hoặc một phép toán hoặc hàm có thể tạo ra;

2) loại giá trị được cung cấp bởi một hằng số, biến hoặc biểu thức có thể được xác định bằng hình thức hoặc mô tả của chúng;

3) mỗi hoạt động hoặc hàm yêu cầu đối số kiểu cố định và tạo ra kết quả kiểu cố định.

Có các kiểu dữ liệu vô hướng và có cấu trúc trong Pascal. Kiểu vô hướng bao gồm kiểu chuẩn và kiểu do người dùng xác định. Các kiểu tiêu chuẩn bao gồm các kiểu số nguyên, thực, ký tự, boolean và địa chỉ.

Kiểu số nguyên xác định các hằng số, biến và hàm có giá trị được nhận ra bởi tập hợp các số nguyên được phép trong một máy tính nhất định.

Pascal có ưu tiên toán tử sau:

1) các phép tính trong ngoặc đơn;

2) tính toán các giá trị của hàm;

3) các phép toán một ngôi;

4) các phép toán * / div mod và;

5) các phép toán + - hoặc xor;

6) các phép toán quan hệ = <> <> <=> =.

4. Các thủ tục và chức năng tiêu chuẩn

Các hàm số học

1. chức năng Abs (X); trả về giá trị tuyệt đối của tham số.

2. Hàm ArcTan (X: Extended): Extended; trả về tiếp tuyến cung của đối số.

3. Hàm Exp (X: Real): Real; trả về số mũ.

4.Frac (X: Real): Thực; trả về phần phân số của đối số.

5. Hàm Int (X: Real): Thực; trả về phần nguyên của đối số.

6. Function Ln(X: Real): Real; возвращает натуральный логарифм (Ln е = 1) выражения x вещественного типа.

7. Chức năng Pi: Mở rộng; trả về giá trị Pi, được định nghĩa là 3.1415926535.

8.Function Sin (X: Extended): Mở rộng; trả về sin của đối số.

9.Function Sqr (X: Extended): Mở rộng; trả về bình phương của đối số.

10.Function Sqrt (X: Extended): Extended; trả về căn bậc hai của đối số.

Các thủ tục và chức năng chuyển đổi giá trị

1. Thủ tục Str (X [: Width [: Decimals]]; var S); chuyển đổi số X thành biểu diễn chuỗi.

2. Function Chr(X: Byte): Char; возвращает символ с порядковым номером x в ASCII-таблице.

3. hàm cao (X); trả về giá trị lớn nhất trong phạm vi của tham số.

4.FunctionLow (X); trả về giá trị nhỏ nhất trong phạm vi của tham số.

5. Chức năng Ord (X): LongInt; trả về giá trị thứ tự của một biểu thức kiểu liệt kê.

6. Vòng chức năng (X: Extended): LongInt; làm tròn một giá trị thực thành một số nguyên.

7. Hàm Trunc (X: Extended): LongInt; cắt bớt một giá trị kiểu thực thành một số nguyên.

8. Thủ tục Val (S; var V; var Code: Integer); chuyển đổi một số từ giá trị chuỗi S thành biểu diễn số V.

Các thủ tục và chức năng giá trị thông thường

1. Thủ tục Dec (var X [; N: LongInt]); trừ một hoặc N khỏi biến X.

2. Thủ tục Inc (var X [; N: LongInt]); thêm một hoặc N vào biến X.

3. Hàm Odd (X: LongInt): Boolean; trả về True nếu X là số lẻ, False ngược lại.

4.FunctionPred (X); trả về giá trị trước đó của tham số.

5 Hàm Succ (X); trả về giá trị tham số tiếp theo.

5. Các toán tử ngôn ngữ Pascal

Điều hành có điều kiện

Định dạng của câu lệnh điều kiện hoàn chỉnh được định nghĩa như sau:

Nếu B thì S1 khác S2

trong đó B là điều kiện phân nhánh (ra quyết định), một biểu thức logic hoặc một quan hệ; S1, S2 - một câu lệnh thực thi, đơn giản hoặc kết hợp.

Khi thực hiện một câu lệnh điều kiện, trước tiên biểu thức B được đánh giá, sau đó kết quả của nó được phân tích: nếu B đúng, thì câu lệnh S1 được thực hiện - nhánh của then, và câu lệnh S2 bị bỏ qua; nếu B sai, thì câu lệnh S2 - nhánh khác được thực thi và câu lệnh S1 bị bỏ qua.

Chọn câu lệnh

Cấu trúc toán tử như sau:

trường hợp S của

c1: hướng dẫn1;

c2: hướng dẫn2;

hữu ích. Cảm ơn !

cn: hướng dẫnN;

hướng dẫn khác

kết thúc;

trong đó S là một biểu thức kiểu thứ tự có giá trị đang được tính toán;

c1, c2,..., on - константы порядкового типа, с которыми сравниваются выражения S; instructionl,..., instructionN - операторы, из которых выполняется тот, с константой которого совпадает значение выражения S;

lệnh - một toán tử được thực thi nếu giá trị của biểu thức S không khớp với bất kỳ hằng số c1, o2, on.

Câu lệnh lặp với tham số

Khi câu lệnh for bắt đầu thực thi, giá trị bắt đầu và kết thúc được xác định một lần và những giá trị này được giữ lại trong suốt quá trình thực thi câu lệnh for. Câu lệnh chứa trong phần thân của câu lệnh for được thực thi một lần cho mỗi giá trị trong phạm vi giữa giá trị bắt đầu và giá trị kết thúc. Bộ đếm vòng lặp luôn được khởi tạo giá trị ban đầu.

Câu lệnh lặp với điều kiện tiên quyết

Trong khi B do S;

trong đó B là một điều kiện logic, sự thật của nó được kiểm tra (nó là điều kiện để kết thúc vòng lặp) $;

S - phần thân của vòng lặp - một câu lệnh. Biểu thức điều khiển việc lặp lại một câu lệnh phải thuộc kiểu Boolean. Nó được đánh giá trước khi câu lệnh bên trong được thực thi. Câu lệnh bên trong được thực thi lặp đi lặp lại miễn là biểu thức đánh giá là Trie. Nếu biểu thức được đánh giá là Sai ngay từ đầu, thì câu lệnh chứa trong câu lệnh lặp điều kiện trước sẽ không được thực hiện.

Câu lệnh lặp với điều kiện sau

lặp lại S cho đến khi B;

trong đó B là một điều kiện logic, sự thật của nó được kiểm tra (nó là điều kiện để kết thúc vòng lặp);

S - một hoặc nhiều câu lệnh nội dung vòng lặp. Kết quả của biểu thức phải thuộc kiểu boolean. Các câu lệnh được bao gồm giữa các từ khóa lặp lại và cho đến khi được thực hiện tuần tự cho đến khi kết quả của biểu thức đánh giá là Đúng. Chuỗi câu lệnh sẽ được thực hiện ít nhất một lần vì biểu thức được đánh giá sau mỗi lần thực hiện chuỗi câu lệnh.

6. Khái niệm về thuật toán bổ trợ

Một thuật toán để giải quyết một vấn đề được thiết kế bằng cách phân tách toàn bộ vấn đề thành các nhiệm vụ con riêng biệt. Thông thường, các nhiệm vụ con được thực hiện dưới dạng chương trình con.

Chương trình con là một số thuật toán bổ trợ được sử dụng lặp đi lặp lại trong thuật toán chính với các giá trị khác nhau của một số đại lượng đến, được gọi là tham số.

Chương trình con trong ngôn ngữ lập trình là một chuỗi các câu lệnh chỉ được định nghĩa và viết ở một nơi trong chương trình, nhưng chúng có thể được gọi để thực thi từ một hoặc nhiều điểm trong chương trình. Mỗi chương trình con được xác định bằng một tên duy nhất.

Có hai loại chương trình con trong Pascal là thủ tục và hàm. Một thủ tục và một hàm là một chuỗi các khai báo và câu lệnh được đặt tên. Khi sử dụng các thủ tục hoặc hàm, chương trình phải chứa văn bản của thủ tục hoặc hàm và một lệnh gọi đến thủ tục hoặc hàm. Các tham số được chỉ định trong mô tả được gọi là hình thức, những tham số được chỉ định trong lệnh gọi chương trình con được gọi là thực tế. Tất cả các tham số chính thức có thể được chia thành các loại sau:

1) tham số-biến;

2) các tham số không đổi;

3) tham số-giá trị;

4) tham số thủ tục và tham số chức năng, tức là tham số kiểu thủ tục;

5) tham số biến không định kiểu.

Các văn bản của các thủ tục và hàm được đặt trong phần mô tả các thủ tục và hàm.

Truyền tên thủ tục và hàm làm tham số

Trong nhiều bài toán, đặc biệt là trong toán học tính toán, cần phải chuyển tên của các thủ tục và hàm làm tham số. Để làm điều này, TURBO PASCAL đã giới thiệu một kiểu dữ liệu mới - thủ tục hoặc chức năng, tùy thuộc vào những gì được mô tả. (Các kiểu thủ tục và hàm được mô tả trong phần khai báo kiểu.)

Một hàm và kiểu thủ tục được định nghĩa là tiêu đề của một thủ tục và một hàm có danh sách các tham số chính thức nhưng không có tên. Có thể xác định một hàm hoặc kiểu thủ tục mà không có tham số, ví dụ:

kiểu

Proc = thủ tục;

Sau khi khai báo một kiểu thủ tục hoặc chức năng, nó có thể được sử dụng để mô tả các tham số chính thức - tên của các thủ tục và hàm. Ngoài ra, cần phải viết các thủ tục hoặc hàm thực đó mà tên sẽ được truyền dưới dạng các tham số thực tế.

7. Các thủ tục và hàm trong Pascal

Các thủ tục trong Pascal

Mô tả của thủ tục bao gồm một tiêu đề và một khối, ngoại trừ phần kết nối mô-đun, không khác với khối chương trình. Tiêu đề bao gồm từ khóa Thủ tục, tên của thủ tục và danh sách tùy chọn các tham số chính thức trong dấu ngoặc đơn:

Thủ tục <tên> [(<danh sách các tham số hình thức>)];

Đối với mỗi tham số hình thức, kiểu của nó phải được xác định. Các nhóm tham số trong mô tả thủ tục được phân tách bằng dấu chấm phẩy.

Cấu trúc của thủ tục gần như hoàn toàn tương tự như chương trình. Tuy nhiên, không có phần kết nối mô-đun trong khối thủ tục. Khối bao gồm hai phần: mô tả và điều hành. Phần mô tả chứa mô tả về các phần tử của thủ tục. Và trong phần điều hành, các hành động được chỉ ra với các phần tử chương trình có sẵn cho thủ tục (ví dụ, các biến toàn cục và hằng số), cho phép thu được kết quả cần thiết. Phần hướng dẫn của một thủ tục khác với phần hướng dẫn của một chương trình chỉ ở chỗ từ khóa End kết thúc phần đó được theo sau bởi dấu chấm phẩy thay vì dấu chấm.

Một câu lệnh gọi thủ tục được sử dụng để gọi một thủ tục. Nó bao gồm tên của thủ tục và danh sách các đối số được đặt trong dấu ngoặc đơn. Các câu lệnh được thực thi khi thủ tục được chạy được chứa trong phần câu lệnh của mô-đun thủ tục.

Đôi khi bạn muốn một thủ tục gọi chính nó. Cách gọi này được gọi là đệ quy. Đệ quy hữu ích trong trường hợp nhiệm vụ chính có thể được chia thành các nhiệm vụ phụ, mỗi nhiệm vụ được thực hiện theo một thuật toán trùng với thuật toán chính.

Các hàm trong Pascal

Một khai báo hàm xác định một phần của chương trình trong đó giá trị được tính và trả về. Mô tả chức năng bao gồm một tiêu đề và một khối. Tiêu đề chứa từ khóa Hàm, tên của hàm, danh sách tùy chọn các tham số hình thức được đặt trong dấu ngoặc đơn và kiểu trả về của hàm. Giao diện chung của tiêu đề hàm như sau:

Hàm <tên> [(<danh sách các tham số hình thức>)]: <kiểu trả về>;

Trong quá trình triển khai Borland của Turbo Pascal 7.0, giá trị trả về của một hàm không được thuộc kiểu kết hợp. Và ngôn ngữ Object Pascal được sử dụng trong môi trường phát triển tích hợp Borland Delphi cho phép bất kỳ loại kết quả trả về nào, ngoại trừ loại tệp.

Khối chức năng là một khối cục bộ, có cấu trúc tương tự như một khối thủ tục. Phần thân của một hàm phải chứa ít nhất một lệnh gán, ở phía bên trái của nó là tên của hàm. Chính cô ấy là người xác định giá trị được trả về bởi hàm. Nếu có một số lệnh như vậy, thì kết quả của hàm sẽ là giá trị của lệnh gán được thực thi cuối cùng.

Chức năng được kích hoạt khi chức năng được gọi. Khi một hàm được gọi, mã định danh hàm và bất kỳ tham số nào cần thiết để đánh giá hàm đều được chỉ định. Một lời gọi hàm có thể được đưa vào biểu thức như một toán hạng. Khi biểu thức được đánh giá, hàm được thực thi và giá trị của toán hạng trở thành giá trị được trả về bởi hàm.

Phần toán tử của khối chức năng chỉ định các câu lệnh phải được thực hiện khi chức năng được kích hoạt. Mô-đun phải chứa ít nhất một câu lệnh gán giá trị cho một định danh hàm. Kết quả của hàm là giá trị cuối cùng được gán. Nếu không có câu lệnh gán như vậy hoặc nếu nó chưa được thực thi, thì giá trị trả về của hàm là không xác định.

Nếu một định danh hàm được sử dụng khi gọi một hàm trong mô-đun - một hàm, thì hàm được thực thi đệ quy.

8. Chuyển tiếp mô tả và kết nối các chương trình con. Chỉ thị

Một chương trình có thể chứa một số chương trình con, tức là cấu trúc của chương trình có thể phức tạp. Tuy nhiên, các chương trình con này có thể ở cùng một mức lồng nhau, vì vậy khai báo chương trình con phải đến trước, sau đó mới đến lệnh gọi nó, trừ khi sử dụng một khai báo chuyển tiếp đặc biệt.

Một khai báo thủ tục có chứa một chỉ thị chuyển tiếp thay vì một khối câu lệnh được gọi là một khai báo chuyển tiếp. Tại một số thời điểm sau khai báo này, một thủ tục phải được định nghĩa bằng một khai báo xác định. Một khai báo xác định là một khai báo sử dụng cùng một mã định danh thủ tục nhưng bỏ qua danh sách các tham số chính thức và bao gồm một khối câu lệnh. Khai báo chuyển tiếp và khai báo xác định phải xuất hiện trong cùng một phần của khai báo thủ tục và chức năng. Giữa chúng, các thủ tục và hàm khác có thể được khai báo có thể tham chiếu đến thủ tục khai báo chuyển tiếp. Do đó, có thể đệ quy lẫn nhau.

Mô tả chuyển tiếp và mô tả xác định là mô tả hoàn chỉnh của quy trình. Thủ tục được coi là được mô tả bằng cách sử dụng mô tả chuyển tiếp.

Nếu chương trình chứa khá nhiều chương trình con thì chương trình sẽ không còn trực quan, khó điều hướng trong đó. Để tránh điều này, một số quy trình được lưu trữ dưới dạng tệp nguồn trên đĩa và nếu cần, chúng được kết nối với chương trình chính ở giai đoạn biên dịch bằng cách sử dụng chỉ thị biên dịch.

Chỉ thị là một nhận xét đặc biệt có thể được đặt ở bất kỳ đâu trong chương trình, nơi có thể là một nhận xét bình thường. Tuy nhiên, chúng khác nhau ở chỗ chỉ thị có một ký hiệu đặc biệt: ngay sau dấu ngoặc đóng mà không có dấu cách, dấu $ được viết, và sau đó, một lần nữa, không có dấu cách, chỉ thị được chỉ ra.

Ví dụ:

1) {$ E +} - mô phỏng bộ đồng xử lý toán học;

2) {$ F +} - tạo kiểu gọi các thủ tục và hàm;

3) {$ N +} - sử dụng bộ đồng xử lý toán học;

4) {$ R +} - kiểm tra xem các phạm vi có nằm ngoài giới hạn hay không.

Một số công tắc biên dịch có thể chứa một tham số, ví dụ:

{$ I tên tệp} - bao gồm tệp đã đặt tên trong văn bản của chương trình đã biên dịch

9. Các tham số của chương trình con

Mô tả của một thủ tục hoặc hàm chỉ định một danh sách các tham số chính thức. Mỗi tham số được khai báo trong danh sách tham số chính thức là cục bộ của thủ tục hoặc hàm đang được mô tả và có thể được tham chiếu bởi định danh của nó trong mô-đun được liên kết với thủ tục hoặc hàm đó.

Có ba loại tham số: giá trị, biến và biến không định kiểu. Chúng được đặc trưng như sau:

1. Nhóm tham số không có từ khóa đứng trước là danh sách các tham số giá trị.

2. Một nhóm tham số đứng trước từ khóa const và theo sau là một kiểu là danh sách các tham số không đổi.

3. Một nhóm tham số đứng trước từ khóa var và theo sau là một kiểu là danh sách các tham số biến.

Tham số giá trị

Tham số giá trị chính thức được coi như một biến cục bộ của thủ tục hoặc hàm, ngoại trừ việc nó nhận giá trị ban đầu từ tham số thực tương ứng khi thủ tục hoặc hàm được gọi. Những thay đổi mà tham số giá trị chính thức trải qua không ảnh hưởng đến giá trị của tham số thực. Giá trị thực tương ứng của tham số giá trị phải là một biểu thức và giá trị của nó không được là một loại tệp hoặc bất kỳ kiểu cấu trúc nào có chứa một loại tệp.

Tham số thực tế phải có kiểu được gán tương thích với kiểu của tham số giá trị chính thức. Nếu tham số là kiểu chuỗi, thì tham số hình thức sẽ có thuộc tính kích thước là 255.

Tham số không đổi

Trong phần thân của một chương trình con, giá trị của một tham số không đổi không thể thay đổi được. Tham số-hằng số có thể được sử dụng để sắp xếp những tham số mà những thay đổi trong chương trình con là không mong muốn và cần bị cấm.

Tham số biến

Một tham số biến được sử dụng khi một giá trị phải được truyền từ chương trình con đến một khối đang gọi. Trong trường hợp này, khi chương trình con được gọi, tham số chính thức được thay thế bằng đối số biến và bất kỳ thay đổi nào đối với tham số chính thức đều được phản ánh trong đối số.

Các biến thủ tục

Sau khi xác định một kiểu thủ tục, có thể mô tả các biến của kiểu này. Các biến như vậy được gọi là các biến thủ tục. Giống như biến số nguyên có thể được gán giá trị kiểu số nguyên, biến thủ tục có thể được gán giá trị kiểu thủ tục. Tất nhiên, giá trị có thể là một biến thủ tục khác, nhưng nó cũng có thể là một định danh thủ tục hoặc hàm. Trong ngữ cảnh này, việc khai báo một thủ tục hoặc hàm có thể được xem như một mô tả của một loại hằng số đặc biệt có giá trị là thủ tục hoặc hàm.

Như với bất kỳ phép gán nào khác, các giá trị của biến ở phía bên trái và phía bên phải phải tương thích với phép gán. Các kiểu thủ tục, để tương thích với phép gán, phải có cùng số lượng tham số và các tham số ở các vị trí tương ứng phải cùng kiểu. Tên tham số trong khai báo kiểu thủ tục không có hiệu lực.

Ngoài ra, để đảm bảo tính tương thích của phép gán, một thủ tục hoặc hàm, nếu nó được gán cho một biến thủ tục, không được chuẩn hoặc lồng vào nhau.

10. Các loại tham số của chương trình con

Tham số giá trị

Một tham số giá trị chính thức được coi như một biến cục bộ; nó nhận giá trị ban đầu từ tham số thực tương ứng khi thủ tục hoặc hàm được gọi. Những thay đổi mà tham số giá trị chính thức trải qua không ảnh hưởng đến giá trị của tham số thực. Giá trị thực tương ứng của tham số giá trị phải là một biểu thức và giá trị của nó không được thuộc loại tệp.

Tham số không đổi

Các tham số hằng chính thức nhận giá trị của chúng khi một thủ tục hoặc hàm được gọi. Không được phép gán cho một tham số hằng chính thức. Một tham số hằng chính thức không thể được truyền dưới dạng tham số thực tế cho một thủ tục hoặc hàm khác.

Tham số biến

Một tham số biến được sử dụng khi một giá trị phải được truyền từ một thủ tục hoặc hàm đến chương trình gọi. Khi được kích hoạt, biến tham số chính thức được thay thế bằng biến thực tế, các thay đổi đối với biến tham số chính thức được phản ánh trong tham số thực tế.

Tham số không định dạng

Khi tham số hình thức là một tham số biến không định kiểu, thì tham số thực tế tương ứng có thể là một tham chiếu biến hoặc hằng số. Một tham số không định kiểu được khai báo với từ khóa var có thể được sửa đổi, trong khi một tham số không định kiểu được khai báo với từ khóa const là chỉ đọc.

Các biến thủ tục

Sau khi xác định một kiểu thủ tục, có thể mô tả các biến của kiểu này. Các biến như vậy được gọi là các biến thủ tục. Một biến thủ tục có thể được gán một giá trị của một kiểu thủ tục.

Thủ tục hoặc hàm khi chuyển nhượng phải là:

1) không tiêu chuẩn;

2) không được lồng vào nhau;

3) không phải là một thủ tục kiểu nội tuyến;

4) không bằng thủ tục ngắt.

Các tham số kiểu thủ tục

Vì các kiểu thủ tục có thể được sử dụng trong bất kỳ ngữ cảnh nào, nên có thể mô tả các thủ tục hoặc hàm lấy các thủ tục và hàm làm tham số. Các tham số kiểu thủ tục đặc biệt hữu ích khi bạn cần thực hiện một số hành động phổ biến trên nhiều thủ tục hoặc hàm.

Nếu một thủ tục hoặc hàm được truyền dưới dạng tham số, thì nó phải tuân theo các quy tắc tương thích cùng kiểu với phép gán. Có nghĩa là, các thủ tục hoặc hàm như vậy phải được biên dịch với chỉ thị xa, chúng không thể là hàm dựng sẵn, chúng không thể lồng vào nhau và không thể mô tả chúng bằng các thuộc tính nội tuyến hoặc ngắt.

11. Kiểu chuỗi trong Pascal. Thủ tục và hàm cho các biến kiểu chuỗi

Một chuỗi các ký tự có độ dài nhất định được gọi là một chuỗi. Các biến kiểu chuỗi được xác định bằng cách chỉ định tên của biến, chuỗi từ dành riêng và tùy chọn, nhưng không nhất thiết, chỉ định kích thước tối đa, tức là độ dài của chuỗi, trong dấu ngoặc vuông. Nếu bạn không đặt kích thước chuỗi tối đa, thì theo mặc định, nó sẽ là 255, tức là chuỗi sẽ bao gồm 255 ký tự.

Mỗi phần tử của một chuỗi có thể được tham chiếu bằng số của nó. Tuy nhiên, đầu vào và đầu ra của chuỗi được thực hiện như một tổng thể chứ không phải từng phần tử, như trường hợp của mảng. Số lượng ký tự được nhập không được vượt quá số ký tự được chỉ định trong kích thước chuỗi tối đa, vì vậy nếu sự vượt quá đó xảy ra, thì các ký tự "thừa" sẽ bị bỏ qua.

Thủ tục và hàm cho các biến kiểu chuỗi

1. Chức năng Copy (S: String; Index, Count: Integer): String;

Trả về một chuỗi con của một chuỗi. S là một biểu thức của kiểu String. Index và Count là các biểu thức kiểu số nguyên. Hàm trả về một chuỗi chứa các ký tự Đếm bắt đầu từ vị trí Chỉ mục. Nếu Index lớn hơn độ dài của S, hàm trả về một chuỗi rỗng.

2. Thủ tục Delete (var S: String; Index, Count: Integer);

Loại bỏ một chuỗi ký tự con có độ dài Đếm khỏi chuỗi S, bắt đầu từ vị trí Chỉ mục. S là một biến kiểu String. Index và Count là các biểu thức kiểu số nguyên. Nếu Index lớn hơn độ dài của S, không có ký tự nào bị xóa.

3. Thủ tục Insert (Nguồn: String; var S: String; Index: Integer); Nối một chuỗi con thành một chuỗi, bắt đầu từ một vị trí được chỉ định. Nguồn là một biểu thức của kiểu Chuỗi. S là một biến kiểu Chuỗi có độ dài bất kỳ. Chỉ mục là một biểu thức của kiểu số nguyên. Chèn các đoạn chèn Nguồn vào S, bắt đầu từ vị trí S.

4. Hàm Length (S: String): Integer;

Trả về số ký tự thực sự được sử dụng trong chuỗi S. Lưu ý rằng khi sử dụng chuỗi kết thúc bằng null, số ký tự không nhất thiết phải bằng số byte.

5. Hàm Pos (Substr: String; S: String): Integer; Tìm kiếm một chuỗi con trong một chuỗi. Pos tìm Substr bên trong S

và trả về một giá trị nguyên là chỉ số của ký tự đầu tiên của Substr trong S. Nếu không tìm thấy Substr, Pos trả về giá trị không.

12. Bản ghi

Một bản ghi là một tập hợp của một số lượng hạn chế các thành phần có liên quan về mặt logic thuộc các kiểu khác nhau. Các thành phần của một bản ghi được gọi là các trường, mỗi trường được xác định bằng một tên. Trường bản ghi chứa tên của trường, theo sau là dấu hai chấm để chỉ ra loại trường. Các trường bản ghi có thể thuộc bất kỳ kiểu nào được phép trong Pascal, ngoại trừ kiểu tệp.

Mô tả một bản ghi trong ngôn ngữ Pascal được thực hiện bằng cách sử dụng từ dịch vụ RECORD, tiếp theo là mô tả các thành phần của bản ghi. Mô tả của mục nhập kết thúc bằng từ dịch vụ END.

Ví dụ: một sổ ghi chép chứa họ, tên viết tắt và số điện thoại, do đó, rất thuận tiện để thể hiện một dòng riêng biệt trong sổ ghi chép dưới dạng mục nhập sau:

gõ Hàng = Bản ghi

FIO: Chuỗi [20];

ĐT: Chuỗi [7];

kết thúc;

var str: Hàng;

Cũng có thể ghi lại các mô tả mà không cần sử dụng tên loại, ví dụ:

var str: Ghi lại

FIO: Chuỗi [20];

ĐT: Chuỗi [7];

kết thúc;

Tham chiếu toàn bộ một bản ghi chỉ được phép trong các câu lệnh gán trong đó các tên bản ghi cùng loại được sử dụng ở bên trái và bên phải của dấu chỉ định. Trong tất cả các trường hợp khác, các trường bản ghi riêng biệt được vận hành. Để tham chiếu đến một thành phần bản ghi riêng lẻ, bạn phải chỉ định tên của bản ghi và được phân tách bằng dấu chấm, chỉ định tên của trường mong muốn. Tên như vậy được gọi là tên ghép. Một thành phần bản ghi cũng có thể là một bản ghi, trong trường hợp này, tên phân biệt sẽ không chứa hai mà là nhiều tên hơn.

Các thành phần bản ghi tham chiếu có thể được đơn giản hóa bằng cách sử dụng toán tử with append. Nó cho phép bạn thay thế các tên ghép đặc trưng cho từng trường bằng các tên trường và xác định tên bản ghi trong câu lệnh nối.

Đôi khi nội dung của một bản ghi riêng lẻ phụ thuộc vào giá trị của một trong các trường của nó. Trong ngôn ngữ Pascal, cho phép mô tả bản ghi, bao gồm phần chung và phần biến thể. Phần biến thể được chỉ định bằng cách sử dụng trường hợp P của cấu trúc, trong đó P là tên của trường từ phần chung của bản ghi. Các giá trị có thể được trường này chấp nhận được liệt kê theo cách tương tự như trong câu lệnh biến thể. Tuy nhiên, thay vì chỉ định hành động cần thực hiện, như được thực hiện trong một câu lệnh biến thể, các trường biến thể được chỉ định trong dấu ngoặc đơn. Mô tả của phần biến thể kết thúc bằng kết thúc từ dịch vụ. Loại trường P có thể được chỉ định trong tiêu đề của phần biến thể. Các bản ghi được khởi tạo bằng các hằng số đã nhập.

13. Bộ

Khái niệm tập hợp trong ngôn ngữ Pascal dựa trên khái niệm toán học về tập hợp: nó là một tập hợp giới hạn của các phần tử khác nhau. Một kiểu dữ liệu được liệt kê hoặc khoảng thời gian được sử dụng để xây dựng một kiểu tập hợp cụ thể. Kiểu của các phần tử tạo nên một tập hợp được gọi là kiểu cơ sở.

Nhiều kiểu được mô tả bằng cách sử dụng Tập hợp các từ chức năng, ví dụ:

loại M = Tập hợp B;

trong đó M là kiểu số nhiều, B là kiểu cơ sở.

Sự thuộc về các biến đối với kiểu số nhiều có thể được xác định trực tiếp trong phần khai báo biến.

Hằng số kiểu tập hợp được viết dưới dạng một chuỗi trong ngoặc gồm các phần tử hoặc khoảng thời gian kiểu cơ sở, được phân tách bằng dấu phẩy.

Các phép toán gán (: =), union (+), giao (*) và trừ (-) có thể áp dụng cho các biến và hằng số của một kiểu tập hợp. Kết quả của các phép toán này là một giá trị thuộc kiểu số nhiều:

1) ['A', 'B'] + ['A', 'D'] sẽ cho ['A', 'B', 'D'];

2) ['A'] * ['A', 'B', 'C'] sẽ cho ['A'];

3) ['A', 'B', 'C'] - ['A', 'B'] sẽ cho ['C']

Các phép toán có thể áp dụng cho nhiều giá trị: nhận dạng (=), không nhận dạng (<>), chứa trong (<=), chứa (> =). Kết quả của các phép toán này có kiểu boolean:

1) ['A', 'B'] = ['A', 'C'] sẽ cho FALSE;

2) ['A', 'B'] <> ['A', 'C'] sẽ cho TRUE;

3) ['B'] <= ['B', 'C'] sẽ cho TRUE;

4) ['C', 'D']> = ['A'] sẽ cho kết quả FALSE.

Ngoài các phép toán này, để làm việc với các giá trị của một kiểu đã đặt, phép toán đang sử dụng được sử dụng để kiểm tra xem phần tử của kiểu cơ sở ở bên trái của dấu phép toán có thuộc tập hợp ở bên phải của dấu phép toán hay không. . Kết quả của phép toán này là một boolean.

Giá trị của nhiều loại không thể là phần tử của danh sách I / O. Trong mỗi lần triển khai cụ thể của trình biên dịch từ ngôn ngữ Pascal, số lượng phần tử của kiểu cơ sở mà tập hợp được xây dựng trên đó bị giới hạn.

14. Tập tin. Hoạt động tệp

Kiểu dữ liệu tệp xác định một tập hợp có thứ tự các thành phần của cùng một kiểu.

Khi làm việc với tệp, các hoạt động I / O được thực hiện. Hoạt động đầu vào là chuyển dữ liệu từ thiết bị bên ngoài vào bộ nhớ, hoạt động đầu ra là chuyển dữ liệu từ bộ nhớ sang thiết bị bên ngoài.

Tệp văn bản

Để mô tả các tệp như vậy, có một loại Văn bản:

var TF1, TF2: Văn bản;

Tệp thành phần

Một thành phần hoặc tệp được đánh là một tệp có kiểu được khai báo của các thành phần của nó.

gõ M = File Of T;

trong đó M là tên của loại tệp;

T - loại thành phần. Các hoạt động được thực hiện bằng cách sử dụng các thủ tục.

Write(f, X1,X2,...XK)

Tệp không định kiểu

Tệp không định kiểu cho phép bạn ghi các phần tùy ý của bộ nhớ máy tính vào đĩa và đọc chúng.

var f: Tập tin;

1. Thủ tục Assign (var F; FileName: String); Nó ánh xạ một tên tệp với một biến.

2. Thủ tục Đóng (var F);

Nó phá vỡ liên kết giữa biến tệp và tệp đĩa ngoài và đóng tệp.

3. Hàm Eof (var F): Boolean;

{Tệp đã nhập hoặc chưa định kiểu}

Hàm Eof [(var F: Text)]: Boolean;

{tệp văn bản}

Kiểm tra phần cuối của một tệp.

4. Thủ tục Erase (var F);

Xóa tệp bên ngoài được liên kết với F.

5. Hàm FileSize (var F): Integer;

Trả về kích thước tính bằng byte của tệp F.

6. chức năng FilePos (varF): LongInt;

Trả về vị trí hiện tại trong một tệp.

7. Thủ tục Đặt lại (var F [: File; RecSize: Word]);

Mở tệp hiện có.

8. Thủ tục Viết lại (var F: File [; Recsize: Word]);

Tạo và mở một tệp mới.

9. Thủ tục Seek (var F; N: LongInt);

Di chuyển vị trí tệp hiện tại đến thành phần được chỉ định.

10. Thủ tục Append (var F: Text);

Phép cộng.

11.Function Eoln [(var F: Text)]: Boolean;

Kiểm tra sự kết thúc của một chuỗi.

12. Procedure Read(F, V1 [, V2..., Vn]);

{Tệp đã nhập và chưa định kiểu}

Procedure Read([var F: Text;] V1 [, V2..., Vn]);

{tệp văn bản}

Đọc một thành phần tệp thành một biến.

13. Thủ tục Readln([var F: Text;] V1 [, V2..., Vn]);

Đọc một chuỗi ký tự trong tệp, bao gồm cả điểm đánh dấu cuối dòng và chuyển sang đầu ký tự tiếp theo.

14. Hàm SeekEof [(var F: Text)]: Boolean;

Trả về ký hiệu cuối tệp. Chỉ được sử dụng cho các tệp văn bản đang mở.

15. Procedure Writeln([var F: Text;] [P1, P2..., Pn]);

{tệp văn bản}

Thực hiện thao tác Ghi, sau đó đặt điểm đánh dấu cuối dòng trong tệp.

15. Mô đun. Các loại mô-đun

Một đơn vị (UNIT) trong Pascal là một thư viện chương trình con được thiết kế đặc biệt. Một mô-đun, không giống như một chương trình, không thể tự khởi chạy, nó chỉ có thể tham gia vào việc xây dựng chương trình và các mô-đun khác.

Một mô-đun trong Pascal là một đơn vị chương trình được lưu trữ riêng biệt và được biên dịch độc lập.

Tất cả các phần tử chương trình của mô-đun có thể được chia thành hai phần:

1) các phần tử chương trình được dự định để sử dụng bởi các chương trình hoặc mô-đun khác, các phần tử đó được gọi là có thể nhìn thấy bên ngoài mô-đun;

2) các phần tử phần mềm chỉ cần thiết cho hoạt động của chính mô-đun, chúng được gọi là vô hình (hoặc ẩn).

đơn vị <tên mô-đun>; {Tiêu đề Mô-đun}

giao diện

{mô tả các phần tử chương trình hiển thị của mô-đun}

thực hiện

{mô tả các phần tử lập trình ẩn của mô-đun}

bắt đầu

{câu lệnh khởi tạo phần tử mô-đun}

cuối.

Để tham chiếu đến một biến được khai báo trong một mô-đun, bạn phải sử dụng một tên ghép bao gồm tên mô-đun và tên biến, được phân tách bằng dấu chấm.

Sử dụng đệ quy các mô-đun bị cấm. Hãy liệt kê các loại mô-đun.

1. Môđun HỆ THỐNG.

Mô-đun HỆ THỐNG thực hiện các quy trình hỗ trợ cấp thấp hơn cho tất cả các tính năng tích hợp sẵn như I / O, thao tác chuỗi, hoạt động dấu phẩy động và cấp phát bộ nhớ động.

2. Mô-đun DOS.

Mô-đun Dos thực hiện nhiều quy trình và chức năng Pascal tương đương với các lệnh gọi DOS thông dụng nhất, chẳng hạn như GetTime, SetTime, DiskSize, v.v.

3. Mô-đun CRT.

Mô-đun CRT triển khai một số chương trình mạnh mẽ cung cấp toàn quyền kiểm soát các tính năng của PC, chẳng hạn như điều khiển chế độ màn hình, mã bàn phím mở rộng, màu sắc, cửa sổ và âm thanh.

4. Mô-đun ĐỒ HỌA.

Sử dụng các thủ tục và chức năng có trong mô-đun này, bạn có thể tạo các đồ họa khác nhau trên màn hình.

5. Mô-đun OVERLAY.

Mô-đun OVERLAY cho phép bạn giảm yêu cầu bộ nhớ của chương trình DOS chế độ thực.

16. Kiểu dữ liệu tham chiếu. bộ nhớ động. biến động. Làm việc với bộ nhớ động

Biến static (cấp phát tĩnh) là một biến được khai báo rõ ràng trong chương trình, nó được gọi bằng tên. Vị trí trong bộ nhớ để đặt các biến tĩnh được xác định khi chương trình được biên dịch. Không giống như các biến tĩnh như vậy, các chương trình Pascal có thể tạo ra các biến động. Thuộc tính chính của các biến động là chúng được tạo ra và bộ nhớ được cấp cho chúng trong quá trình thực thi chương trình.

Các biến động được đặt trong một vùng nhớ động (heap-area). Một biến động không được chỉ định rõ ràng trong khai báo biến và không thể được gọi bằng tên. Các biến như vậy được truy cập bằng cách sử dụng con trỏ và tham chiếu.

Một kiểu tham chiếu (con trỏ) xác định một tập hợp các giá trị trỏ đến các biến động của một kiểu nhất định, được gọi là kiểu cơ sở. Một biến kiểu tham chiếu chứa địa chỉ của một biến động trong bộ nhớ. Nếu kiểu cơ sở là một định danh chưa được khai báo, thì nó phải được khai báo trong cùng một phần của khai báo kiểu với kiểu con trỏ.

Từ dành riêng nil biểu thị một hằng số có giá trị con trỏ không trỏ đến bất kỳ thứ gì.

Hãy để chúng tôi đưa ra một ví dụ về mô tả của các biến động.

var p1, p2: ^ real;

p3, p4: ^ số nguyên;

hữu ích. Cảm ơn !

Các thủ tục và chức năng của bộ nhớ động

1. Thủ tục New {var p: Pointer).

Phân bổ không gian trong vùng bộ nhớ động để chứa biến động p "và gán địa chỉ của nó cho con trỏ p.

2. Thủ tục Dispose (var p: Pointer).

Giải phóng bộ nhớ được cấp phát cho việc cấp phát biến động bằng thủ tục Mới và giá trị của con trỏ p trở nên không xác định.

3. Thủ tục GetMem (var p: Pointer; size: Word).

Cấp phát một phần bộ nhớ trong vùng heap, gán địa chỉ phần đầu của nó cho con trỏ p, kích thước của phần tính bằng byte được chỉ định bởi tham số kích thước.

4. Thủ tục FreeMem (varp: Pointer; size: Word).

Giải phóng vùng bộ nhớ, địa chỉ bắt đầu của vùng này được chỉ định bởi con trỏ p và kích thước được chỉ định bởi tham số size. Giá trị con trỏ p trở thành không xác định.

5. Thủ tục Mark {var p: Pointer) ghi vào con trỏ p địa chỉ của phần đầu của phần bộ nhớ động miễn phí tại thời điểm gọi của nó.

6. Thủ tục Release (var p: Pointer) giải phóng một phần của bộ nhớ động, bắt đầu từ địa chỉ được ghi tới con trỏ p bởi thủ tục Mark, tức là xóa bộ nhớ động đã bị chiếm sau khi gọi thủ tục Mark.

7. Hàm MaxAvail: Longint trả về độ dài tính bằng byte của phần trống dài nhất trong bộ nhớ động.

8. Hàm MemAvail: Longint trả về tổng dung lượng bộ nhớ động miễn phí tính bằng byte.

9. SizeOf (X): Hàm trợ giúp Word trả về kích thước, tính bằng byte, chiếm bởi X, trong đó X có thể là tên biến của bất kỳ kiểu nào hoặc tên kiểu.

17. Cấu trúc dữ liệu trừu tượng

Các kiểu dữ liệu có cấu trúc, chẳng hạn như mảng, tập hợp và bản ghi, là cấu trúc tĩnh vì kích thước của chúng không thay đổi trong toàn bộ quá trình thực thi chương trình.

Các cấu trúc dữ liệu thường được yêu cầu thay đổi kích thước của chúng trong quá trình giải quyết một vấn đề. Cấu trúc dữ liệu như vậy được gọi là động. Chúng bao gồm ngăn xếp, hàng đợi, danh sách, cây, v.v.

Mô tả cấu trúc động sử dụng mảng, bản ghi và tệp dẫn đến việc sử dụng lãng phí bộ nhớ máy tính và làm tăng thời gian giải quyết vấn đề.

Mỗi thành phần của bất kỳ cấu trúc động nào đều là một bản ghi chứa ít nhất hai trường: một trường thuộc loại "con trỏ" và trường thứ hai - dành cho vị trí dữ liệu. Nói chung, một bản ghi có thể không chứa một mà là một số con trỏ và một số trường dữ liệu. Trường dữ liệu có thể là một biến, một mảng, một tập hợp hoặc một bản ghi.

Nếu phần trỏ chứa địa chỉ của một phần tử của danh sách, thì danh sách được gọi là một hướng (hoặc liên kết đơn). Nếu nó chứa hai thành phần, thì nó được kết nối kép. Bạn có thể thực hiện các thao tác khác nhau trên danh sách, ví dụ:

1) thêm một phần tử vào danh sách;

2) xóa một phần tử khỏi danh sách bằng một khóa cho trước;

3) tìm kiếm một phần tử có giá trị cho trước của trường khóa;

4) sắp xếp các phần tử của danh sách;

5) chia danh sách thành hai hoặc nhiều danh sách;

6) kết hợp hai hoặc nhiều danh sách thành một;

7) các hoạt động khác.

Tuy nhiên, như một quy luật, không phát sinh nhu cầu về tất cả các thao tác trong việc giải quyết các vấn đề khác nhau. Vì vậy, tùy theo các thao tác cơ bản cần áp dụng mà có các loại danh sách khác nhau. Phổ biến nhất trong số này là ngăn xếp và hàng đợi.

18. Ngăn xếp

Ngăn xếp là một cấu trúc dữ liệu động, việc bổ sung một thành phần vào đó và loại bỏ một thành phần được tạo ra từ một đầu, được gọi là đỉnh của ngăn xếp. Ngăn xếp hoạt động theo nguyên tắc LIFO (Last-In, First-Out) - "Nhập trước, xuất trước".

Thường có ba hoạt động được thực hiện trên ngăn xếp:

1) sự hình thành ban đầu của ngăn xếp (bản ghi của thành phần đầu tiên);

2) thêm một thành phần vào ngăn xếp;

3) lựa chọn thành phần (xóa).

Để tạo một ngăn xếp và làm việc với nó, bạn phải có hai biến kiểu "con trỏ", biến thứ nhất xác định đỉnh của ngăn xếp và biến thứ hai là phụ trợ.

Thí dụ. Viết một chương trình tạo thành một ngăn xếp, thêm một số thành phần tùy ý vào nó, sau đó đọc tất cả các thành phần.

Chương trình STACK;

sử dụng Crt;

kiểu

Alpha = Chuỗi [10];

PComp = ^ Comp;

Comp = bản ghi

SD: Alpha;

pTiếp theo: PComp

kết thúc;

pTop:PComp;

sc: Alfa;

Tạo ProcedureStack (var pTop: PComp; var sC: Alfa);

bắt đầu

Mới (pTop);

pTop ^ .pNext: = NIL;

pTop ^ .sD: = sC;

kết thúc;

Thêm ProcedureComp (var pTop: PComp; var sC: Alfa);

var pAux: PComp;

bắt đầu

MỚI (pAux);

pAux ^ .pNext: = pTop;

pTop: = pAux;

pTop ^ .sD: = sC;

kết thúc;

Thủ tục DelComp (var pTop: PComp; var sC: ALFA);

bắt đầu

sC: = pTop ^ .sD;

pTop: = pTop ^ .pNext;

kết thúc;

bắt đầu

Clrscr;

writeln (NHẬP STRING);

readln (sC);

CreateStack (pTop, sc);

lặp lại

writeln (NHẬP STRING);

readln (sC);

AddComp (pTop, sc);

cho đến khi sC = 'END';

19. Hàng đợi

Hàng đợi là một cấu trúc dữ liệu động, nơi một thành phần được thêm vào ở một đầu và được truy xuất ở đầu kia. Hàng đợi hoạt động theo nguyên tắc FIFO (First-In, First-Out) - "Nhập trước, phục vụ trước".

Thí dụ. Viết một chương trình tạo thành một hàng đợi, thêm một số thành phần tùy ý vào nó, sau đó đọc tất cả các thành phần.

ProgramQUEUE;

sử dụng Crt;

kiểu

Alpha = Chuỗi [10];

PComp = ^ Comp;

Comp = bản ghi

SD: Alpha;

pTiếp theo: PComp;

kết thúc;

pBắt đầu, pKết thúc: PComp;

sc: Alfa;

Tạo thủ tụcQueue (var pBegin, pEnd: PComp; var

sc: Alfa);

bắt đầu

Mới (pBegin);

pBegin ^ .pNext: = NIL;

pBegin ^ .sD: = sC;

pEnd: = pBegin;

kết thúc;

Thủ tục AddQueue (var pEnd: PComp; var sC:

alpha);

var pAux: PComp;

bắt đầu

Mới (pAux);

pAux ^ .pNext: = NIL;

pEnd ^ .pNext: = pAux;

pEnd: = pAux;

pEnd ^ .sD: = sC;

kết thúc;

Thủ tục DelQueue (var pBegin: PComp; var sC:

alpha);

bắt đầu

sC: = pBegin ^ .sD;

pBegin: = pBegin ^ .pNext;

kết thúc;

bắt đầu

Clrscr;

writeln (NHẬP STRING);

readln (sC);

CreateQueue (pBegin, pEnd, sc);

lặp lại

writeln (NHẬP STRING);

readln (sC);

AddQueue (pEnd, sc);

cho đến khi sC = 'END';

20. Cấu trúc dữ liệu cây

Cấu trúc dữ liệu dạng cây là một tập hợp hữu hạn các phần tử-nút giữa chúng có các mối quan hệ - kết nối giữa nguồn và phần tử được tạo ra.

Nếu chúng ta sử dụng định nghĩa đệ quy do N. Wirth đề xuất, thì một cấu trúc dữ liệu cây với kiểu cơ sở t là một cấu trúc rỗng hoặc một nút của kiểu t, trong đó một tập hữu hạn cấu trúc cây với kiểu cơ sở t, được gọi là cây con, là có liên quan.

Tiếp theo, chúng tôi đưa ra các định nghĩa được sử dụng khi hoạt động với cấu trúc cây.

Если узел y находится непосредственно под узлом х, то узел y называется непосредственным потомком узла х, а x - непосредственным предком узла у, т. е., если узел хнаходится на i-ом уровне, то соответственно узел y находится на (i + 1) - ом уровне.

Mức tối đa của một nút cây được gọi là chiều cao hoặc chiều sâu của cây. Tổ tiên không chỉ có một nút của cây - gốc của nó.

Các nút cây không có con gọi là nút lá (hay lá cây). Tất cả các nút khác được gọi là nút bên trong. Số lượng nút con ngay lập tức xác định cấp độ của nút đó và cấp độ tối đa có thể có của một nút trong một cây nhất định xác định cấp độ của cây.

Tổ tiên và con cháu không thể thay thế cho nhau, tức là mối liên hệ giữa nguyên bản và tác phẩm được tạo ra chỉ hoạt động theo một hướng.

Nếu bạn đi từ gốc của cây đến một nút cụ thể nào đó, thì số nhánh của cây sẽ được đi ngang trong trường hợp này được gọi là độ dài của đường dẫn cho nút này. Nếu tất cả các nhánh (nút) của một cây được đặt hàng, thì cây đó được cho là đã được sắp xếp theo thứ tự.

Cây nhị phân là một trường hợp đặc biệt của cấu trúc cây. Đây là những cây mà mỗi cây có nhiều nhất hai con, gọi là cây con trái và cây con phải. Do đó, cây nhị phân là một cấu trúc cây có bậc là hai.

Thứ tự của cây nhị phân được xác định theo quy tắc sau: mỗi nút có trường khóa riêng và đối với mỗi nút, giá trị khóa lớn hơn tất cả các khóa trong cây con bên trái của nó và nhỏ hơn tất cả các khóa trong cây con bên phải của nó.

Cây có độ lớn hơn hai được gọi là phân cành mạnh.

21. Hoạt động trên cây

Hơn nữa, chúng ta sẽ xem xét tất cả các phép toán liên quan đến cây nhị phân. I. Dựng cây.

Chúng tôi trình bày một thuật toán để xây dựng một cây có thứ tự.

1. Nếu cây trống, thì dữ liệu được chuyển đến gốc của cây. Nếu cây không trống, thì một trong các nhánh của nó bị hạ xuống sao cho trật tự của cây không bị vi phạm. Kết quả là, nút mới trở thành lá tiếp theo của cây.

2. Để thêm một nút vào cây đã có, bạn có thể sử dụng thuật toán trên.

3. Khi xóa một nút khỏi cây, bạn nên cẩn thận. Nếu nút cần loại bỏ là một lá hoặc chỉ có một nút con, thì thao tác rất đơn giản. Nếu nút bị xóa có hai nút con, thì cần phải tìm một nút trong số các nút con có thể được đặt vào vị trí của nó. Điều này là cần thiết do yêu cầu của cây được đặt hàng.

Bạn có thể thực hiện điều này: hoán đổi nút cần xóa với nút có giá trị khóa lớn nhất trong cây con bên trái hoặc với nút có giá trị khóa nhỏ nhất trong cây con bên phải, rồi xóa nút mong muốn dưới dạng lá.

II. Tìm kiếm một nút có giá trị trường khóa nhất định.

Khi thực hiện thao tác này, cần phải đi ngang cây. Cần phải tính đến các hình thức viết cây khác nhau: tiền tố, tiền tố và hậu tố.

Câu hỏi đặt ra: làm thế nào để biểu diễn các nút của cây sao cho thuận tiện nhất khi làm việc với chúng? Có thể biểu diễn cây bằng cách sử dụng một mảng, trong đó mỗi nút được mô tả bằng một giá trị của kiểu kết hợp, có một trường thông tin kiểu ký tự và hai trường kiểu tham chiếu. Nhưng điều này không thuận tiện lắm, vì các cây có một số lượng lớn các nút không được xác định trước. Vì vậy, tốt nhất là sử dụng các biến động khi mô tả một cây. Sau đó, mỗi nút được biểu diễn bằng một giá trị cùng kiểu, chứa mô tả về một số trường thông tin nhất định, và số trường tương ứng phải bằng mức độ của cây. Hợp lý là xác định sự vắng mặt của con cháu bằng nil tham chiếu. Sau đó, trong Pascal, mô tả của một cây nhị phân có thể trông như thế này:

TYPE TreeLink = ^ Cây;

cây = bản ghi;

Inf: <kiểu dữ liệu>;

Trái, phải: TreeLink;

Kết thúc

22. Ví dụ về việc thực hiện các hoạt động

1. Xây dựng một cây gồm XNUMX nút có chiều cao tối thiểu, hoặc một cây hoàn toàn cân đối (số nút của cây con bên trái và bên phải của một cây như vậy không được chênh lệch nhau quá một).

Thuật toán xây dựng đệ quy:

1) nút đầu tiên được lấy làm gốc của cây;

2) cây con bên trái của nl nút được xây dựng theo cách tương tự;

3) cây con bên phải của nr nút được xây dựng theo cách tương tự;

nr = n - nl - 1

Là một trường thông tin, chúng tôi sẽ lấy các số nút được nhập từ bàn phím. Hàm đệ quy thực hiện cấu trúc này sẽ giống như sau:

Cây hàm (n: Byte): TreeLink;

Vart: TreeLink; nl, nr, x: Byte;

Bắt đầu

Nếu n = 0 thì Tree: = nil

Khác

Bắt đầu

nl: = n div 2;

nr = n - nl - 1;

writeln ('Nhập số đỉnh);

readln (x);

mới (t);

t ^ .inf: = x;

t ^ .left: = Tree (nl);

t ^ .right: = Tree (nr);

Cây: = t;

Kết thúc;

{Cây}

Kết thúc

2. Trong cây có thứ tự nhị phân, tìm nút có giá trị cho trước của trường khóa. Nếu không có yếu tố này trong cây, thì hãy thêm nó vào cây.

Thủ tục Tìm kiếm (x: Byte; var t: TreeLink);

Bắt đầu

Nếu t = nil thì

Bắt đầu

Mới (t);

t ^ inf: = x;

t ^ .left: = nil;

t ^ .right: = nil;

Kết thúc

Khác nếu x <t ^ .inf thì

Tìm kiếm (x, t ^ .left)

Khác nếu x> t ^ .inf thì

Tìm kiếm (x, t ^ .right)

Khác

Bắt đầu

{phần tử tìm thấy quá trình}

hữu ích. Cảm ơn !

Kết thúc;

Kết thúc

23. Khái niệm về đồ thị. Các cách biểu diễn đồ thị

Đồ thị là một cặp G = (V, E), trong đó V là tập các đối tượng có tính chất tùy ý, được gọi là các đỉnh, và E là một họ các cặp ei = (vil, vi2), vijOV, được gọi là các cạnh. Trong trường hợp tổng quát, tập V và (hoặc) họ E có thể chứa vô số phần tử, nhưng chúng ta sẽ chỉ xem xét các đồ thị hữu hạn, tức là đồ thị mà cả V và E đều hữu hạn. Nếu thứ tự của các phần tử có trong ei quan trọng, thì biểu đồ được gọi là có hướng, viết tắt - digraph, ngược lại - vô hướng. Các cạnh của một đồ thị được gọi là cung tròn.

Nếu e = , khi đó các đỉnh v và u được gọi là các điểm cuối của cạnh. Ở đây chúng ta nói rằng cạnh e là kề (sự cố) với mỗi đỉnh v và u. Đỉnh v và và còn được gọi là kề (sự cố). Trong trường hợp tổng quát, các cạnh có dạng e = ; các cạnh như vậy được gọi là vòng lặp.

Bậc của đỉnh đồ thị là số cạnh tới đỉnh đã cho, với các vòng được đếm hai lần.

Trọng số của nút là một số (thực, số nguyên hoặc số hữu tỷ) được gán cho một nút nhất định (được hiểu là chi phí, thông lượng, v.v.).

Путем в графе (или маршрутом в орграфе) называется чередующаяся последовательность вершин и ребер (или дуг - в орграфе) вида v0, (v0,v1), v1,..., (vn -1,vn), vn. Число n называется длиной пути. Путь без повторяющихся ребер называется цепью, без повторяющихся вершин - простой цепью. Замкнутый путь без повторяющихся ребер называется циклом (или

đường bao trong một đồ thị); không có đỉnh lặp lại (trừ đỉnh đầu tiên và cuối cùng) - một chu trình đơn giản.

Một đồ thị được gọi là liên thông nếu có một đường đi giữa hai đỉnh bất kỳ của nó và bị ngắt kết nối nếu không.

Có nhiều cách khác nhau để biểu diễn đồ thị.

1. Ma trận tỷ lệ.

Đây là một ma trận hình chữ nhật n x m, trong đó n là số đỉnh và m là số cạnh.

2. Ma trận kề.

Đây là một ma trận vuông có kích thước n × n, với n là số đỉnh.

3. Danh sách các adjacencies (sự cố). Đại diện cho một cấu trúc dữ liệu

đối với mỗi đỉnh của đồ thị lưu trữ một danh sách các đỉnh liền kề với nó. Danh sách là một mảng các con trỏ, phần tử thứ i chứa một con trỏ đến danh sách các đỉnh kề với đỉnh thứ i.

4. Danh sách các danh sách.

Nó là một cấu trúc dữ liệu dạng cây, trong đó một nhánh chứa danh sách các đỉnh liền kề với mỗi đỉnh.

24. Các biểu diễn đồ thị khác nhau

Để triển khai biểu đồ dưới dạng danh sách tỷ lệ, bạn có thể sử dụng loại sau:

TypeList = ^ S;

S = bản ghi;

inf: Byte;

tiếp theo: Danh sách;

kết thúc;

Sau đó, đồ thị được xác định như sau:

Vargr: array [1..n] of List;

Bây giờ chúng ta hãy chuyển sang thủ tục duyệt đồ thị. Đây là một thuật toán bổ trợ cho phép bạn xem tất cả các đỉnh của đồ thị, phân tích tất cả các trường thông tin. Nếu chúng ta xem xét chiều sâu của một đường truyền đồ thị, thì có hai loại thuật toán: đệ quy và không đệ quy.

Trong Pascal, thủ tục duyệt theo chiều sâu sẽ giống như sau:

Thủ tục Obhod (gr: Graph; k: Byte);

Varg: Đồ thị; l: Danh sách;

Bắt đầu

nov [k]: = false;

g: = gr;

Trong khi g ^ .inf <> k làm

g: = g ^ .next;

l: = g ^ .smeg;

While l <> nil do begin

If nov [l ^ .inf] then Obhod (gr, l ^ .inf);

l: = l ^ .next;

Kết thúc;

Kết thúc;

Biểu diễn biểu đồ dưới dạng danh sách các danh sách

Một biểu đồ có thể được xác định bằng cách sử dụng một danh sách các danh sách như sau:

TypeList = ^ Danh sách;

tlist = bản ghi

inf: Byte;

tiếp theo: Danh sách;

kết thúc;

Đồ thị = ^ TGpaph;

TGpaph = bản ghi

inf: Byte;

smeg: Danh sách;

tiếp theo: đồ thị;

kết thúc;

Khi duyệt đồ thị theo chiều rộng, chúng ta chọn một đỉnh tùy ý và xem xét tất cả các đỉnh kề với nó cùng một lúc.

Đây là một quy trình để duyệt qua một biểu đồ theo chiều rộng trong mã giả:

Thủ tục Obhod2 (v);

Bắt đầu

hàng đợi = O;

hàng đợi <= v;

nov [v] = Sai;

Trong khi hàng đợi <> O do

Bắt đầu

p <= hàng đợi;

For u in spisok (p) do

Nếu mới [u] thì

Bắt đầu

nov [u]: = Sai;

hàng đợi <= u;

Kết thúc;

Kết thúc;

Kết thúc;

25. Kiểu đối tượng trong Pascal. Khái niệm về một đối tượng, mô tả và sử dụng nó

Một ngôn ngữ lập trình hướng đối tượng được đặc trưng bởi ba thuộc tính chính:

1) đóng gói. Kết hợp các bản ghi với các thủ tục và chức năng thao tác với các trường của các bản ghi này tạo thành một kiểu dữ liệu mới - một đối tượng;

2) tính kế thừa. Định nghĩa một đối tượng và việc sử dụng nó để xây dựng một hệ thống phân cấp các đối tượng con với khả năng cho mỗi đối tượng con liên quan đến hệ thống phân cấp truy cập mã và dữ liệu của tất cả các đối tượng mẹ;

3) tính đa hình. Đặt cho một hành động một tên duy nhất, sau đó được chia sẻ lên và xuống hệ thống phân cấp của các đối tượng, với mỗi đối tượng trong hệ thống phân cấp thực hiện hành động đó theo cách phù hợp với nó.

Nói về đối tượng, chúng tôi giới thiệu một kiểu dữ liệu mới - đối tượng. Một kiểu đối tượng là một cấu trúc bao gồm một số thành phần cố định. Mỗi thành phần là một trường chứa dữ liệu của một kiểu được xác định nghiêm ngặt hoặc một phương thức thực hiện các hoạt động trên một đối tượng.

Một kiểu đối tượng có thể kế thừa các thành phần của một kiểu đối tượng khác. Nếu kiểu T2 kế thừa từ kiểu T1, thì kiểu T2 là con của kiểu G và bản thân kiểu G là cha của kiểu G2.

Mã nguồn sau đây cung cấp một ví dụ về khai báo kiểu đối tượng.

kiểu

point = object

X, Y: số nguyên;

kết thúc;

Rect = đối tượng

A, B: Điểm TP;

thủ tục Init (XA, YA, XB, YB: Integer);

thủ tục Copy (var R: TRectangle);

thủ tục Move (DX, DY: Integer);

thủ tục Grow (DX, DY: Integer);

thủ tục Intersect (var R: TRectangle);

thủ tục Union (var R: TRectangle);

function Chứa (P: Point): Boolean;

kết thúc;

Không giống như các kiểu khác, kiểu đối tượng chỉ có thể được khai báo trong phần khai báo kiểu ở cấp ngoài cùng của phạm vi chương trình hoặc mô-đun. Do đó, các kiểu đối tượng không thể được khai báo trong phần khai báo biến hoặc bên trong một khối thủ tục, hàm hoặc phương thức.

Kiểu thành phần kiểu tệp không thể có kiểu đối tượng hoặc bất kỳ kiểu cấu trúc nào chứa các thành phần kiểu đối tượng.

26. Thừa kế

Kế thừa là quá trình tạo ra các kiểu con mới từ các kiểu mẹ hiện có, trong khi kiểu con nhận (kế thừa) từ kiểu mẹ tất cả các trường và phương thức của nó.

Trong trường hợp này, kiểu con cháu được gọi là kiểu người thừa kế hoặc kiểu con. Và kiểu mà kiểu con kế thừa được gọi là kiểu mẹ.

Các trường và phương thức kế thừa có thể được sử dụng không thay đổi hoặc được xác định lại (sửa đổi).

N. Wirth trong ngôn ngữ của mình, Pascal cố gắng tối đa hóa sự đơn giản, vì vậy ông không làm phức tạp nó bằng cách đưa ra quan hệ kế thừa. Do đó, các kiểu trong Pascal không thể kế thừa.

Tuy nhiên, Turbo Pascal 7.0 mở rộng ngôn ngữ này để hỗ trợ tính kế thừa. Một phần mở rộng như vậy là một danh mục cấu trúc dữ liệu mới liên quan đến các bản ghi, nhưng mạnh hơn nhiều. Các kiểu dữ liệu trong danh mục mới này được xác định bằng cách sử dụng Đối tượng từ dành riêng mới. Cú pháp rất giống với cú pháp để xác định bản ghi:

Kiểu

<type name> = Object [(<tên type cha>)]

([<kính>]

<mô tả các trường và phương thức>) +

kết thúc;

Dấu "+" sau một cấu trúc cú pháp trong dấu ngoặc đơn có nghĩa là cấu trúc này phải xuất hiện một hoặc nhiều lần trong mô tả này.

Phạm vi là một trong những từ khóa sau:

▪ Private;

▪ Protected;

▪ Public.

Phạm vi đặc trưng cho phần nào của chương trình mà các thành phần có mô tả theo từ khóa đặt tên cho phạm vi này sẽ có sẵn.

Để biết thêm thông tin về phạm vi thành phần, hãy xem câu hỏi # 28.

Kế thừa là một công cụ mạnh mẽ được sử dụng trong phát triển chương trình. Nó cho phép bạn triển khai trên thực tế sự phân rã hướng đối tượng của vấn đề, sử dụng ngôn ngữ để diễn đạt mối quan hệ giữa các đối tượng của các kiểu tạo thành một hệ thống phân cấp, và cũng thúc đẩy việc tái sử dụng mã chương trình.

27. Instantiate Objects

Một thể hiện của một đối tượng được tạo ra bằng cách khai báo một biến hoặc hằng của một kiểu đối tượng, hoặc bằng cách áp dụng thủ tục Mới chuẩn cho một biến kiểu "con trỏ đến kiểu đối tượng". Đối tượng kết quả được gọi là một thể hiện của kiểu đối tượng.

Nếu một kiểu đối tượng chứa các phương thức ảo, thì các thể hiện của kiểu đối tượng đó phải được khởi tạo bằng cách gọi một phương thức khởi tạo trước khi gọi bất kỳ phương thức ảo nào.

Việc gán một thể hiện của một kiểu đối tượng không có nghĩa là khởi tạo thể hiện đó. Một đối tượng được khởi tạo bằng mã do trình biên dịch tạo chạy giữa lệnh gọi của hàm tạo và thời điểm mà việc thực thi thực sự đạt đến câu lệnh đầu tiên trong khối mã của hàm tạo.

Nếu cá thể đối tượng không được khởi tạo và kiểm tra phạm vi được bật (bằng chỉ thị {$ R +}), thì lệnh gọi đầu tiên đến phương thức ảo của cá thể đối tượng sẽ xảy ra lỗi thời gian chạy. Nếu tính năng kiểm tra phạm vi bị tắt bởi chỉ thị {$ R-}), thì lệnh gọi đầu tiên đến một phương thức ảo của một đối tượng chưa được khởi tạo có thể dẫn đến hành vi không thể đoán trước.

Quy tắc khởi tạo bắt buộc cũng áp dụng cho các phiên bản là thành phần của kiểu cấu trúc. Ví dụ:

Nhận xét: array [1..5] of TStrField;

I: số nguyên

bắt đầu

for I: = 1 to 5 do

Comment [I] .Init (1, I + 10, 40, 'first_name');

.

.

.

for I: = 1 to 5 do Comment [I] .Done;

kết thúc;

Đối với các trường hợp động, việc khởi tạo thường là vị trí và dọn dẹp là loại bỏ, điều này đạt được thông qua cú pháp mở rộng của các thủ tục tiêu chuẩn Mới và Loại bỏ. Ví dụ:

SP: StrFieldPtr;

bắt đầu

Mới (SP, Init (1, 1, 25, 'first_name');

SP ^ .Put ('Vladimir');

SP ^ .Hiển thị;

.

.

.

Vứt bỏ (SP, Xong);

cuối.

Một con trỏ tới một kiểu đối tượng là phép gán tương thích với một con trỏ tới bất kỳ kiểu đối tượng mẹ nào, vì vậy trong thời gian chạy, một con trỏ tới một kiểu đối tượng có thể trỏ đến một thể hiện của kiểu đó hoặc đến một thể hiện của bất kỳ kiểu con nào.

28. Thành phần và Phạm vi

Phạm vi của một mã định danh bean mở rộng ra ngoài kiểu đối tượng. Hơn nữa, phạm vi của một mã định danh bean mở rộng qua các khối thủ tục, hàm, hàm tạo và hàm hủy thực thi các phương thức của kiểu đối tượng và con cháu của nó. Dựa trên những cân nhắc này, định danh thành phần phải là duy nhất trong kiểu đối tượng và trong tất cả các con của nó, cũng như trong tất cả các phương thức của nó.

Trong khai báo kiểu đối tượng, tiêu đề phương thức có thể chỉ định các tham số của kiểu đối tượng đang được mô tả, ngay cả khi khai báo chưa hoàn chỉnh.

Hãy xem xét lược đồ sau cho một khai báo kiểu có chứa các thành phần của tất cả các phạm vi hợp lệ:

Kiểu

<type name> = Object [(<tên type cha>)]

Riêng

<mô tả riêng về các trường và phương thức>

bảo vệ

<mô tả trường và phương pháp được bảo vệ>

Công khai

<mô tả công khai về các trường và phương thức>

kết thúc;

Các trường và phương thức được mô tả trong phần Riêng tư chỉ có thể được sử dụng trong mô-đun chứa các khai báo của chúng, và không có nơi nào khác.

Các trường và phương thức được bảo vệ, nghĩa là, những trường được mô tả trong phần Được bảo vệ, sẽ hiển thị trong mô-đun nơi loại được xác định và trong phần con của loại.

Các trường và phương thức từ phần Công khai không có hạn chế về việc sử dụng chúng và có thể được sử dụng ở bất kỳ đâu trong chương trình có quyền truy cập vào một đối tượng thuộc loại này.

Phạm vi của định danh thành phần được mô tả trong phần riêng của khai báo kiểu được giới hạn trong mô-đun (chương trình) có chứa khai báo kiểu đối tượng. Nói cách khác, các bean số nhận dạng riêng hoạt động giống như các mã định danh công khai thông thường bên trong mô-đun có chứa khai báo kiểu đối tượng và bên ngoài mô-đun, bất kỳ mã nhận dạng và đậu riêng nào đều không xác định và không thể truy cập được. Bằng cách đặt các loại đối tượng liên quan trong cùng một mô-đun, bạn có thể đảm bảo rằng các đối tượng này có thể truy cập các thành phần riêng tư của nhau và các thành phần riêng tư này sẽ không được biết đối với các mô-đun khác.

29. Phương pháp

Một khai báo phương thức bên trong một kiểu đối tượng tương ứng với một khai báo phương thức chuyển tiếp (forward). Vì vậy, ở đâu đó sau một khai báo kiểu đối tượng, nhưng trong cùng phạm vi với phạm vi của khai báo kiểu đối tượng, một phương thức phải được thực hiện bằng cách xác định khai báo của nó.

Đối với các phương thức thủ tục và hàm, khai báo xác định có dạng một thủ tục hoặc khai báo hàm thông thường, ngoại trừ trường hợp này, mã định danh thủ tục hoặc hàm được coi như một định danh phương thức.

Mô tả xác định của một phương thức luôn chứa một tham số ngầm định với định danh Self, tương ứng với một tham số biến hình thức có kiểu đối tượng. Trong một khối phương thức, Self đại diện cho cá thể có thành phần phương thức được chỉ định để gọi phương thức. Do đó, bất kỳ thay đổi nào đối với giá trị của các trường Bản thân đều được phản ánh trong trường hợp.

Phương pháp ảo

Các phương thức là tĩnh theo mặc định, nhưng ngoại trừ các hàm tạo, chúng có thể là ảo (bằng cách bao gồm chỉ thị ảo trong khai báo phương thức). Trình biên dịch giải quyết các tham chiếu đến các cuộc gọi phương thức tĩnh trong quá trình biên dịch, trong khi các cuộc gọi phương thức ảo được giải quyết tại thời điểm chạy. Điều này đôi khi được gọi là ràng buộc muộn.

Ghi đè một phương thức tĩnh không phụ thuộc vào việc thay đổi tiêu đề phương thức. Ngược lại, ghi đè phương thức ảo phải bảo toàn thứ tự, kiểu tham số và tên cũng như kiểu kết quả của hàm, nếu có. Hơn nữa, định nghĩa lại một lần nữa phải bao gồm chỉ thị ảo.

Phương pháp động

Borland Pascal hỗ trợ các phương thức giới hạn cuối bổ sung được gọi là phương thức động. Các phương thức động chỉ khác với các phương thức ảo ở cách chúng được gửi đi trong thời gian chạy. Trong tất cả các khía cạnh khác, các phương thức động được coi là tương đương với các phương thức ảo.

Khai báo phương thức động tương đương với khai báo phương thức ảo, nhưng khai báo phương thức động phải bao gồm chỉ mục phương thức động, chỉ mục này được chỉ định ngay sau từ khóa virtual. Chỉ mục của một phương thức động phải là một hằng số nguyên từ 1 đến 656535 và phải là duy nhất trong số các chỉ mục của các phương thức động khác có trong kiểu đối tượng hoặc tổ tiên của nó. Ví dụ:

thủ tục FileOpen (var Msg: TMessage); ảo 100;

Ghi đè một phương thức động phải khớp với thứ tự, kiểu và tên của các tham số và khớp chính xác với kiểu kết quả của hàm của phương thức mẹ. Việc ghi đè cũng phải bao gồm một chỉ thị ảo theo sau cùng một chỉ mục phương thức động đã được chỉ định trong kiểu đối tượng tổ tiên.

30. Bộ tạo và bộ hủy

Bộ tạo và bộ hủy là các dạng phương pháp chuyên biệt. Được sử dụng liên quan đến cú pháp mở rộng của các thủ tục tiêu chuẩn Mới và Loại bỏ, các hàm tạo và hàm hủy có khả năng đặt và loại bỏ các đối tượng động. Ngoài ra, các hàm tạo có khả năng thực hiện việc khởi tạo các đối tượng chứa các phương thức ảo theo yêu cầu. Giống như tất cả các phương thức, hàm tạo và hàm hủy có thể được kế thừa và các đối tượng có thể chứa bất kỳ số lượng hàm tạo và hàm hủy nào.

Constructors được sử dụng để khởi tạo các đối tượng mới được tạo. Thông thường, việc khởi tạo dựa trên các giá trị được truyền cho hàm tạo dưới dạng các tham số. Một phương thức khởi tạo không thể là ảo bởi vì cơ chế điều phối của một phương thức ảo phụ thuộc vào phương thức khởi tạo đã khởi tạo đối tượng trước.

Dưới đây là một số ví dụ về các hàm tạo:

constructor Field.Copy (var F: Field);

bắt đầu

Tự: = F;

kết thúc;

Hành động chính của một phương thức khởi tạo kiểu dẫn xuất (con) hầu như luôn luôn gọi phương thức khởi tạo thích hợp của cha mẹ trực tiếp của nó để khởi tạo các trường kế thừa của đối tượng. Sau khi thực hiện thủ tục này, hàm khởi tạo khởi tạo các trường của đối tượng chỉ thuộc về kiểu dẫn xuất.

Bộ hủy đối lập với bộ tạo và được sử dụng để dọn dẹp các đối tượng sau khi chúng đã được sử dụng. Thông thường, dọn dẹp bao gồm loại bỏ tất cả các trường con trỏ trong đối tượng.

Ghi

Một hàm hủy có thể là ảo, và thường là như vậy. Một hàm hủy hiếm khi có các tham số. Dưới đây là một số ví dụ về hàm hủy:

Trường hủy kết thúc Đã xong;

bắt đầu

FreeMem (Tên, Độ dài (Tên ^) + 1);

kết thúc;

hàm hủy StrField.Done;

bắt đầu

FreeMem (Giá trị, Len);

Thực hiện xong;

kết thúc;

Hàm hủy của một kiểu con, chẳng hạn như TStrField ở trên. Xong, thường trước tiên xóa các trường con trỏ được giới thiệu trong kiểu dẫn xuất và sau đó, bước cuối cùng, gọi bộ thu-hủy thích hợp của cha mẹ trực tiếp để xóa các trường con trỏ kế thừa của đối tượng.

31. Kẻ hủy diệt

Borland Pascal cung cấp một loại phương thức đặc biệt được gọi là bộ thu gom rác (hoặc bộ hủy) để dọn dẹp và xóa một đối tượng được cấp phát động. Bộ hủy kết hợp bước xóa một đối tượng với bất kỳ hành động hoặc tác vụ nào khác được yêu cầu cho loại đối tượng đó. Bạn có thể xác định nhiều hàm hủy cho một loại đối tượng.

Bộ hủy có thể được kế thừa và chúng có thể là tĩnh hoặc ảo. Vì các trình hoàn thiện khác nhau có xu hướng yêu cầu các loại đối tượng khác nhau, nên nói chung các trình hủy luôn là ảo để trình hủy chính xác được thực thi cho từng loại đối tượng.

Bộ hủy từ dành riêng không cần phải được chỉ định cho mọi phương thức dọn dẹp, ngay cả khi định nghĩa kiểu của đối tượng có chứa các phương thức ảo. Bộ hủy thực sự chỉ hoạt động trên các đối tượng được cấp phát động.

Khi một đối tượng được cấp phát động được dọn dẹp, trình hủy thực hiện một chức năng đặc biệt: nó đảm bảo rằng số byte chính xác luôn được giải phóng trong vùng bộ nhớ được cấp phát động. Không cần lo lắng về việc sử dụng trình hủy với các đối tượng được cấp phát tĩnh; trên thực tế, bằng cách không chuyển kiểu của đối tượng tới trình hủy, lập trình viên sẽ tước đi lợi ích đầy đủ của việc quản lý bộ nhớ động trong Borland Pascal đối với một đối tượng thuộc kiểu đó.

Bộ hủy thực sự trở thành chính nó khi các đối tượng đa hình phải được xóa và khi bộ nhớ mà chúng chiếm phải được phân bổ.

Đối tượng đa hình là những đối tượng đã được gán cho kiểu mẹ do các quy tắc tương thích kiểu mở rộng của Borland Pascal. Thuật ngữ "đa hình" là thích hợp vì mã xử lý một đối tượng "không biết" tại thời điểm biên dịch chính xác loại đối tượng mà nó sẽ phải xử lý cuối cùng. Điều duy nhất nó biết là đối tượng này thuộc về một hệ thống phân cấp các đối tượng là hậu duệ của loại đối tượng được chỉ định.

Bản thân phương thức hủy có thể trống và chỉ thực hiện chức năng này:

destructorAnObject.Done;

bắt đầu

kết thúc;

Điều hữu ích trong trình hủy này không phải là thuộc tính của phần thân của nó, tuy nhiên, trình biên dịch tạo ra mã phần kết để đáp lại từ dành riêng cho trình hủy. Nó giống như một mô-đun không xuất bất cứ thứ gì, nhưng thực hiện một số hoạt động vô hình bằng cách thực hiện phần khởi tạo của nó trước khi bắt đầu chương trình. Tất cả các hành động diễn ra ở hậu trường.

32. Phương thức ảo

Một phương thức trở thành ảo nếu khai báo kiểu đối tượng của nó được theo sau bởi từ dành riêng mới là virtual. Nếu một phương thức trong kiểu mẹ được khai báo là ảo, thì tất cả các phương thức có cùng tên trong kiểu con cũng phải được khai báo là ảo để tránh lỗi trình biên dịch.

Sau đây là các đối tượng từ bảng lương ví dụ, được ảo hóa đúng cách:

loại hình

PE Jobee = ^ TE Jobee;

Temployee = đối tượng

Tên, Tiêu đề: string [25];

Tỷ lệ: Real;

phương thức khởi tạo Init (AName, ATitle: String; ARate: Real);

hàm GetPayAmount: Real; ảo;

hàm GetName: String;

hàm GetTitle: String;

hàm GetRate: Real;

thủ tục Hiển thị; ảo;

kết thúc;

Hàng giờ = ^ Hàng giờ;

THourly = object (TE Jobee);

Thời gian: Số nguyên;

phương thức khởi tạo Init (AName, ATitle: String; ARate: Real;

Thời gian: Số nguyên);

hàm GetPayAmount: Real; ảo;

hàm GetTime: Integer;

kết thúc;

PSalaried = ^ TSalaried;

TSalaried = đối tượng (TE Jobee);

hàm GetPayAmount: Real; ảo;

kết thúc;

Đã được ủy quyền = ^ TC đã được ủy quyền;

TCommissoned = đối tượng (Được trả lương);

Hoa hồng: Real;

Doanh số bán hàng: Real;

phương thức khởi tạo Init (AName, ATitle: String; ARate,

Hoa hồng, ASố tiền bán hàng: Thực);

hàm GetPayAmount: Real; ảo;

kết thúc;

Hàm tạo là một loại thủ tục đặc biệt thực hiện một số thiết lập hoạt động cho cơ chế phương thức ảo. Hơn nữa, phương thức khởi tạo phải được gọi trước khi bất kỳ phương thức ảo nào được gọi. Việc gọi một phương thức ảo mà không gọi phương thức khởi tạo trước có thể chặn hệ thống và không có cách nào để trình biên dịch kiểm tra thứ tự các phương thức được gọi.

Mọi kiểu đối tượng có các phương thức ảo đều phải có một phương thức khởi tạo.

Phương thức khởi tạo phải được gọi trước khi bất kỳ phương thức ảo nào khác được gọi. Việc gọi một phương thức ảo mà không có lệnh gọi trước đến phương thức khởi tạo có thể gây ra khóa hệ thống và trình biên dịch không thể kiểm tra thứ tự các phương thức được gọi.

33. Các trường dữ liệu đối tượng và các tham số phương thức chính thức

Hàm ý của thực tế là các phương thức và đối tượng của chúng có chung một phạm vi là các tham số chính thức của một phương thức không thể giống với bất kỳ trường dữ liệu nào của đối tượng. Đây không phải là một số giới hạn mới do lập trình hướng đối tượng đặt ra, mà là các quy tắc phạm vi cũ mà Pascal luôn có. Điều này cũng giống như việc cấm các tham số chính thức của một thủ tục giống hệt với các biến cục bộ của thủ tục. Hãy xem xét một ví dụ minh họa lỗi này cho một thủ tục:

thủ tục CrunchIt (Crunchee: MyDataRec, Crunchby,

ErrorCode: số nguyên);

A, B: ký tự;

ErrorCode: số nguyên;

bắt đầu

.

.

.

kết thúc;

Một lỗi xảy ra trên dòng chứa khai báo ErrorCode biến cục bộ. Điều này là do các định danh của tham số hình thức và biến cục bộ là giống nhau.

Các biến cục bộ của một thủ tục và các tham số chính thức của nó có chung một phạm vi và do đó không thể giống hệt nhau. Bạn sẽ nhận được thông báo "Lỗi 4: Số nhận dạng trùng lặp" nếu bạn cố gắng biên dịch một cái gì đó như thế này. Lỗi tương tự cũng xảy ra khi cố gắng gán một tham số phương thức chính thức cho tên của trường đối tượng mà phương thức này thuộc về.

Các trường hợp có phần khác nhau, vì việc đặt tiêu đề chương trình con bên trong cấu trúc dữ liệu là một sự đổi mới trong Turbo Pascal, nhưng các nguyên tắc cơ bản của phạm vi Pascal không thay đổi.

Bạn vẫn cần tôn trọng một nền văn hóa cụ thể khi chọn các số nhận dạng biến và tham số. Một số kiểu lập trình cung cấp cách đặt tên cho các trường kiểu để giảm nguy cơ trùng lặp số nhận dạng. Ví dụ: ký hiệu tiếng Hungary gợi ý rằng tên trường bắt đầu bằng tiền tố "m".

34. Đóng gói

Sự kết hợp của mã và dữ liệu trong một đối tượng được gọi là tính đóng gói. Về nguyên tắc, có thể cung cấp đủ các phương thức để người dùng của một đối tượng sẽ không bao giờ truy cập trực tiếp vào các trường của đối tượng. Một số ngôn ngữ hướng đối tượng khác, chẳng hạn như Smalltalk, yêu cầu đóng gói bắt buộc, nhưng Borland Pascal có một sự lựa chọn.

Ví dụ: các đối tượng TE Employee và THourly được viết theo cách mà hoàn toàn không cần truy cập trực tiếp vào các trường dữ liệu nội bộ của chúng:

kiểu

Temployee = đối tượng

Tên, Tiêu đề: string [25];

Tỷ lệ: Real;

thủ tục Init (AName, ATitle: string; ARate: Real);

hàm GetName: String;

hàm GetTitle: String;

hàm GetRate: Real;

hàm GetPayAmount: Real;

kết thúc;

THourly = object (TE Jobee)

Thời gian: Số nguyên;

thủ tục Init (AName, ATitle: string; ARate:

Thực tế, Atime: Số nguyên);

hàm GetPayAmount: Real;

kết thúc;

Ở đây chỉ có bốn trường dữ liệu: Tên, Tiêu đề, Tỷ lệ và Thời gian. Phương thức GetName và GetTitle lần lượt hiển thị họ và chức vụ của nhân viên. Phương thức GetPayAmount sử dụng Tỷ lệ và trong trường hợp Làm việc Hàng giờ và Thời gian để tính toán số tiền thanh toán cho công việc đang làm việc. Không còn cần thiết phải tham chiếu trực tiếp đến các trường dữ liệu này.

Giả sử có sự tồn tại của một phiên bản AnHourly kiểu THourly, chúng ta có thể sử dụng một tập hợp các phương thức để thao tác các trường dữ liệu của AnHourly, như sau:

với một giờ làm

bắt đầu

Init (Aleksandr Petrov, Nhà điều hành thang máy Fork '12.95, 62);

{Hiển thị họ, chức vụ và số tiền

thanh toán}

Chỉ;

kết thúc;

Cần lưu ý rằng việc truy cập vào các trường của một đối tượng chỉ được thực hiện với sự trợ giúp của các phương thức của đối tượng này.

35. Mở rộng Đối tượng

Nếu một kiểu dẫn xuất được xác định, thì các phương thức của kiểu mẹ sẽ được kế thừa, nhưng chúng có thể bị ghi đè nếu muốn. Để ghi đè một phương thức kế thừa, chỉ cần khai báo một phương thức mới có cùng tên với phương thức được kế thừa, nhưng có phần thân khác và (nếu cần) một bộ tham số khác.

Hãy xác định một loại TE Employee đại diện cho một nhân viên được trả lương theo giờ trong ví dụ sau:

const

PayPeriods = 26; {kỳ thanh toán}

Ngưỡng ngoài giờ = 80; {cho khoảng thời gian thanh toán}

OvertimeFactor = 1.5; {tỷ lệ hàng giờ}

kiểu

THourly = object (TE Jobee)

Thời gian: Số nguyên;

thủ tục Init (AName, ATitle: string; ARate:

Thực tế, Atime: Số nguyên);

hàm GetPayAmount: Real;

kết thúc;

thủ tục THourly.Init (AName, ATitle: string;

ARate: Thực, Atime: Số nguyên);

bắt đầu

TE Jobee.Init (AName, ATitle, ARate);

Thời gian: = ATime;

kết thúc;

chức năng THourly.GetPayAmount: Real;

Tăng ca: Số nguyên;

bắt đầu

Overtime: = Time - OvertimeThreshold;

nếu Overtime> 0 thì

GetPayAmount: = RoundPay (OvertimeThreshold * Tỷ lệ

+

RateOverTime * OvertimeFactor

*Tỷ lệ)

khác

GetPayAmount: = RoundPay (Thời gian * Tỷ lệ)

kết thúc;

Khi gọi một phương thức được ghi đè, bạn phải chắc chắn rằng kiểu đối tượng dẫn xuất bao gồm chức năng của cha mẹ. Ngoài ra, bất kỳ thay đổi nào trong phương thức cha sẽ tự động ảnh hưởng đến tất cả các phương thức con.

Lưu ý quan trọng: Mặc dù có thể ghi đè các phương thức, nhưng không thể ghi đè các trường dữ liệu. Khi một trường dữ liệu đã được xác định trong phân cấp đối tượng, không có kiểu con nào có thể xác định một trường dữ liệu có tên giống hệt nhau.

36. Khả năng tương thích của các loại đối tượng

Kế thừa sửa đổi các quy tắc tương thích kiểu của Borland Pascal ở một mức độ nào đó. Một hậu duệ kế thừa khả năng tương thích kiểu của tất cả các tổ tiên của nó.

Khả năng tương thích kiểu mở rộng này có ba dạng:

1) giữa các triển khai của các đối tượng;

2) giữa các con trỏ đến các triển khai đối tượng;

3) giữa các tham số chính thức và thực tế. Khả năng tương thích kiểu chỉ mở rộng từ con đến cha.

Ví dụ: TSalaried là con của TE Employee và TCommissoned là con của TSalaried. Hãy xem xét các mô tả sau:

AnE Employee: Người lao động;

ASalaried: Phân bổ theo TSalaried;

Đã được ủy thác: TComised;

TE JobeePtr: ^ TE Jobee;

TSalariedPtr: ^ TSalaried;

TCommissonedPtr: ^ TC đã được ủy quyền;

Theo các mô tả này, các toán tử gán sau là hợp lệ:

AnE Employee: = ASalaried;

ASalaried: = Được ủy quyền;

TCommissonedPtr: = Được ủy quyền;

Nói chung, quy tắc tương thích kiểu được xây dựng như sau: nguồn phải có khả năng lấp đầy hoàn toàn bộ thu. Kiểu gốc chứa mọi thứ mà kiểu mẹ của chúng chứa do thuộc tính kế thừa. Do đó, kiểu dẫn xuất có kích thước không nhỏ hơn kích thước của kiểu mẹ. Việc gán một đối tượng cha cho một đối tượng con có thể khiến một số trường của đối tượng cha không được xác định, điều này rất nguy hiểm và do đó bất hợp pháp.

Trong câu lệnh gán, chỉ các trường chung cho cả hai kiểu mới được sao chép từ nguồn đến đích. Trong toán tử gán:

AnE Employee: = Được ủy quyền;

Chỉ các trường Tên, Chức danh và Tỷ lệ từ ACom Ủy viên mới được sao chép sang AnEprisee, vì đây là những trường duy nhất được chia sẻ giữa TCom Ủy viên và Người làm việc ở cấp độ cao. Khả năng tương thích kiểu cũng hoạt động giữa các con trỏ tới các kiểu đối tượng và tuân theo các quy tắc chung giống như đối với việc triển khai đối tượng. Một con trỏ đến con có thể được gán cho một con trỏ tới cha. Với các định nghĩa trước, các phép gán con trỏ sau là hợp lệ:

TSalariedPtr: = TCommissonedPtr;

TE JobeePtr: = TSalariedPtr;

TE JobeePtr: = PCommissonedPtr;

Một tham số hình thức (hoặc một giá trị hoặc một tham số biến) của một kiểu đối tượng nhất định có thể coi tham số thực của nó là một đối tượng thuộc kiểu riêng của nó hoặc các đối tượng thuộc tất cả các kiểu con. Nếu bạn xác định một tiêu đề thủ tục như thế này:

thủ tục CalcFedTax (Nạn nhân: TSalaried);

thì các loại tham số thực tế có thể là TSalaried hoặc TCommissoned, nhưng không phải là TE Jobee. Nạn nhân cũng có thể là một tham số biến. Trong trường hợp này, các quy tắc tương thích tương tự được tuân theo.

Tham số giá trị là một con trỏ đến đối tượng thực tế đang được truyền dưới dạng tham số và tham số biến là bản sao của tham số thực. Bản sao này chỉ bao gồm những trường là một phần của kiểu tham số giá trị chính thức. Điều này có nghĩa là tham số thực được chuyển đổi thành kiểu của tham số chính thức.

37. Giới thiệu về trình lắp ráp

Đã có thời gian, trình hợp ngữ là một ngôn ngữ nếu không biết nó là một ngôn ngữ không thể làm cho máy tính làm được bất cứ điều gì hữu ích. Dần dần tình hình đã thay đổi. Nhiều phương tiện giao tiếp tiện lợi hơn với máy tính đã xuất hiện. Nhưng không giống như các ngôn ngữ khác, trình dịch hợp ngữ không chết; hơn nữa, về nguyên tắc, nó không thể làm điều này. Tại sao? Để tìm kiếm câu trả lời, chúng tôi sẽ cố gắng hiểu ngôn ngữ hợp ngữ nói chung là gì.

Tóm lại, hợp ngữ là một biểu diễn tượng trưng của ngôn ngữ máy. Tất cả các tiến trình trong máy ở mức thấp nhất, mức phần cứng chỉ được điều khiển bởi các lệnh (lệnh) của ngôn ngữ máy. Từ đó rõ ràng rằng, mặc dù có tên chung, nhưng hợp ngữ cho mỗi loại máy tính là khác nhau. Điều này cũng áp dụng cho sự xuất hiện của các chương trình được viết bằng trình dịch hợp ngữ và những ý tưởng mà ngôn ngữ này phản ánh.

Thực sự việc giải quyết các vấn đề liên quan đến phần cứng (hoặc thậm chí nhiều hơn là những vấn đề liên quan đến phần cứng, chẳng hạn như tăng tốc một chương trình chẳng hạn) là không thể nếu không có kiến ​​thức về trình hợp dịch.

Một lập trình viên hoặc bất kỳ người dùng nào khác có thể sử dụng bất kỳ công cụ cấp cao nào cho đến các chương trình để xây dựng thế giới ảo và thậm chí có thể không nghi ngờ rằng máy tính thực sự không thực hiện các lệnh của ngôn ngữ mà chương trình của nó được viết, mà là biểu diễn đã được biến đổi của chúng. dưới dạng một chuỗi lệnh nhàm chán và buồn tẻ của một ngôn ngữ hoàn toàn khác - ngôn ngữ máy. Bây giờ hãy tưởng tượng rằng một người dùng như vậy có một vấn đề không chuẩn. Ví dụ, chương trình của anh ta phải hoạt động với một số thiết bị bất thường hoặc thực hiện các hành động khác đòi hỏi kiến ​​thức về nguyên tắc của phần cứng máy tính. Bất kể ngôn ngữ mà lập trình viên viết chương trình của anh ta có tốt đến đâu, anh ta cũng không thể làm được nếu không biết trình hợp dịch. Và không phải ngẫu nhiên mà hầu hết tất cả các trình biên dịch của các ngôn ngữ bậc cao đều chứa các phương tiện kết nối các mô-đun của chúng với các mô-đun trong trình hợp dịch hoặc hỗ trợ truy cập vào trình độ lập trình trình hợp dịch.

Máy tính được tạo thành từ một số thiết bị vật lý, mỗi thiết bị được kết nối với một đơn vị duy nhất được gọi là đơn vị hệ thống.

38. Mô hình phần mềm của bộ vi xử lý

Trên thị trường máy tính hiện nay, có rất nhiều loại máy tính khác nhau. Do đó, có thể giả định rằng người tiêu dùng sẽ có một câu hỏi - làm thế nào để đánh giá khả năng của một loại (hoặc mô hình) máy tính cụ thể và các tính năng khác biệt của nó với các máy tính thuộc các loại (mô hình) khác.

Chỉ xem xét sơ đồ khối của một máy tính là không đủ cho điều này, vì về cơ bản nó khác nhau rất ít ở các máy khác nhau: tất cả các máy tính đều có RAM, bộ xử lý và các thiết bị bên ngoài.

Khác nhau là cách thức, phương tiện và tài nguyên được sử dụng mà máy tính hoạt động như một cơ chế duy nhất.

Để tập hợp tất cả các khái niệm đặc trưng cho một máy tính về các thuộc tính được điều khiển bằng chương trình chức năng của nó, có một thuật ngữ đặc biệt - kiến ​​trúc máy tính.

Lần đầu tiên, khái niệm kiến ​​trúc máy tính bắt đầu được đề cập với sự ra đời của các máy thế hệ thứ 3 để đánh giá so sánh chúng.

Chỉ nên bắt đầu học hợp ngữ của bất kỳ máy tính nào sau khi tìm ra phần nào của máy tính có thể nhìn thấy và sẵn sàng để lập trình bằng ngôn ngữ này. Đây là cái gọi là mô hình chương trình máy tính, một phần của nó là mô hình chương trình vi xử lý, chứa 32 thanh ghi ít nhiều có sẵn để người lập trình sử dụng.

Các thanh ghi này có thể được chia thành hai nhóm lớn:

1) 16 đăng ký người dùng;

2) 16 thanh ghi hệ thống.

Các chương trình hợp ngữ sử dụng thanh ghi rất nhiều. Hầu hết các thanh ghi có một mục đích chức năng cụ thể.

Ngoài các thanh ghi được liệt kê ở trên, các nhà phát triển bộ xử lý giới thiệu các thanh ghi bổ sung vào mô hình phần mềm được thiết kế để tối ưu hóa một số lớp tính toán nhất định. Vì vậy, trong dòng vi xử lý Pentium Pro (MMX) của Intel Corporation, phần mở rộng MMX của Intel đã được giới thiệu. Nó bao gồm 8 thanh ghi 0-bit (MM7-MM64) và cho phép bạn thực hiện các phép toán số nguyên trên các cặp của một số kiểu dữ liệu mới:

1) tám byte được đóng gói;

2) bốn từ đóng gói;

3) hai từ kép;

4) từ bốn tiếng;

Nói cách khác, với một lệnh mở rộng MMX, chẳng hạn, người lập trình có thể thêm hai từ kép lại với nhau. Về mặt vật lý, không có đăng ký mới nào được thêm vào. MM0-MM7 là phần định trị (64 bit thấp hơn) của một chồng các thanh ghi FPU (đơn vị dấu chấm động - bộ đồng xử lý) 80 bit.

Ngoài ra, hiện tại có các phần mở rộng sau của mô hình lập trình - 3DNOW! từ AMD; SSE, SSE2, SSE3, SSE4. 4 phần mở rộng cuối cùng được hỗ trợ bởi cả bộ vi xử lý AMD và Intel.

39. Đăng ký người dùng

Như tên của nó, thanh ghi người dùng được gọi vì lập trình viên có thể sử dụng chúng khi viết chương trình của mình. Các thanh ghi này bao gồm:

1) tám thanh ghi 32-bit mà người lập trình có thể sử dụng để lưu trữ dữ liệu và địa chỉ (chúng còn được gọi là thanh ghi mục đích chung (RON)):

▪ eax/ax/ah/al;

▪ ebx/bx/bh/bl;

▪ edx/dx/dh/dl;

▪ ecx/cx/ch/cl;

▪ ebp/bp;

▪ esi/si;

▪ edi/di;

▪ esp/sp.

2) sáu thanh ghi phân đoạn:

▪ cs;

▪ ds;

▪ ss;

▪ es;

▪ fs;

▪ gs;

3) thanh ghi trạng thái và điều khiển:

▪ регистр флагов eflags/flags;

▪ регистр указателя команды eip/ip.

Hình sau cho thấy các thanh ghi chính của bộ vi xử lý:

Sổ đăng ký mục đích chung

40. Thanh ghi chung

Tất cả các đăng ký của nhóm này cho phép bạn truy cập các phần "thấp hơn" của chúng. Chỉ các phần 16 và 8 bit thấp hơn của các thanh ghi này có thể được sử dụng để tự định địa chỉ. 16 bit trên của các thanh ghi này không có sẵn như các đối tượng độc lập.

Hãy liệt kê các thanh ghi thuộc nhóm thanh ghi đa dụng. Vì các thanh ghi này được đặt vật lý trong bộ vi xử lý bên trong đơn vị logic số học (ALU), chúng còn được gọi là thanh ghi ALU:

1) eax / ax / ah / al (Thanh ghi bộ tích lũy) - pin. Dùng để lưu trữ dữ liệu trung gian. Trong một số lệnh, việc sử dụng thanh ghi này là bắt buộc;

2) ebx / bx / bh / bl (Thanh ghi cơ sở) - thanh ghi cơ sở. Được sử dụng để lưu trữ địa chỉ cơ sở của một số đối tượng trong bộ nhớ;

3) ecx / cx / ch / cl (Thanh ghi đếm) - thanh ghi bộ đếm. Nó được sử dụng trong các lệnh thực hiện một số hành động lặp đi lặp lại. Việc sử dụng nó thường được ngầm hiểu và ẩn trong thuật toán của lệnh tương ứng.

Ví dụ, lệnh tổ chức vòng lặp, ngoài việc chuyển quyền điều khiển đến một lệnh đặt tại một địa chỉ nhất định, phân tích và giảm giá trị của thanh ghi ecx / cx từng cái một;

4) edx / dx / dh / dl (Data register) - thanh ghi dữ liệu.

Cũng giống như thanh ghi eax / ax / ah / al, nó lưu trữ dữ liệu trung gian. Một số lệnh yêu cầu sử dụng nó; đối với một số lệnh, điều này xảy ra ngầm.

Hai thanh ghi sau được sử dụng để hỗ trợ cái gọi là hoạt động chuỗi, tức là các hoạt động xử lý tuần tự các chuỗi phần tử, mỗi thanh ghi có thể dài 32, 16 hoặc 8 bit:

1) esi / si (Thanh ghi chỉ mục nguồn) - chỉ mục nguồn. Thanh ghi này trong các hoạt động chuỗi chứa địa chỉ hiện tại của phần tử trong chuỗi nguồn;

2) edi / di (Thanh ghi chỉ số đích) - chỉ số của người nhận (người nhận). Thanh ghi này trong chuỗi hoạt động chứa địa chỉ hiện tại trong chuỗi đích.

Trong kiến ​​trúc của bộ vi xử lý ở cấp độ phần cứng và phần mềm, cấu trúc dữ liệu như một ngăn xếp được hỗ trợ. Để làm việc với ngăn xếp trong hệ thống lệnh bộ vi xử lý, có các lệnh đặc biệt và trong mô hình phần mềm bộ vi xử lý có các thanh ghi đặc biệt cho việc này:

1) esp / sp (Stack Pointer register) - thanh ghi con trỏ ngăn xếp. Chứa một con trỏ đến đầu ngăn xếp trong phân đoạn ngăn xếp hiện tại.

2) ebp / bp (Thanh ghi con trỏ cơ sở) - thanh ghi con trỏ cơ sở khung ngăn xếp. Được thiết kế để tổ chức truy cập ngẫu nhiên vào dữ liệu bên trong ngăn xếp.

Việc sử dụng ghim cứng các thanh ghi cho một số lệnh giúp cho việc mã hóa biểu diễn máy của chúng nhỏ gọn hơn. Biết các tính năng này, nếu cần thiết sẽ tiết kiệm ít nhất một vài byte bộ nhớ bị chiếm bởi mã chương trình.

41. Thanh ghi phân đoạn

Có sáu thanh ghi phân đoạn trong mô hình phần mềm vi xử lý: cs, ss, ds, es, gs, fs.

Sự tồn tại của chúng là do các đặc điểm cụ thể của việc tổ chức và sử dụng RAM của bộ vi xử lý Intel. Nó nằm ở chỗ phần cứng của bộ vi xử lý hỗ trợ tổ chức cấu trúc của chương trình dưới dạng ba phần, được gọi là phân đoạn. Theo đó, một tổ chức bộ nhớ như vậy được gọi là phân đoạn.

Để chỉ ra các phân đoạn mà chương trình có quyền truy cập tại một thời điểm cụ thể, các thanh ghi phân đoạn được dự định. Trên thực tế (với một chút chỉnh sửa) các thanh ghi này chứa các địa chỉ bộ nhớ mà từ đó các phân đoạn tương ứng bắt đầu. Logic của việc xử lý một lệnh máy được xây dựng theo cách mà khi tìm nạp một lệnh, truy cập dữ liệu chương trình hoặc truy cập ngăn xếp, các địa chỉ trong các thanh ghi phân đoạn được xác định rõ ràng được sử dụng ngầm.

Bộ vi xử lý hỗ trợ các loại phân đoạn sau.

1. Đoạn mã. Chứa các lệnh chương trình. Để truy cập phân đoạn này, thanh ghi cs (thanh ghi đoạn mã) được sử dụng - thanh ghi mã phân đoạn. Nó chứa địa chỉ của phân đoạn lệnh máy mà bộ vi xử lý có quyền truy cập (tức là các lệnh này được tải vào đường ống của bộ vi xử lý).

2. Phân đoạn dữ liệu. Chứa dữ liệu do chương trình xử lý. Để truy cập phân đoạn này, thanh ghi ds (thanh ghi phân đoạn dữ liệu) được sử dụng - một thanh ghi dữ liệu phân đoạn lưu trữ địa chỉ của phân đoạn dữ liệu của chương trình hiện tại.

3. Phân đoạn ngăn xếp. Phân đoạn này là một vùng bộ nhớ được gọi là ngăn xếp. Bộ vi xử lý tổ chức công việc với ngăn xếp theo nguyên tắc sau: phần tử cuối cùng ghi vào vùng này được chọn trước. Để truy cập phân đoạn này, thanh ghi ss (thanh ghi phân đoạn ngăn xếp) được sử dụng - thanh ghi phân đoạn ngăn xếp chứa địa chỉ của phân đoạn ngăn xếp.

4. Phân đoạn dữ liệu bổ sung. Mặc nhiên, các thuật toán để thực hiện hầu hết các lệnh máy giả định rằng dữ liệu mà chúng xử lý nằm trong phân đoạn dữ liệu, địa chỉ của phân đoạn này nằm trong thanh ghi phân đoạn ds. Nếu một phân đoạn dữ liệu không đủ cho chương trình, thì chương trình có cơ hội sử dụng thêm ba phân đoạn dữ liệu bổ sung. Nhưng không giống như phân đoạn dữ liệu chính, có địa chỉ được chứa trong thanh ghi phân đoạn ds, khi sử dụng phân đoạn dữ liệu bổ sung, địa chỉ của chúng phải được chỉ định rõ ràng bằng cách sử dụng các tiền tố xác định lại phân đoạn đặc biệt trong lệnh. Địa chỉ của các đoạn dữ liệu bổ sung phải được chứa trong các thanh ghi es, gs, fs (thanh ghi đoạn dữ liệu mở rộng).

42. Thanh ghi trạng thái và điều khiển

Bộ vi xử lý bao gồm một số thanh ghi liên tục chứa thông tin về trạng thái của cả bản thân bộ vi xử lý và chương trình có các lệnh hiện được tải vào đường ống. Các thanh ghi này bao gồm:

1) cờ đăng ký eflags / cờ;

2) Thanh ghi con trỏ lệnh eip / ip.

Sử dụng các thanh ghi này, bạn có thể nhận được thông tin về kết quả thực thi lệnh và ảnh hưởng đến trạng thái của chính bộ vi xử lý. Chúng ta hãy xem xét chi tiết hơn mục đích và nội dung của các thanh ghi này.

1. eflags / flags (thanh ghi cờ) - thanh ghi cờ. Độ sâu bit của eflags / cờ là 32/16 bit. Các bit riêng lẻ của thanh ghi này có một mục đích chức năng cụ thể và được gọi là cờ. Phần dưới của thanh ghi này hoàn toàn tương tự như thanh ghi cờ cho i8086.

Tùy thuộc vào cách chúng được sử dụng, các cờ của thanh ghi eflags / cờ có thể được chia thành ba nhóm:

1) tám cờ trạng thái.

Các cờ này có thể thay đổi sau khi các lệnh của máy được thực thi. Các cờ trạng thái của thanh ghi eflags phản ánh các chi tiết cụ thể của kết quả thực hiện các phép toán số học hoặc logic. Điều này làm cho nó có thể phân tích trạng thái của quá trình tính toán và phản hồi nó bằng cách sử dụng các lệnh nhảy có điều kiện và lệnh gọi chương trình con.

2) một cờ điều khiển.

Ký hiệu là df (Cờ thư mục). Nó nằm ở bit 10 của thanh ghi eflags và được sử dụng bởi các lệnh chuỗi. Giá trị của cờ df xác định hướng xử lý từng phần tử trong các hoạt động này: từ đầu chuỗi đến cuối (df = 0) hoặc ngược lại, từ cuối chuỗi đến đầu của nó (df = 1). Để làm việc với cờ df, có các lệnh đặc biệt: cld (bỏ cờ df) và std (đặt cờ df).

Việc sử dụng các lệnh này cho phép bạn điều chỉnh cờ df phù hợp với thuật toán và đảm bảo rằng các bộ đếm được tự động tăng hoặc giảm khi thực hiện các thao tác trên chuỗi. 3) năm cờ hệ thống.

Điều khiển I / O, ngắt có thể che, gỡ lỗi, chuyển đổi tác vụ và chế độ ảo 8086. Các chương trình ứng dụng không nên sửa đổi các cờ này một cách không cần thiết, vì điều này sẽ khiến chương trình kết thúc trong hầu hết các trường hợp.

2. eip / ip (Instraction Pointer register) - thanh ghi con trỏ lệnh. Thanh ghi eip / ip có chiều rộng 32/16 bit và chứa phần bù của lệnh tiếp theo sẽ được thực hiện so với nội dung của thanh ghi đoạn cs trong đoạn lệnh hiện tại. Thanh ghi này không thể truy cập trực tiếp đối với lập trình viên, nhưng giá trị của nó được tải và thay đổi bởi các lệnh điều khiển khác nhau, bao gồm các lệnh cho các bước nhảy có điều kiện và không điều kiện, các thủ tục gọi và quay trở lại từ các thủ tục. Sự xuất hiện của các ngắt cũng sửa đổi thanh ghi eip / ip.

43. Thanh ghi hệ thống vi xử lý

Tên của các thanh ghi này gợi ý rằng chúng thực hiện các chức năng cụ thể trong hệ thống. Việc sử dụng các thanh ghi hệ thống được quy định chặt chẽ. Chính họ là người cung cấp chế độ được bảo vệ. Chúng cũng có thể được coi là một phần của kiến ​​trúc bộ vi xử lý, được cố ý để lộ ra ngoài để một lập trình viên hệ thống đủ điều kiện có thể thực hiện các hoạt động cấp thấp nhất.

Thanh ghi hệ thống có thể được chia thành ba nhóm:

1) bốn thanh ghi điều khiển;

Nhóm thanh ghi điều khiển bao gồm 4 thanh ghi:

▪ cr0;

▪ cr1;

▪ cr2;

▪ cr3;

2) bốn thanh ghi địa chỉ hệ thống (còn gọi là thanh ghi quản lý bộ nhớ);

Thanh ghi địa chỉ hệ thống bao gồm các thanh ghi sau:

▪ регистр таблицы глобальных дескрипторов gdtr;

▪ регистр таблицы локальных дескрипторов Idtr;

▪ регистр таблицы дескрипторов прерываний idtr;

▪ 16-битовый регистр задачи tr;

3) tám thanh ghi gỡ lỗi. Bao gồm các:

▪ dr0;

▪ dr1;

▪ dr2;

▪ dr3;

▪ dr4;

▪ dr5;

▪ dr6;

▪ dr7.

Kiến thức về thanh ghi hệ thống là không cần thiết để viết chương trình trong Assembler, do thực tế là chúng được sử dụng chủ yếu cho các hoạt động cấp thấp nhất. Tuy nhiên, xu hướng phát triển phần mềm hiện tại (đặc biệt là do khả năng tối ưu hóa được gia tăng đáng kể của các trình biên dịch hiện đại của các ngôn ngữ cấp cao, thường tạo ra mã có hiệu quả vượt trội so với mã của con người) đang thu hẹp phạm vi của Assembler để giải quyết mức thấp nhất. -các vấn đề cấp độ, trong đó kiến ​​thức về các thanh ghi trên có thể trở nên rất hữu ích.

44. Thanh ghi điều khiển

Nhóm thanh ghi điều khiển bao gồm bốn thanh ghi: cr0, cr1, cr2, cr3. Các thanh ghi này dùng để điều khiển hệ thống chung. Thanh ghi điều khiển chỉ khả dụng cho các chương trình có mức đặc quyền 0.

Mặc dù bộ vi xử lý có bốn thanh ghi điều khiển, nhưng chỉ có ba thanh ghi trong số đó khả dụng - cr1 bị loại trừ, các chức năng của chúng vẫn chưa được xác định (nó được dành để sử dụng trong tương lai).

Thanh ghi cr0 chứa các cờ hệ thống điều khiển các chế độ hoạt động của bộ vi xử lý và phản ánh trạng thái của nó trên toàn cầu, bất kể các tác vụ cụ thể đang được thực hiện.

Mục đích của cờ hệ thống:

1) pe (Protect Enable), bit 0 - bật chế độ được bảo vệ. Trạng thái của cờ này cho biết chế độ nào trong hai chế độ - thực (pe = 0) hoặc được bảo vệ (pe = 1) - bộ vi xử lý đang hoạt động tại một thời điểm nhất định;

2) mp (Math Present), bit 1 - sự hiện diện của bộ đồng xử lý. Luôn luôn là 1;

3) ts (Task Switched), bit 3 - chuyển đổi nhiệm vụ. Bộ xử lý tự động đặt bit này khi nó chuyển sang tác vụ khác;

4) am (Alignment Mask), bit 18 - mặt nạ căn chỉnh.

Bit này cho phép (am = 1) hoặc tắt (am = 0) điều khiển căn chỉnh;

5) cd (Cache Disable), bit 30 - vô hiệu hóa bộ nhớ cache.

Sử dụng bit này, bạn có thể vô hiệu hóa (cd = 1) hoặc cho phép (cd = 0) sử dụng bộ đệm bên trong (bộ đệm cấp đầu tiên);

6) pg (PaGing), bit 31 - bật (pg = 1) hoặc vô hiệu hóa (pg = 0) phân trang.

Cờ được sử dụng trong mô hình phân trang của tổ chức bộ nhớ.

Thanh ghi cr2 được sử dụng trong phân trang RAM để đăng ký tình huống khi lệnh hiện tại truy cập địa chỉ chứa trong trang bộ nhớ hiện không có trong bộ nhớ.

Trong trường hợp này, ngoại lệ số 14 xảy ra trong bộ vi xử lý và địa chỉ 32 bit tuyến tính của lệnh gây ra ngoại lệ này được ghi vào thanh ghi cr2. Với thông tin này, trình xử lý ngoại lệ 14 xác định trang mong muốn, hoán đổi trang đó vào bộ nhớ và tiếp tục hoạt động bình thường của chương trình;

Thanh ghi cr3 cũng được sử dụng cho bộ nhớ phân trang. Đây là cái gọi là thanh ghi thư mục trang cấp một. Nó chứa địa chỉ cơ sở vật lý 20 bit của thư mục trang của nhiệm vụ hiện tại. Thư mục này chứa 1024 bộ mô tả 32 bit, mỗi bộ mô tả chứa địa chỉ của bảng trang cấp hai. Đổi lại, mỗi bảng trang cấp hai chứa 1024 bộ mô tả 32-bit đánh địa chỉ các khung trang trong bộ nhớ. Kích thước khung trang là 4 KB.

45. Thanh ghi địa chỉ hệ thống

Các thanh ghi này còn được gọi là thanh ghi quản lý bộ nhớ.

Chúng được thiết kế để bảo vệ các chương trình và dữ liệu trong chế độ đa nhiệm của bộ vi xử lý. Khi hoạt động ở chế độ được bảo vệ bằng bộ vi xử lý, không gian địa chỉ được chia thành:

1) toàn cầu - chung cho tất cả các nhiệm vụ;

2) cục bộ - riêng biệt cho từng nhiệm vụ. Sự tách biệt này giải thích sự hiện diện của các thanh ghi hệ thống sau trong kiến ​​trúc bộ vi xử lý:

1) thanh ghi của bảng bộ mô tả toàn cục gdtr (Global Descriptor Table Register), có kích thước 48 bit và chứa địa chỉ cơ sở 32 bit (bit 16-47) của bảng bộ mô tả toàn cục GDT và 16 bit (bit 0-15) giá trị giới hạn, có kích thước tính bằng byte của bảng GDT;

2) thanh ghi bảng bộ mô tả cục bộ ldtr (Local Descriptor Table Register), có kích thước 16 bit và chứa cái gọi là bộ chọn bộ mô tả của bảng bộ mô tả cục bộ LDT. Bộ chọn này là một con trỏ tới GDT mô tả phân đoạn có chứa bảng mô tả cục bộ LDT;

3) thanh ghi của bảng bộ mô tả ngắt idtr (Interrupt Descriptor Table Register), có kích thước 48 bit và chứa địa chỉ cơ sở 32 bit (bit 16-47) của bảng bộ mô tả ngắt IDT và 16 bit (bit 0-15) giá trị giới hạn, có kích thước tính bằng byte của bảng IDT;

4) Thanh ghi tác vụ 16-bit tr (Thanh ghi tác vụ), giống như thanh ghi ldtr, chứa một bộ chọn, tức là một con trỏ đến một bộ mô tả trong bảng GDT. Bộ mô tả này mô tả Trạng thái Phân đoạn Nhiệm vụ (TSS) hiện tại. Phân đoạn này được tạo cho từng tác vụ trong hệ thống, có cấu trúc được quy định chặt chẽ và chứa bối cảnh (trạng thái hiện tại) của tác vụ. Mục đích chính của các phân đoạn TSS là lưu trạng thái hiện tại của một tác vụ tại thời điểm chuyển sang một tác vụ khác.

46. ​​Thanh ghi gỡ lỗi

Đây là một nhóm thanh ghi rất thú vị dùng để gỡ lỗi phần cứng. Các công cụ gỡ lỗi phần cứng lần đầu tiên xuất hiện trong bộ vi xử lý i486. Về phần cứng, bộ vi xử lý chứa tám thanh ghi gỡ lỗi, nhưng chỉ sáu trong số chúng thực sự được sử dụng.

Các thanh ghi dr0, dr1, dr2, dr3 có chiều rộng 32 bit và được thiết kế để đặt địa chỉ tuyến tính của bốn điểm dừng. Cơ chế được sử dụng trong trường hợp này như sau: bất kỳ địa chỉ nào do chương trình hiện tại tạo ra sẽ được so sánh với các địa chỉ trong thanh ghi dr0... dr3 và nếu có sự trùng khớp, một ngoại lệ gỡ lỗi với số 1 sẽ được tạo.

Thanh ghi dr6 được gọi là thanh ghi trạng thái gỡ lỗi. Các bit trong thanh ghi này được đặt theo nguyên nhân khiến số ngoại lệ cuối cùng xảy ra.

Chúng tôi liệt kê các bit này và mục đích của chúng:

1) b0 - nếu bit này được đặt thành 1, thì ngoại lệ cuối cùng (ngắt) xảy ra do đạt được điểm kiểm tra được xác định trong thanh ghi dr0;

2) b1 - tương tự như b0, nhưng đối với một điểm kiểm tra trong thanh ghi dr1;

3) b2 - tương tự như b0, nhưng đối với một điểm kiểm tra trong thanh ghi dr2;

4) b3 - tương tự như b0, nhưng đối với một điểm kiểm tra trong thanh ghi dr3;

5) bd (bit 13) - dùng để bảo vệ các thanh ghi gỡ lỗi;

6) bs (bit 14) - đặt thành 1 nếu ngoại lệ 1 được gây ra bởi trạng thái của cờ tf = 1 trong thanh ghi eflags;

7) bt (бит 15) устанавливается в 1, если исключение 1 было вызвано переключением на задачу с установленным битом ловушки в TSS t = 1. Все остальные биты в этом регистре заполняются нулями. Обработчик исключения 1 по содержимому dr6 должен определить причину, по которой произошло исключение, и выполнить необходимые действия.

Thanh ghi dr7 được gọi là thanh ghi điều khiển gỡ lỗi. Nó chứa các trường cho từng thanh ghi trong số bốn thanh ghi điểm ngắt gỡ lỗi cho phép bạn chỉ định các điều kiện sau mà theo đó ngắt sẽ được tạo:

1) vị trí đăng ký trạm kiểm soát - chỉ trong nhiệm vụ hiện tại hoặc trong bất kỳ nhiệm vụ nào. Các bit này chiếm 8 bit thấp hơn của thanh ghi dr7 (2 bit cho mỗi điểm ngắt (thực ra là điểm ngắt) được thiết lập bởi các thanh ghi dr0, drl, dr2, dr3, tương ứng).

Bit đầu tiên của mỗi cặp được gọi là độ phân giải cục bộ; thiết lập nó cho biết điểm ngắt có hiệu lực nếu nó nằm trong không gian địa chỉ của tác vụ hiện tại.

Bit thứ hai trong mỗi cặp xác định quyền toàn cục, cho biết rằng điểm ngắt đã cho hợp lệ trong không gian địa chỉ của tất cả các tác vụ nằm trong hệ thống;

2) kiểu truy cập mà ngắt được bắt đầu: chỉ khi tìm nạp một lệnh, khi viết hoặc khi ghi / đọc dữ liệu. Các bit xác định tính chất này của sự xuất hiện của ngắt nằm ở phần trên của thanh ghi này. Hầu hết các thanh ghi hệ thống đều có thể truy cập theo chương trình.

47. Cấu trúc của chương trình trong trình hợp dịch

Một chương trình hợp ngữ là một tập hợp các khối bộ nhớ được gọi là các đoạn bộ nhớ. Một chương trình có thể bao gồm một hoặc nhiều khối-phân đoạn này. Mỗi phân đoạn chứa một tập hợp các câu ngôn ngữ, mỗi câu trong số đó chiếm một dòng mã chương trình riêng biệt.

Câu lệnh hợp ngữ có bốn loại.

Các lệnh hoặc hướng dẫn là bản sao tượng trưng của lệnh máy.

Trong quá trình dịch, các lệnh hợp ngữ được chuyển thành các lệnh tương ứng của tập lệnh bộ vi xử lý. Theo quy tắc, một lệnh Assembler tương ứng với một lệnh của bộ vi xử lý, nói chung, lệnh này là điển hình cho các ngôn ngữ cấp thấp.

Dưới đây là một ví dụ về một lệnh tăng số nhị phân được lưu trữ trong thanh ghi eax lên một:

bao gồm thuế

▪ макрокоманды - оформляемые определенным образом предложения текста программы, замещаемые во время трансляции другими предложениями.

Ví dụ về macro là macro cuối chương trình sau:

macro thoát

movax, 4c00h

vào 21h

kết thúc

▪ директивы, являющиеся указанием транслятору ассемблера на выполнение некоторых действий.

Các chỉ thị không có đối tác trong biểu diễn máy móc; Ví dụ: đây là lệnh TITLE đặt tiêu đề của tệp danh sách:% TITLE "Listing 1"

▪ строки комментариев, содержащие любые символы, в том числе и буквы русского алфавита. Комментарии игнорируются транслятором. Пример:

; dòng này là một bình luận

48. Cú pháp hợp ngữ

Các câu tạo nên một chương trình có thể là một cấu trúc cú pháp tương ứng với một lệnh, macro, chỉ thị hoặc chú thích. Để người dịch hợp ngữ có thể nhận ra chúng, chúng phải được hình thành theo những quy tắc cú pháp nhất định. Để làm điều này, cách tốt nhất là sử dụng mô tả chính thức về cú pháp của ngôn ngữ, giống như các quy tắc của ngữ pháp. Các cách phổ biến nhất để mô tả một ngôn ngữ lập trình theo cách này là sơ đồ cú pháp và các dạng Backus-Naur mở rộng. Khi làm việc với sơ đồ cú pháp, hãy chú ý đến hướng di chuyển, được chỉ ra bằng các mũi tên. Sơ đồ cú pháp phản ánh logic của trình dịch khi phân tích cú pháp các câu đầu vào của chương trình.

Các ký tự hợp lệ:

1) tất cả các chữ cái Latinh: A - Z, a - z;

2) các số từ 0 đến 9;

3) dấu hiệu? @, $, &;

4) dải phân cách.

Các mã thông báo như sau.

1. Định danh - chuỗi các ký tự hợp lệ được sử dụng để chỉ định mã hoạt động, tên biến và tên nhãn. Mã định danh không thể bắt đầu bằng một số.

2. Chuỗi ký tự - chuỗi ký tự được đặt trong dấu ngoặc kép hoặc đơn.

3. Số nguyên.

Các loại câu lệnh trình hợp dịch có thể có.

1. Các toán tử số học. Bao gồm các:

1) một ngôi "+" và "-";

2) nhị phân "+" và "-";

3) phép nhân "*";

4) phép chia số nguyên "/";

5) получения остатка от деления "mod".

2. Các toán tử Shift chuyển biểu thức theo số bit được chỉ định.

3. Các toán tử so sánh (trả về "true" hoặc "false") được thiết kế để tạo thành các biểu thức logic.

4. Các toán tử logic thực hiện các phép toán bit trên các biểu thức.

5. Toán tử chỉ mục [].

6. Toán tử định nghĩa lại kiểu ptr được sử dụng để định nghĩa lại hoặc xác định loại nhãn hoặc biến được xác định bởi một biểu thức.

7. Toán tử định nghĩa lại phân đoạn ":" (dấu hai chấm) làm cho địa chỉ vật lý được tính liên quan đến thành phần phân đoạn được chỉ định.

8. Toán tử đặt tên kiểu cấu trúc "." (dấu chấm) cũng khiến trình biên dịch thực hiện các phép tính nhất định nếu nó xảy ra trong một biểu thức.

9. Toán tử để lấy thành phần phân đoạn của địa chỉ của biểu thức seg trả về địa chỉ vật lý của phân đoạn cho biểu thức, có thể là nhãn, biến, tên phân đoạn, tên nhóm hoặc một số tên tượng trưng.

10. Toán tử để lấy giá trị bù của biểu thức cho phép bạn nhận giá trị của độ lệch của biểu thức tính bằng byte so với đầu đoạn mà biểu thức được xác định.

49. Chỉ thị Phân đoạn

Phân đoạn là một phần của cơ chế tổng quát hơn liên quan đến khái niệm lập trình mô-đun. Nó liên quan đến việc thống nhất thiết kế các mô-đun đối tượng do trình biên dịch tạo ra, bao gồm cả những mô-đun từ các ngôn ngữ lập trình khác nhau. Điều này cho phép bạn kết hợp các chương trình được viết bằng các ngôn ngữ khác nhau. Các toán hạng trong chỉ thị SEGMENT nhằm mục đích triển khai các tùy chọn khác nhau cho một liên kết như vậy.

Hãy xem xét chúng chi tiết hơn.

1. Thuộc tính căn chỉnh đoạn (loại căn chỉnh) cho trình liên kết biết để đảm bảo rằng phần đầu của đoạn được đặt trên ranh giới đã chỉ định:

1) BYTE - căn chỉnh không được thực hiện;

2) WORD - phân đoạn bắt đầu từ một địa chỉ là bội số của hai, tức là bit cuối cùng (ít quan trọng nhất) của địa chỉ vật lý là 0 (được căn chỉnh với ranh giới từ);

3) DWORD - phân đoạn bắt đầu tại một địa chỉ là bội số của bốn;

4) PARA - phân đoạn bắt đầu tại một địa chỉ là bội số của 16;

5) PAGE - phân đoạn bắt đầu từ một địa chỉ là bội số của 256;

6) MEMPAGE - phân đoạn bắt đầu từ một địa chỉ là bội số của 4 KB.

2. Thuộc tính phân đoạn kết hợp (kiểu tổ hợp) cho trình liên kết biết cách kết hợp các phân đoạn của các mô-đun khác nhau có cùng tên:

1) RIÊNG TƯ - phân đoạn sẽ không được kết hợp với các phân đoạn khác có cùng tên bên ngoài mô-đun này;

2) CÔNG CỘNG - buộc trình liên kết kết nối tất cả các phân đoạn có cùng tên;

3) COMMON - có tất cả các phân đoạn có cùng tên tại cùng một địa chỉ;

4) AT xxxx - định vị đoạn ở địa chỉ tuyệt đối của đoạn;

5) STACK - định nghĩa của một đoạn ngăn xếp.

3. Thuộc tính lớp phân đoạn (kiểu lớp) là một chuỗi được trích dẫn giúp trình liên kết xác định thứ tự phân đoạn thích hợp khi lắp ráp một chương trình từ nhiều phân đoạn mô-đun.

4. Thuộc tính kích thước phân đoạn:

1) USE16 - điều này có nghĩa là phân đoạn cho phép định địa chỉ 16 bit;

2) USE32 - phân đoạn sẽ là 32-bit. Cần phải có một số cách để bù đắp cho những điều không thể.

trực tiếp kiểm soát vị trí và sự kết hợp của các phân đoạn. Để làm điều này, họ bắt đầu sử dụng chỉ thị để chỉ định mô hình bộ nhớ MODEL. Chỉ thị này liên kết các phân đoạn, trong trường hợp sử dụng các chỉ thị phân đoạn đơn giản, có tên được xác định trước, với các thanh ghi phân đoạn (mặc dù bạn vẫn phải khởi tạo ds một cách rõ ràng).

Tham số bắt buộc của chỉ thị MODEL là mô hình bộ nhớ. Tham số này xác định mô hình phân đoạn bộ nhớ cho POU. Giả định rằng một mô-đun chương trình chỉ có thể có một số loại phân đoạn nhất định, được xác định bởi các chỉ thị mô tả phân đoạn đơn giản mà chúng tôi đã đề cập trước đó.

50. Cấu trúc lệnh máy

Lệnh máy là một lệnh tới bộ vi xử lý được mã hóa theo các quy tắc nhất định để thực hiện một số hoạt động hoặc hành động. Mỗi lệnh chứa các phần tử xác định:

1) làm gì?

2) các đối tượng cần thực hiện điều gì đó (các phần tử này được gọi là toán hạng);

3) làm thế nào để làm gì?

Độ dài tối đa của một lệnh máy là 15 byte.

1. Các tiền tố.

Các phần tử lệnh máy tùy chọn, mỗi phần tử là 1 byte hoặc có thể bị bỏ qua. Trong bộ nhớ, các tiền tố đứng trước lệnh. Mục đích của tiền tố là sửa đổi hoạt động được thực hiện bởi lệnh. Một ứng dụng có thể sử dụng các loại tiền tố sau:

1) tiền tố thay thế phân đoạn;

2) tiền tố độ dài bit địa chỉ chỉ định độ dài bit địa chỉ (32 hoặc 16-bit);

3) tiền tố độ dài bit toán hạng tương tự như tiền tố độ dài bit địa chỉ, nhưng cho biết độ dài bit toán hạng (32-bit hoặc 16-bit) mà lệnh hoạt động;

4) Tiền tố lặp lại được sử dụng với các lệnh được xâu chuỗi.

2. Mã hoạt động.

Phần tử bắt buộc mô tả hoạt động được thực hiện bởi lệnh.

3. Chế độ định địa chỉ byte modr / m.

Giá trị của byte này xác định dạng địa chỉ toán hạng được sử dụng. Toán hạng có thể nằm trong bộ nhớ trong một hoặc hai thanh ghi. Nếu toán hạng nằm trong bộ nhớ, thì byte modr / m chỉ định các thành phần (thanh ghi bù, thanh ghi cơ sở và chỉ mục)

được sử dụng để tính toán địa chỉ hiệu quả của nó. Byte modr / m bao gồm ba trường:

1) trường mod xác định số byte chiếm trong lệnh theo địa chỉ của toán hạng;

2) trường reg / cop xác định thanh ghi nằm trong lệnh thay cho toán hạng đầu tiên hoặc phần mở rộng có thể có của opcode;

3) trường r / m được sử dụng cùng với trường mod và xác định thanh ghi nằm trong lệnh ở vị trí của toán hạng đầu tiên (nếu mod = 11) hoặc thanh ghi cơ sở và chỉ mục được sử dụng để tính toán địa chỉ hiệu quả (cùng với trường offset trong lệnh).

4. Thang byte - chỉ số - cơ sở (byte sib). Được sử dụng để mở rộng khả năng giải quyết các toán hạng. Byte sib bao gồm ba trường:

1) các trường quy mô ss. Trường này chứa hệ số tỷ lệ cho chỉ mục thành phần chỉ mục, chiếm 3 bit tiếp theo của byte sib;

2) các trường chỉ mục. Được sử dụng để lưu trữ số thanh ghi chỉ mục được sử dụng để tính toán địa chỉ hiệu quả của toán hạng;

3) các trường cơ sở. Được sử dụng để lưu trữ số thanh ghi cơ sở, cũng được sử dụng để tính toán địa chỉ hiệu dụng của toán hạng.

5. Trường offset trong lệnh.

Một số nguyên có dấu 8, 16 hoặc 32 bit đại diện cho toàn bộ hoặc một phần (tùy thuộc vào các cân nhắc ở trên), giá trị của địa chỉ hiệu dụng của toán hạng.

6. Trường của toán hạng ngay lập tức. Một trường tùy chọn đại diện cho 8-,

Toán hạng tức thời 16 hoặc 32 bit. Tất nhiên, sự hiện diện của trường này được phản ánh trong giá trị của byte modr / m.

51. Các phương pháp xác định toán hạng lệnh

Toán hạng được đặt ngầm định ở cấp phần sụn

Trong trường hợp này, lệnh rõ ràng không chứa toán hạng. Thuật toán thực thi lệnh sử dụng một số đối tượng mặc định (thanh ghi, cờ trong eflags, v.v.).

Toán hạng được chỉ định trong chính lệnh (toán hạng tức thì)

Toán hạng nằm trong mã lệnh, tức là nó là một phần của nó. Để lưu trữ một toán hạng như vậy, một trường dài tối đa 32 bit được cấp phát trong lệnh. Toán hạng ngay lập tức chỉ có thể là toán hạng thứ hai (nguồn). Toán hạng đích có thể nằm trong bộ nhớ hoặc trong một thanh ghi. Toán hạng nằm trong một trong các thanh ghi Các toán hạng thanh ghi được chỉ định bởi tên thanh ghi. Các đăng ký có thể được sử dụng:

1) Thanh ghi 32-bit EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP;

2) Các thanh ghi 16-bit AX, BX, CX, DX, SI, DI, SP, BP;

3) Thanh ghi 8 bit AH, AL, BH, BL, CH, CL, DH,

ĐL;

4) thanh ghi phân đoạn CS, DS, SS, ES, FS, GS. Ví dụ, lệnh add ax, bx thêm nội dung của thanh ghi ax và bx và ghi kết quả vào bx. Lệnh dec si giảm nội dung của si đi 1.

Toán hạng nằm trong bộ nhớ

Đây là cách phức tạp nhất và đồng thời là cách linh hoạt nhất để chỉ định toán hạng. Nó cho phép bạn thực hiện hai kiểu xưng hô chính sau: trực tiếp và gián tiếp.

Đổi lại, cách xưng hô gián tiếp có các loại sau:

1) địa chỉ cơ sở gián tiếp; tên khác của nó là đăng ký địa chỉ gián tiếp;

2) định địa chỉ cơ sở gián tiếp với bù đắp;

3) địa chỉ chỉ mục gián tiếp với bù đắp;

4) địa chỉ chỉ mục cơ sở gián tiếp;

5) định địa chỉ chỉ mục cơ sở gián tiếp với bù đắp.

Toán hạng là một cổng I / O

Ngoài không gian địa chỉ RAM, bộ vi xử lý duy trì một không gian địa chỉ I / O, được sử dụng để truy cập các thiết bị I / O. Không gian địa chỉ I / O là 64 KB. Địa chỉ được cấp cho bất kỳ thiết bị máy tính nào trong không gian này. Một giá trị địa chỉ cụ thể trong không gian này được gọi là cổng I / O. Về mặt vật lý, cổng I / O tương ứng với một thanh ghi phần cứng (không nên nhầm lẫn với một thanh ghi bộ vi xử lý), được truy cập bằng cách sử dụng các lệnh vào và ra của trình hợp dịch đặc biệt.

Toán hạng nằm trên ngăn xếp

Hướng dẫn có thể không có toán hạng nào cả, có thể có một hoặc hai toán hạng. Hầu hết các lệnh yêu cầu hai toán hạng, một trong số đó là toán hạng nguồn và một là toán hạng đích. Điều quan trọng là một toán hạng có thể được đặt trong một thanh ghi hoặc bộ nhớ, và toán hạng thứ hai phải nằm trong một thanh ghi hoặc trực tiếp trong lệnh. Một toán hạng tức thời chỉ có thể là một toán hạng nguồn. Trong lệnh máy hai toán hạng, có thể kết hợp các toán hạng sau:

1) đăng ký - đăng ký;

2) thanh ghi - bộ nhớ;

3) bộ nhớ - thanh ghi;

4) toán hạng ngay lập tức - đăng ký;

5) toán hạng tức thời - bộ nhớ.

52. Các phương pháp giải quyết

Địa chỉ trực tiếp

Đây là hình thức đơn giản nhất để định địa chỉ một toán hạng trong bộ nhớ, vì địa chỉ hiệu dụng được chứa trong chính lệnh và không có nguồn hoặc thanh ghi bổ sung nào được sử dụng để tạo thành nó. Địa chỉ hiệu dụng được lấy trực tiếp từ trường bù lệnh máy, có thể là 8, 16, 32 bit. Giá trị này xác định duy nhất byte, từ hoặc từ kép nằm trong phân đoạn dữ liệu.

Địa chỉ trực tiếp có thể có hai loại.

Địa chỉ tương đối trực tiếp

Được sử dụng cho các lệnh nhảy có điều kiện để chỉ ra địa chỉ nhảy tương đối. Tính tương đối của sự chuyển đổi như vậy nằm ở chỗ trường offset của lệnh máy chứa giá trị 8, 16 hoặc 32-bit, do kết quả của hoạt động của lệnh, sẽ được thêm vào nội dung của thanh ghi con trỏ lệnh ip / eip. Kết quả của việc bổ sung này, địa chỉ thu được, nơi quá trình chuyển đổi được thực hiện.

Địa chỉ trực tiếp tuyệt đối

Trong trường hợp này, địa chỉ hiệu dụng là một phần của lệnh máy, nhưng địa chỉ này chỉ được hình thành từ giá trị của trường offset trong lệnh. Để tạo địa chỉ vật lý của toán hạng trong bộ nhớ, bộ vi xử lý thêm trường này với giá trị của thanh ghi phân đoạn được dịch chuyển 4 bit. Một số dạng địa chỉ này có thể được sử dụng trong một lệnh hợp ngữ.

Định địa chỉ cơ bản gián tiếp (đăng ký)

Với cách định địa chỉ này, địa chỉ hiệu quả của toán hạng có thể nằm trong bất kỳ thanh ghi mục đích chung nào, ngoại trừ sp / esp và bp / ebp (đây là những thanh ghi cụ thể để làm việc với một phân đoạn ngăn xếp). Về mặt cú pháp trong một lệnh, chế độ định địa chỉ này được thể hiện bằng cách đặt tên thanh ghi trong dấu ngoặc vuông [].

Định địa chỉ cơ sở gián tiếp (đăng ký) với bù đắp

Loại địa chỉ này là một bổ sung cho loại trước đó và được thiết kế để truy cập dữ liệu với một độ lệch đã biết liên quan đến một số địa chỉ cơ sở. Loại địa chỉ này thuận tiện để sử dụng để truy cập các phần tử của cấu trúc dữ liệu, khi độ lệch của các phần tử được biết trước, ở giai đoạn phát triển chương trình và địa chỉ cơ sở (bắt đầu) của cấu trúc phải được tính toán động, tại giai đoạn thực hiện chương trình.

Định địa chỉ chỉ mục gián tiếp với bù đắp

Loại địa chỉ này rất giống với địa chỉ cơ sở gián tiếp với một phần bù. Ở đây, một trong những thanh ghi mục đích chung được sử dụng để tạo địa chỉ hiệu quả. Nhưng địa chỉ chỉ mục có một tính năng thú vị là rất thuận tiện để làm việc với mảng. Nó được kết nối với khả năng được gọi là mở rộng quy mô nội dung của thanh ghi chỉ mục.

Định địa chỉ chỉ mục cơ sở gián tiếp

Với kiểu địa chỉ này, địa chỉ hiệu quả được hình thành là tổng nội dung của hai thanh ghi có mục đích chung: cơ sở và chỉ mục. Các thanh ghi này có thể là bất kỳ thanh ghi có mục đích chung nào và việc chia tỷ lệ nội dung của thanh ghi chỉ mục thường được sử dụng.

Định địa chỉ chỉ mục cơ sở gián tiếp với bù đắp

Loại địa chỉ này là sự bổ sung của địa chỉ được lập chỉ mục gián tiếp. Địa chỉ hiệu dụng được hình thành dưới dạng tổng của ba thành phần: nội dung của thanh ghi cơ sở, nội dung của thanh ghi chỉ mục và giá trị của trường offset trong lệnh.

53. Các lệnh truyền dữ liệu

Các lệnh truyền dữ liệu mục đích chung

Nhóm này bao gồm các lệnh sau:

1) mov là lệnh truyền dữ liệu chính;

2) xchg - được sử dụng để truyền dữ liệu hai chiều.

Lệnh cổng I / O

Về cơ bản, việc quản lý thiết bị trực tiếp thông qua các cổng rất dễ dàng:

1) trong bộ tích lũy, số cổng - đầu vào cho bộ tích lũy từ cổng có số cổng;

2) cổng ra, bộ tích lũy - xuất nội dung của bộ tích lũy sang cổng có số cổng.

Các lệnh chuyển đổi dữ liệu

Nhiều lệnh của bộ vi xử lý có thể được quy cho nhóm này, nhưng hầu hết chúng đều có một số tính năng nhất định yêu cầu chúng phải được gán cho các nhóm chức năng khác.

Lệnh ngăn xếp

Nhóm này là một tập hợp các lệnh chuyên biệt tập trung vào việc tổ chức công việc linh hoạt và hiệu quả với ngăn xếp.

Ngăn xếp là một vùng bộ nhớ được cấp phát đặc biệt để lưu trữ tạm thời dữ liệu chương trình.

Ngăn xếp có ba thanh ghi:

1) ss - thanh ghi phân đoạn ngăn xếp;

2) sp / esp - thanh ghi con trỏ ngăn xếp;

3) bp / ebp - thanh ghi con trỏ cơ sở khung ngăn xếp. Để tổ chức công việc với ngăn xếp, có các lệnh đặc biệt để viết và đọc.

1. push источник - запись значения источника в вершину стека.

2. phép gán pop - ghi giá trị từ trên cùng của ngăn xếp đến vị trí được chỉ định bởi toán hạng đích. Do đó, giá trị bị "loại bỏ" khỏi đầu ngăn xếp.

3. latexha - một nhóm ghi lệnh vào ngăn xếp.

4. latexhaw gần như đồng nghĩa với lệnh pushha. Thuộc tính bitness có thể là use16 hoặc use32. R

5. pushhad - được thực hiện tương tự như lệnh pushha, nhưng có một số điểm đặc biệt.

Ba lệnh sau thực hiện ngược lại các lệnh trên:

1) popa;

2) cây bìm bịp;

3) bật.

Nhóm hướng dẫn được mô tả bên dưới cho phép bạn lưu sổ đăng ký cờ trên ngăn xếp và viết một từ hoặc từ kép vào ngăn xếp.

1. pushf - lưu sổ đăng ký cờ trên ngăn xếp.

2. pushfw - lưu một đăng ký cờ có kích thước bằng chữ trên ngăn xếp. Luôn hoạt động giống như pushf với thuộc tính use16.

3. pushfd - lưu các cờ hoặc cờ eflags đăng ký trên ngăn xếp tùy thuộc vào thuộc tính độ rộng bit của phân đoạn (tức là giống với pushf).

Tương tự, ba lệnh sau thực hiện ngược lại các hoạt động được thảo luận ở trên:

1) popf;

2) popfw;

3) popfd.

54. Các lệnh số học

Các lệnh như vậy hoạt động với hai loại:

1) số nhị phân số nguyên, nghĩa là với các số được mã hóa trong hệ thống số nhị phân.

Số thập phân là một kiểu biểu diễn đặc biệt của thông tin số, dựa trên nguyên tắc mã hóa từng chữ số thập phân của một số theo một nhóm bốn bit.

Bộ vi xử lý thực hiện phép cộng các toán hạng theo quy tắc cộng số nhị phân.

Có ba lệnh bổ sung nhị phân trong tập lệnh bộ vi xử lý:

1) toán hạng inc - tăng giá trị của toán hạng;

2) thêm toán hạng1, toán hạng2 - phép cộng;

3) adc toán hạng1, toán hạng2 - bổ sung, có tính đến cờ thực hiện cf.

Phép trừ các số nhị phân không dấu

Nếu minuend lớn hơn subtrahend, thì sự khác biệt là dương. Nếu số tối thiểu nhỏ hơn số bị trừ, có một vấn đề: kết quả nhỏ hơn 0 và đây đã là một số có dấu.

Sau khi trừ các số không có dấu, bạn cần phân tích trạng thái của cờ CF. Nếu nó được đặt thành 1, thì bit quan trọng nhất đã được mượn và kết quả là trong mã bổ sung của cả hai.

Phép trừ các số nhị phân có dấu Nhưng đối với phép trừ bằng cách cộng các số có dấu trong mã bổ sung, cần phải biểu diễn cả hai toán hạng - cả giá trị nhỏ nhất và giá trị con. Kết quả cũng nên được coi là giá trị bổ sung của hai. Nhưng ở đây nảy sinh khó khăn. Trước hết, chúng có liên quan đến thực tế là bit quan trọng nhất của toán hạng được coi là bit dấu.

Theo nội dung của cờ tràn của. Đặt nó thành 1 cho biết rằng kết quả nằm ngoài phạm vi số có dấu (nghĩa là bit quan trọng nhất đã thay đổi) cho một toán hạng có kích thước này và lập trình viên phải thực hiện hành động để sửa kết quả.

Nguyên tắc trừ các số có phạm vi biểu diễn vượt quá lưới bit tiêu chuẩn của các toán hạng cũng giống như đối với phép cộng, tức là cờ mang cf được sử dụng. Bạn chỉ cần tưởng tượng quá trình trừ trong một cột và kết hợp chính xác các lệnh của bộ vi xử lý với lệnh sbb.

Lệnh nhân các số không có dấu là

đa hệ số_1

Lệnh nhân các số với một dấu là

[toán hạng imul_1, toán hạng_2, toán hạng_3]

Lệnh divisor dùng để chia các số không có dấu.

Lệnh chia số idiv dùng để chia các số có dấu.

55. Các lệnh logic

Theo lý thuyết, các phép toán logic sau đây có thể được thực hiện trên các câu lệnh (trên bit).

1. Phủ định (logic NOT) - một phép toán logic trên một toán hạng, kết quả của nó là nghịch đảo của giá trị của toán hạng ban đầu.

2. Phép cộng logic (OR bao gồm logic) - một phép toán logic trên hai toán hạng, kết quả của nó là "true" (1) nếu một hoặc cả hai toán hạng là true (1) và "false" (0) nếu cả hai toán hạng là sai (0).

3. Phép nhân logic (logic AND) - một phép toán logic trên hai toán hạng, kết quả của nó là đúng (1) chỉ khi cả hai toán hạng đều đúng (1). Trong tất cả các trường hợp khác, giá trị của phép toán là "false" (0).

4. Phép cộng loại trừ logic (OR loại trừ logic) - một phép toán logic trên hai toán hạng, kết quả của nó là "true" (1), nếu chỉ một trong hai toán hạng là true (1) và false (0), nếu cả toán hạng đều sai (0) hoặc đúng (1).

4. Phép cộng loại trừ logic (OR loại trừ logic) - một phép toán logic trên hai toán hạng, kết quả của nó là "true" (1), nếu chỉ một trong hai toán hạng là true (1) và false (0), nếu cả toán hạng đều sai (0) hoặc đúng (1).

Tập hợp các lệnh sau hỗ trợ làm việc với dữ liệu logic:

1) và toán hạng thứ 1, toán hạng thứ 2 - phép toán nhân logic;

2) hoặc toán hạng thứ 1, toán hạng thứ 2 - phép toán cộng logic;

3) toán hạng xor_1, toán hạng thứ 2 - hoạt động của phép cộng loại trừ logic;

4) toán hạng kiểm tra_1, toán hạng thứ 2 - hoạt động "kiểm tra" (bằng phép nhân logic)

5) không phải toán hạng - hoạt động của phủ định logic.

a) để đặt các chữ số (bit) nhất định thành 1, lệnh hoặc toán hạng_1, toán hạng thứ 2 được sử dụng;

b) để đặt lại các chữ số (bit) nhất định về 0, lệnh và toán hạng_1, toán hạng thứ 2 được sử dụng;

c) lệnh x hoặc toán hạng thứ 1, toán hạng thứ 2 được áp dụng:

▪ для выяснения того, какие биты в операнд_1 и операнд_2 различаются;

▪ для инвертирования состояния заданных бит в операнд_1.

Toán hạng kiểm tra lệnh thứ 1, toán hạng thứ 2 (kiểm tra toán hạng thứ 1) được sử dụng để kiểm tra trạng thái của các bit được chỉ định.

Kết quả của lệnh là đặt giá trị của cờ XNUMX zf:

1) nếu zf = 0, thì do kết quả của phép nhân logic, kết quả bằng không, tức là một bit đơn vị của mặt nạ, không khớp với bit đơn vị tương ứng của toán hạng 1;

2) если zf = 1, то в результате логического умножения получился ненулевой результат, т. е. хотя бы один единичный бит маски совпал с соответствующим единичным битом операнд1.

Все команды сдвига перемещают биты в поле операнда влево или вправо в зависимости от кода операции. Все команды сдвига имеют одинаковую структуру - коп операнд, счетчик сдвигов.

56. Các lệnh chuyển điều khiển

Lệnh chương trình nào sẽ được thực hiện tiếp theo, bộ vi xử lý học từ nội dung của cặp thanh ghi cs: (e) ip:

1) cs - thanh ghi đoạn mã, chứa địa chỉ vật lý của đoạn mã hiện tại;

2) eip / ip - thanh ghi con trỏ lệnh, nó chứa giá trị bù trong bộ nhớ của lệnh tiếp theo sẽ được thực thi.

Nhảy vô điều kiện

Những gì cần được sửa đổi phụ thuộc vào:

1) về loại toán hạng trong lệnh rẽ nhánh không điều kiện (gần hoặc xa);

2) từ việc chỉ định một bổ ngữ trước địa chỉ chuyển tiếp; trong trường hợp này, bản thân địa chỉ bước nhảy có thể nằm trực tiếp trong lệnh (bước nhảy trực tiếp) hoặc trong thanh ghi bộ nhớ (bước nhảy gián tiếp).

Giá trị bổ trợ:

1) gần ptr - chuyển tiếp trực tiếp đến nhãn;

2) xa ptr - chuyển đổi trực tiếp đến một nhãn trong một đoạn mã khác;

3) từ ptr - chuyển tiếp gián tiếp sang nhãn;

4) dword ptr - chuyển đổi gián tiếp sang một nhãn trong một đoạn mã khác.

hướng dẫn nhảy không điều kiện jmp

jmp [modifier] jump_address

Một thủ tục hoặc chương trình con là đơn vị chức năng cơ bản của việc phân rã một số tác vụ. Thủ tục là một nhóm lệnh.

Nhảy có điều kiện

Bộ vi xử lý có 18 lệnh nhảy có điều kiện. Các lệnh này cho phép bạn kiểm tra:

1) отношение между операндами со знаком ("больше - меньше");

2) mối quan hệ giữa các toán hạng không dấu

("выше - ниже");

3) состояния арифметических флагов ZF, SF, CF, OF, PF (но не AF).

Các lệnh nhảy có điều kiện có cùng cú pháp: nhãn nhảy jcc

Lệnh cmp so sánh có một cách hoạt động thú vị. Nó hoàn toàn giống với lệnh trừ - toán hạng con thứ 1, toán hạng thứ 2.

Lệnh cmp, giống như lệnh phụ, trừ các toán hạng và đặt cờ. Điều duy nhất nó không làm là viết kết quả của phép trừ thay cho toán hạng đầu tiên.

Cú pháp lệnh cmp - toán hạng cmp_1, toán hạng thứ 2 (so sánh) - so sánh hai toán hạng và đặt cờ dựa trên kết quả của phép so sánh.

Tổ chức các chu kỳ

Bạn có thể tổ chức thực hiện theo chu kỳ của một phần nhất định của chương trình, ví dụ, bằng cách sử dụng lệnh điều khiển chuyển có điều kiện hoặc lệnh nhảy không điều kiện jmp:

1) nhãn chuyển tiếp vòng lặp (Loop) - lặp lại vòng lặp. Lệnh cho phép bạn tổ chức các vòng lặp tương tự như vòng lặp for trong các ngôn ngữ cấp cao với sự giảm tự động của bộ đếm vòng lặp;

2) nhãn nhảy loope / loopz

Các lệnh loope và loopz là các từ đồng nghĩa tuyệt đối;

3) nhãn nhảy loopne / loopnz

Các lệnh loopne và loopnz cũng là những từ đồng nghĩa tuyệt đối. Các lệnh loope / loopz và loopne / loopnz là tương hỗ trong hoạt động của chúng.

Tác giả: Tsvetkova A.V.

Chúng tôi giới thiệu các bài viết thú vị razdela Ghi chú bài giảng, phiếu đánh giá:

Giải phẫu người bình thường. Giường cũi

An toàn tính mạng. Giường cũi

Tóm tắt văn học Nga thế kỷ XNUMX. Giường cũi

Xem các bài viết khác razdela Ghi chú bài giảng, phiếu đánh giá.

Đọc và viết hữu ích bình luận về bài viết này.

<< Quay lại

Tin tức khoa học công nghệ, điện tử mới nhất:

Máy tỉa hoa trong vườn 02.05.2024

Trong nền nông nghiệp hiện đại, tiến bộ công nghệ đang phát triển nhằm nâng cao hiệu quả của quá trình chăm sóc cây trồng. Máy tỉa thưa hoa Florix cải tiến đã được giới thiệu tại Ý, được thiết kế để tối ưu hóa giai đoạn thu hoạch. Công cụ này được trang bị cánh tay di động, cho phép nó dễ dàng thích ứng với nhu cầu của khu vườn. Người vận hành có thể điều chỉnh tốc độ của các dây mỏng bằng cách điều khiển chúng từ cabin máy kéo bằng cần điều khiển. Cách tiếp cận này làm tăng đáng kể hiệu quả của quá trình tỉa thưa hoa, mang lại khả năng điều chỉnh riêng cho từng điều kiện cụ thể của khu vườn, cũng như sự đa dạng và loại trái cây được trồng trong đó. Sau hai năm thử nghiệm máy Florix trên nhiều loại trái cây khác nhau, kết quả rất đáng khích lệ. Những nông dân như Filiberto Montanari, người đã sử dụng máy Florix trong vài năm, đã báo cáo rằng thời gian và công sức cần thiết để tỉa hoa đã giảm đáng kể. ... >>

Kính hiển vi hồng ngoại tiên tiến 02.05.2024

Kính hiển vi đóng vai trò quan trọng trong nghiên cứu khoa học, cho phép các nhà khoa học đi sâu vào các cấu trúc và quá trình mà mắt thường không nhìn thấy được. Tuy nhiên, các phương pháp kính hiển vi khác nhau đều có những hạn chế, trong đó có hạn chế về độ phân giải khi sử dụng dải hồng ngoại. Nhưng những thành tựu mới nhất của các nhà nghiên cứu Nhật Bản tại Đại học Tokyo đã mở ra những triển vọng mới cho việc nghiên cứu thế giới vi mô. Các nhà khoa học từ Đại học Tokyo vừa công bố một loại kính hiển vi mới sẽ cách mạng hóa khả năng của kính hiển vi hồng ngoại. Thiết bị tiên tiến này cho phép bạn nhìn thấy cấu trúc bên trong của vi khuẩn sống với độ rõ nét đáng kinh ngạc ở quy mô nanomet. Thông thường, kính hiển vi hồng ngoại trung bị hạn chế bởi độ phân giải thấp, nhưng sự phát triển mới nhất của các nhà nghiên cứu Nhật Bản đã khắc phục được những hạn chế này. Theo các nhà khoa học, kính hiển vi được phát triển cho phép tạo ra hình ảnh có độ phân giải lên tới 120 nanomet, cao gấp 30 lần độ phân giải của kính hiển vi truyền thống. ... >>

Bẫy không khí cho côn trùng 01.05.2024

Nông nghiệp là một trong những lĩnh vực quan trọng của nền kinh tế và kiểm soát dịch hại là một phần không thể thiếu trong quá trình này. Một nhóm các nhà khoa học từ Viện nghiên cứu khoai tây trung tâm-Hội đồng nghiên cứu nông nghiệp Ấn Độ (ICAR-CPRI), Shimla, đã đưa ra một giải pháp sáng tạo cho vấn đề này - bẫy không khí côn trùng chạy bằng năng lượng gió. Thiết bị này giải quyết những thiếu sót của các phương pháp kiểm soát sinh vật gây hại truyền thống bằng cách cung cấp dữ liệu về số lượng côn trùng theo thời gian thực. Bẫy được cung cấp năng lượng hoàn toàn bằng năng lượng gió, khiến nó trở thành một giải pháp thân thiện với môi trường và không cần điện. Thiết kế độc đáo của nó cho phép giám sát cả côn trùng có hại và có ích, cung cấp cái nhìn tổng quan đầy đủ về quần thể ở bất kỳ khu vực nông nghiệp nào. Kapil cho biết: “Bằng cách đánh giá các loài gây hại mục tiêu vào đúng thời điểm, chúng tôi có thể thực hiện các biện pháp cần thiết để kiểm soát cả sâu bệnh và dịch bệnh”. ... >>

Tin tức ngẫu nhiên từ Kho lưu trữ

Dự báo thời tiết bệnh viện 07.08.2002

Cố vấn y tế của Cơ quan Khí tượng Anh, Tiến sĩ William Byrd, sau khi xử lý một lượng lớn thông tin về việc đưa bệnh nhân vào phòng cấp cứu và so sánh với những thay đổi thời tiết, đã đưa ra những kết luận thú vị và quan trọng cho thực tiễn.

Vì vậy, ba ngày sau khi cảm lạnh, tử vong do đau tim trở nên thường xuyên hơn, sau năm ngày - đột quỵ, sau 12 - bệnh phổi. Bằng cách thông báo cho một trong những bệnh viện lớn của Reading nên chuẩn bị trước cho bệnh nhân, bác sĩ Bird đã tiết kiệm cho cô vài nghìn bảng Anh.

Công việc theo hướng này chỉ mới bắt đầu. Trong tương lai, tác giả của nghiên cứu cho biết, có thể đưa ra dự báo thời tiết cá nhân để đảm bảo sức khỏe cho mọi người.

Tin tức thú vị khác:

▪ Bạn nghe thấy - vi rút

▪ Địa chấn học tội phạm

▪ Sự tích tụ khổng lồ của khí hỗn loạn được phát hiện trong các thiên hà xa xôi

▪ Nền tảng thiết kế cho chip điện tử ô tô 7nm

▪ Tháp bay 4G - máy bay không người lái Flying COW

Nguồn cấp tin tức khoa học và công nghệ, điện tử mới

 

Tài liệu thú vị của Thư viện kỹ thuật miễn phí:

▪ phần radio của trang web. Lựa chọn bài viết

▪ bài viết của Derzhimorda. biểu hiện phổ biến

▪ bài viết Amidan phải làm sao? đáp án chi tiết

▪ bài báo Anh đào chim. Truyền thuyết, canh tác, phương pháp áp dụng

▪ Bài báo của kvas. Công thức nấu ăn đơn giản và lời khuyên

▪ bài viết Ổn áp chuyển mạch đơn giản, 9-25/5 vôn 0,7 ampe. Bách khoa toàn thư về điện tử vô tuyến và kỹ thuật điện

Để lại bình luận của bạn về bài viết này:

Имя:


Email (tùy chọn):


bình luận:





Tất cả các ngôn ngữ của trang này

Trang chủ | Thư viện | bài viết | Sơ đồ trang web | Đánh giá trang web

www.diagram.com.ua

www.diagram.com.ua
2000-2024