Tài liệu Chương IV: Lập trình bằng hợp ngữ docx

23 554 1
Tài liệu Chương IV: Lập trình bằng hợp ngữ docx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

CHƯƠNG IV: LẬP TRÌNH BẰNG HỢP NGỮ 4.1 CHƯƠNG TRÌNH DỊCH HỢP NGỮ Như đã biết vi xử lý là một IC số hoạt động theo chương trình Chương trình là tập hợp của các lệnh, mỗi lệnh sẽ thực hiện một chức số bản nào đó Hệ thống vi xử lý là một hệ thống điện tử số, nên các chương trình cung cấp để nó hoạt động phải ở dưới dạng các mức điện áp cao và thấp, tương ứng với các bit nhị phân và Nhưng nếu chương trình bằng toàn các số và sẽ rất khó nhớ, khó kiểm tra và sửa sai đối với người lập trình Để khắc phục tình trạng người ta đặt cho mỗi lệnh nhị phân thực hiện một chức số bản một tên dễ nhớ hơn, chúng được gọi là mã gợi nhớ Khi lập trình người ta sử dụng các mã gợi nhớ, còn cần vi xử lý thực hiện thì chương trình sẽ được đổi thành các mã nhị phân 0, để nạp vào bộ nhớ của hệ thống, công việc này được gọi là hợp dịch (assembler) chương trình Mỗi bộ vi xử lý đời sẽ có một tập lệnh của nó dưới dạng mã gợi nhớ và mã nhị phân tương ứng, vì vậy việc hợp dịch chương trình có thể thực hiện thủ công bằng cách tra bảng lệnh Khi máy tính đời để nhanh chóng và chính xác, việc hợp dịch thường được thực hiện bằng các chương trình viết sẵn, các chương trình này được gọi là các chương trình hợp dịch hay chương trình dịch hợp ngữ, chúng thường được cung cấp từ các hãng phần mềm, hoặc chính từ các hãng sản xuất vi xử lý Với máy vi tính, đầu tiên các chương trình cần được soạn thảo bao gồm các lệnh gợi nhớ dưới dạng văn bản, bằng bất kỳ một phần mềm soạn thảo văn bản nào, tất nhiên chúng phải theo đúng cú pháp qui định của chương trình hợp dịch Sau đó tập tin văn bản này sẽ được dịch và liên kết bằng các chương trình chuyên dụng để tạo các tập tin nhị phân có thể thực hiện máy vi tính, hoặc nạp vào bộ nhớ cho các hệ thống vi xử lý khác Thông thường mỗi họ vi xử lý có ít nhất một chương trình hợp dịch, các chương trình hợp dịch khác cũng thường có qui định cú pháp khác Ví dụ các vi xử lý họ Zilog có phần mềm dịch và liên kết là M80 và L80, họ Intel có MASM, LINK và EXEC2BIN của Microsoft và TASM, TLINK của Borland, họ vi điều khiển 8051 có M51, L51 và OH… Tuy có qui định cú pháp khác nhau, cấu trúc các hàng lệnh và khung chương trình cũng tương đối giống nhau, các lỗi soạn thảo sẽ được thông báo hợp dịch hoặc có thể tìm thấy phần trợ giúp của chương trình Sau chúng ta sẽ xem xét về các soạn thảo và cấu trúc của một chương trình hợp ngữ viết cho các chương trình hợp dịch họ Intel TASM và TLINK 4.2 CẤU TRÚC CỦA CHƯƠNG TRÌNH HỢP NGỮ 4.2.1 Cú pháp các câu lệnh Một chương trình hợp ngữ bao gồm các dòng lệnh, một dòng lệnh có thể bao gồm các lệnh gợi nhớ chỉ thị cho vi xử lý thực hiện một chức số nào đó, cũng có thể là một lệnh giả (Pseudo) chỉ có ý nghĩa sử dụng cho các chương trình dịch Một dòng lệnh hợp ngữ có thể có các phần sau: Nhãn: Mã lệnh Các toán hạng Chú giải Ví dụ một dòng lệnh với mã gợi nhớ sau: Label1: MOV AH,[BX] ; nạp vào AH nội dung ô nhớ có địa chỉ [BX] Dòng lệnh có phần nhãn là Label1, phần mã gợi nhớ là MOV biểu thị lệnh di chuyển dữ liệu, phần các toán hạng là AH và [BX] biểu diễn việc truyền dữ liệu từ ô 71 nhớ có địa chỉ DS:[BX] vào ghi AH, phần chú giải bắt đầu từ sau dấu ‘;’ cho tới hết dòng Ví dụ về một dòng lệnh giả hợp ngữ như: MAIN PROC Lệnh bao gồm phần tên MAIN thông báo tên của một thủ tục, phần lệnh PROC để xác định thủ tục  Phần nhãn/tên Thông thường chỉ thị các nhãn cho các lệnh nhảy chuyển điều khiển tới, chỉ thị các tên biến hoặc tên thủ tục Như vậy không phải bất cứ dòng lệnh nào cũng cần phần này Khi hợp dịch các nhãn hoặc tên này sẽ được gán bằng các địa chỉ cụ thể của các ô nhớ Các tên và nhãn chương trình có thể có độ dài từ tới 31 ký tự, nó không bao gồm ký tự khoảng trống và không được bắt đầu bằng một số Có thể dùng các ký tự đặc biệt phần này, dấu ‘.’ chỉ được đặt ở vị trí đầu tiên của nhãn Một nhãn sẽ kết thúc bằng dấu ‘:’, các nhãn và tên thông thường được đặt cho dễ nhớ viết và kiểm tra chương trình  Phần mã lệnh Thông thường phần mã lệnh bất cứ dòng lệnh nào cũng có chứa các lệnh gợi nhớ hoặc các lệnh giả hợp ngữ Các lệnh gợi nhớ sẽ được trình hợp dịch chuyển thành mã máy nhị phân Các lệnh giả chỉ có tác dụng hướng dẫn cho các trình hợp dịch mà không được dịch mã máy chương trình  Phần toán hạng Đối với các mã lệnh gợi nhớ, phần này chứa các toán hạng của lệnh đã mô tả các cách định vị địa chỉ Tuỳ theo từng lệnh mà phần toán hạng có thể bao gồm 0, hoặc toán hạng Thông thường không có phần toán hạng, thì toán hạng thao tác lệnh sẽ được hiểu ngầm, nếu chỉ có một toán hạng nó sẽ được gọi là toán hạng đích, nếu có hai toán hạng sẽ có một toán hạng nguồn và một toán hạng đích Đối với các lệnh giả phần này sẽ chứa các thông tin liên quan đến lệnh giả đó  Phần chú giải Phần này được tính bắt đầu từ sau dấu ‘;’ một dòng lệnh (có thể không có các phần khác) Nó cho phép ghi vào các lời giải thích về dòng lệnh hoặc về hoạt động của chương trình, nó giúp ích cho người lập trình dễ nhớ viết chương trình, hoặc đọc lại chương trình Khi hợp dịch các lời giải thích này sẽ không được dịch mã lệnh, có nghĩa là nó không có giá trị gì chương trình mã máy 4.2.2 Dữ liệu cho chương trình Dữ liệu một chương trình hợp ngữ rất đa dạng Các dữ liệu có thể được cho dưới dạng hệ nhị phân, thập phân, bát phân hoặc thập lục phân Khi số cho ở hệ nào cần phải có ký tự chỉ thị cho hệ đó ở phía sau: hệ nhị phân là chữ B (Binary), hệ bát phân là chữ O (Octal), hệ 16 là chữ H (Hexadecimal), riêng hệ thập phân có thể không cần viết ký tự phía sau Chú ý hệ 16, các dữ liệu được bắt đầu bằng các ký tự chữ, để phân biệt với các tên hoặc nhãn cần phải viết thêm một số lên phía trước Nếu dữ liệu là một chuỗi ký tự thì chúng phải được để dấu nháy, chương trình sẽ dịch mã ASCII tương ứng của nó Ví dụ dữ liệu 41H sẽ tương ứng với ‘A’ 4.2.3 Biến và hằng Biến và hằng khái báo một chương trình hợp ngữ cũng có các chức giống một chương trình ngôn ngữ cấp cao Một biến cần phải được định kiểu bằng các lệnh giả như: 72 DB (define byte) : định nghĩa biến kiểu byte DW (define word): định nghĩa biến kiểu từ (hai byte) DD (define double word): định nghĩa biến từ kép (4 byte) DT (define ten byte): định nghĩa biến 10 byte Các biến có thể gán giá trị khởi động hoặc không Ví dụ dòng lệnh: X1 DB khai báo một biến byte có tên là X1 và giá trị khởi động là Nếu dấu ? thay vào vị trí của số thì biến X1 sẽ được dành chỗ bộ nhớ, chương trình bắt đầu hoạt động nó sẽ có giá trị bất kỳ không được gán giá trị khởi động Khai báo hoàn toàn tương tự cho các biến kiểu khác  Biến mảng Biến mảng hình thành từ một dãy liên tiếp các phần tử cùng kiểu (byte, từ …), số ô nhớ sẽ được dành tương ứng với số phần tử của dãy Ví dụ dòng lệnh: A1 DB 3,5,6,7,8 Khai báo một biến mảng có tên là A1 có giá trị khởi động là 3,5,6,7,8 Phần tử đầu mảng là có địa chỉ trùng với A1, phần tử thứ hai sẽ có địa chỉ kế tiếp … Khi muốn khởi động các phần tử của mảng với cùng một giá trị có thể sử dụng toán tử DUP lệnh Ví dụ dòng lệnh A2 DB 100 DUP (0) sẽ khai báo biến mảng có một trăm phần tử đều có giá trị khởi động bằng Khi thế số bằng dấu ? thì một trăm phần tử của mảng sẽ không được gán trước giá trị khởi động Cũng có thể khai báo một biến mảng theo kiểu hỗn hợp bao gồm nhiều toán tử DUP Ví dụ dòng lệnh: M DB 1,2, DUP (8), DUP (4), sẽ hoàn toàn tương đương với dòng lệnh: M DB 1,2,8,8,4,4,4,9 Chú ý một số vi xử lý (như của Intel), nếu có một từ bộ nhớ thì byte thấp sẽ nằm ở địa chỉ thấp, byte cao nằm ở địa chỉ cao, còn ở một số vi xử lý khác (Motorola) lại có cách cất dữ liệu theo thứ tự ngược lại  Biến kiểu xâu ký tự Biến kiểu xâu ký tự là trường hợp đặc biệt của biến mảng, đó các phần tử của mảng là các ký tự Một xâu ký tự có thể định nghĩa bằng các ký tự hoặc bằng mã ASCII tương ứng của chúng Các dòng lệnh sau cùng định nghĩa một xâu ký tự gán cho chúng các tên khai báo cho chúng khác nhau: STR1 DB 'string' STR2 DB 73h, 74h, 72h, 69h, 6Eh, 67h STR3 DB 73h, 74h, 'r', 'i', 'n', 67h  Hằng có tên Các hằng số các chương trình hợp ngữ cung thường được gán tên để dễ nhớ và dễ đọc Hằng có thể là kiểu số hoặc kiểu ký tự Việc gán tên cho hằng được thực hiện bằng lệnh EQU (equate) sau: CR EQU 0Dh ; CR là ký tự về đầu hàng (Carriage return) LF EQU 0Ah ; LF là ký tự xuống hàng (Line Feed) Hằng cũng có thể là một chuỗi ký tự, ví dụ có thể tên cho một chuỗi ký tự sau đó sử dụng để định nghĩa cho một biến mảng khác Chao EQU 'Hello' MSG DB CHAO, '$' 73 Do EQU là một lệnh giả không dành chỗ của bộ nhớ cho tên hằng nên có thể đặt dòng lệnh khai báo này ở bất kỳ vị trí nào chương trình Tuy nhiên thực tế người ta thường đặt chúng phần khai báo dữ liệu 4.3 LẬP TRÌNH VÀ CHO CHẠY MỘT CHƯƠNG TRÌNH HỢP NGỮ 4.3.1 Khung của một chương trình hợp ngữ Một chương trình hợp ngữ chạy các hệ thống vi xử lý họ Intel bao gồm các đoạn vùng nhớ khác để chứa mã lệnh, dữ liệu và ngăn xếp Các đoạn này sẽ được khai báo bằng các lệnh giả hợp ngữ theo đúng cú pháp của trình biên dịch tạo thành khung của chương trình Sau chúng ta sẽ xem xét các từ khoá tối thiểu một chương trình hợp ngữ với các trình hợp dịch MASM và TASM  Khai báo qui mô sử dụng bộ nhớ Dung lượng bộ nhớ dành cho đoạn mã lệnh và đoạn dữ liệu được xác định nhờ lệnh giả '.MODEL', lệnh này phải đặt trước tất cả các lệnh khác chương trình Cú pháp lệnh: MODEL Kiểu kích thước bộ nhớ Có nhiều kiểu kích thước bộ nhớ cho các chương trình với đòi hỏi dung lượng bộ nhớ khác Với người mới lập trình thông thường các đoạn mã lệnh và dữ liệu đều không vượt quá 64KB nên chọn kiểu nhỏ (Small) hoặc kiểu hẹp (Tiny) Ngoài còn có các kiểu kích thước bộ nhớ khác liệt kê bảng sau: Kiểu kích thước bộ nhớ Tiny (hẹp) Small (nhỏ) Medium (trung bình) Compact (gọn) Mô tả Mã lệnh và dữ liệu cùng một đoạn 64 KB Mã lệnh nằm một đoạn, dữ liệu nằm một đoạn Mã lệnh không nằm một đoạn, dữ liệu nằm một đoạn Mã lệnh nằm một đoạn, dữ liệu không nằm một đoạn Large (lớn) Mã lệnh không nằm một đoạn, dữ liệu không nằm một đoạn, các mảng không lớn 64KB Huge (đồ sộ) Mã lệnh không nằm một đoạn, dữ liệu không nằm một đoạn, các mảng có thể lớn 64KB  Khai báo ngăn xếp Khai báo ngăn xếp để dành một vùng nhớ đủ lớn cho ngăn xếp Việc khai báo ngăn xếp được thực hiện bằng lệnh giả sau: Stack Kích thước Kích thước sẽ xác định số byte dành cho ngăn xếp, nếu không có khai báo kích thước chương trình dịch sẽ tự động gán cho ngăn xếp kích thước 1KB, là một kích thước quá lớn đối với các ứng dụng thông thường Các chương trình thông thường có thể khai báo ngăn xếp từ 100 tới 256 byte Chú ý với các chương trình khai báo kiểu bộ nhớ hẹp (.Model Tiny) sẽ không có khai báo ngăn xếp  Khai báo dữ liệu Đoạn dữ liệu sẽ chứa toàn bộ các khai báo về biến cho chương trình, các hằng cũng có thể được khai báo phần này Việc khai báo dữ liệu được thực hiện bằng lệnh giả DATA Các chương trình với kiểu Tiny cũng không có khai báo này  Khai báo đoạn mã 74 Đoạn mã là nơi chứa các lệnh gợi nhớ của chương trình Việc khai báo đoạn mã được thực hiện bằng lệnh giả CODE Chương trình sẽ thực hiện lệnh đầu tiên nằm sau lệnh CODE sau đó là các lệnh kế tiếp tùy theo cấu trúc điều khiển của nó Các chương trình cũng được viết đoạn này, chú ý rằng chúng chỉ được chuyển tới bằng các lệnh gọi (CALL)  Khung của chương trình hợp ngữ để dịch dạng EXE Từ các khai báo của chương trình đã trình bày ở có thể xây dựng một khung tổng quát cho các chương trình hợp ngữ với kiểu kích thước bộ nhớ nhỏ, các chương trình loại này sau hợp dịch sẽ tạo một tập tin có thể thực hiện được (executable) với đuôi EXE Khung các chương trình loại này biểu diễn sau: Model Small Stack 100 Data ; Các định nghĩa cho biến và hằng để tại phần này Code Main Proc MOV AX,@Data ; khởi tạo DS MOV DS, AX ; nếu cần phải viết thêm lệnh MOV ES,AX ; các lệnh của chương trình chính MOV AH,4CH INT 21H ; Trở về DOS Main Endp ; các chương trình để tại phần này End Main ; kết thúc toàn bộ chương trình Khi một chương trình EXE được nạp vào bộ nhớ để thực hiện, DOS sẽ tạo một mảng 256 byte gọi là đoạn mào đầu chương trình (Program Segment Prefix- PSP) dùng để chứa các thông tin liên quan đến chương trình và đặt nó phía trước vùng nhớ chứa các mã của chương trình DOS cũng cung cấp các thông số liên quan đến các ghi đoạn DS và ES Do đó DS và ES không chứa giá trị địa chỉ của đoạn dữ liệu của chương trình, vì thế phải có các lệnh khởi động cho chúng  Khung chương trình hợp ngữ dịch dạng COM Trong chương trình EXE có đầy đủ các đoạn, với chương trình COM các đoạn ngăn xếp, dữ liệu và mã lệnh sẽ được gộp chung Như vậy các chương trình COM sẽ ngắn gọn và đơn giản hơn, nó sẽ tiết kiệm cả về thời gian thực hiện, dung lượng bộ nhớ và dung lượng lưu trữ chương trình đĩa Sau là khung một chương trình hợp ngữ dịch dạng COM: Model Tiny Code Org 100H Start: Jmp Begin ; Các định nghĩa cho biến hằng và các chương trình để tại Begin: Main Proc 75 ; Các lệnh của chương trình chính để tại INT 20H ; trở về DOS Main Endp ; Các chương trình có thể để tại phần này End Start Một chương trình COM cũng được nạp vào bộ nhớ sau vùng PSP chương trình EXE Ngăn xếp của chương trình COM sẽ đặt tại cuối đoạn 64K dành cho nó, tức là đỉnh ngăn xếp chương trình bắt đầu thực hiện sẽ là FFFEH Chương trình COM sẽ bị các hạn chế gây bởi dung lượng cực đại dành cho toàn bộ chương trình gói gọn đoạn 64KB, nên chúng chỉ sử dụng cho các ứng dụng không lớn lắm Mặt khác chương trình cũng chỉ được sử dụng một ngăn xếp có dung lượng hạn chế, nếu có quá nhiều dữ liệu được nạp vào ngăn xếp sẽ làm mất các mã lệnh của chương trình  Cách tạo và thực hiện một chương trình hợp ngữ máy vi tính Máy vi tính IBM PC là tạo và thực hiện các chương trình hợp ngữ cho họ Intel Các bước để thực hiện công việc này sau: - Dùng các phần mềm soạn thảo văn bản (SK, NC…) để soạn thảo các chương trình nguồn được mặc định có đuôi ASM - Dùng các chương trình hợp dịch MASM hoặc TASM để dịch tập tin nguồn ASM dạng mã máy có đuôi OBJ Các dòng lệnh dưới dấu nhắc DOS sau: Với MASM: C:\MASM filename.ASM Với TASM: C:\TASM filename.ASM - Dịch và liên kết các tập tin OBJ thành tập tin có thể chạy được: Với MASM dùng LINK để liên kết các tập tin OBJ tạo chương trình EXE, nếu chương trình nguồn viết dưới dạng dịch EXE thì tập tin này có thể thực hiện được Nếu viết dưới dạng COM thì cần phải sử dụng EXE2BIN để dịch tập tin COM mới có thể chạy được Với TASM dùng TLINK để liên kết và tạo tập tin chạy EXE, nếu viết dưới dạng COM phải dùng dòng lệnh TLINK/t để tạo tập tin COM 4.4 Các cấu trúc lập trình bản Các lệnh của một ngôn ngữ, nhất là các lệnh hợp ngữ thường chỉ thực hiện các tác vụ bản Vì vậy để viết một chương trình người ta thường chia nó thành các khối chức nhỏ hơn, các khối chức nhỏ này lại chia thành các khối chức nhỏ nữa Việc phân chia này được thực hiện cho tới mỗi khối chức trở nên đơn giản và dễ dàng thực hiện bằng các lệnh Các khối chức thành phần thường được thực hiện bằng các cấu trúc lập trình bản Phương pháp chia chương trình thành các khối chức thành phần làm cho chương trình trở nên có cấu trúc, dễ dàng việc hiệu chỉnh, cải tiến và lập tài liệu lưu trữ cho nhiều người sử dụng Có ba cấu trúc lập trình bản thường được sử dụng giải quyết các công việc khác là : + Cấu trúc tuần tự + Cấu trúc lựa chọn + Cấu trúc lặp Đặc điểm chung của tất cả các cấu trúc lập trình bản là tính cấu trúc: tức là chỉ có một lối vào và một lối cho cấu trúc đó Các cấu trúc này thường được chuẩn hoá ở các ngôn ngữ cấp cao, phần này sẽ mô tả việc thực hiện chúng hợp ngữ 76 4.4.1 Cấu trúc tuần tự Cấu trúc tuần tự là cấu trúc thông dụng và đơn giản nhất Trong cấu trúc này các lệnh được thực hiện một cách tuần tự, lệnh nọ kế tiếp lệnh Sau thực hiện xong lệnh cuối cùng thì công việc phải được hoàn tất Ví dụ đoạn chương trình tính giá trị của biểu thức b – 4ac với a, b, c là các biến bit nằm các ghi BH, BL, CH có thể thực hiện sau: MOV AL,BL MUL BL ; AL=AL*BL với giả thiết kết quả là bit MOV CL,AL MOV AL,4 MUL BH MUL CL ; AL=4ac với giả thiết kết quả là bit SUB CH,AL 4.4.2 Cấu trúc lựa chọn  Cấu trúc IF – THEN Ngữ pháp: IF Điều kiện THEN Công việc Trong cấu trúc này nếu điều kiện thoả công việc sẽ được thực hiện, nếu không công việc sẽ bị bỏ qua Trong hợp ngữ cấu trúc này có thể thực hiện bằng các lệnh nhảy có điều kiện Giải thuật của cấu trúc biểu diễn hình 4.1 Ví dụ : Viết đoạn chương trình xoá AH về giá trị của nó lớn 03 CMP AH,03 JNA THOAT MOV AH,0 THOAT: Sai Điều kiện Đúng Công việc Hình 4.1 Giải thuật cấu trúc IF – THEN  Cấu trúc IF – THEN – ELSE Ngữ pháp: IF Điều kiện THEN Công việc1 ELSE Công việc Giải thuật của cấu trúc trình bày hình 4.2 cấu trúc này nếu thỏa điều kiện thì công việc được thực hiện, nếu không thì công việc được thực hiện Trong hợp ngữ điều này tương đương với việc sử dụng các lệnh nhảy có điều kiện và không điều kiện đến các nhãn khác 77 Ví dụ : Tìm số nhỏ hai số chứa AH và BH gán cho AL CMP AH,BH;AH

Ngày đăng: 12/12/2013, 16:15

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan