Kỹ thuật vi xử lý - Chương 3 pot

19 393 2
Kỹ thuật vi xử lý - Chương 3 pot

Đ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

Trờng đại học kỹ thuật Công Nghiệp Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính 28 http:// www.ebook.edu.vn Chơng 3 Lập trình bằng hợp ngữ cho 8088 trên máy tính IBM PC và các máy tơng thích IBM PC 1. Giới thiệu chung Sau khi đã giới thiệu một số lệnh cơ bản của bộ vi xử lý 8088 ta sẽ dùng các lệnh đó để lập trình dùng hợp ngữ trên các máy tính IBM PC (hoặc các máy tơng thích máy IBM PC). Vì loại máy tính này có cấu trúc tiêu biểu của một hệ vi xử lý, hơn nữa ta cũng có thể sử dụng nhiều chức năng sẵn có cho chơng trình thông qua các dịch vụ (các chơng trình con phục vụ ngắt) của các ngắt của DOS và của BIOS. Có thể sử dụng chơng trình dịch hợp ngữ MASM 5.10 (Macro Assembler phiên bản 5.10) của Microsoft với các định nghĩa đoạn đơn giản và chế độ bộ nhớ nhỏ. Ngoài ra ta cũng có thể sử dụng chơng trình dịch hợp ngữ TASM 2.0 (Turbo Assembler phiên bản 2.0) của Borland International để thực hiện dịch chơng trình của chúng ta. Ngôn ngữ assembly (hợp ngữ) Các chơng trình thực hiện chuyển đổi chơng trình của ngời sử dụng đợc viết bằng một ngôn ngữ nào đó sang một ngôn ngữ khác đợc gọi là chơng trình dịch (translate). Ngôn ngữ đợc sử dụng để viết chơng trình nguồn đợc gọi là ngôn ngữ nguồn còn ngôn ngữ của chơng trình mà do chơng trình nguồn chuyển sang đợc gọi là ngôn ngữ đích. Ngời ta đã phân chơng trình dịch làm 2 loại dựa trên mối quan hệ giữa ngôn ngữ nguồn và ngôn ngữ đích nh sau: - Khi ngôn ngữ nguồn về căn bản là một sự biểu diễn bằng ký hiệu cho một ngôn ngữ máy bằng số thì chơng trình dịch đợc gọi là assembler và ngôn ngữ nguồn đợc gọi là ngôn ngữ assembly (hợp ngữ). - Khi ngôn ngữ nguồn là một ngôn ngữ bậc cao nh Pascal, C, . . . và ngôn ngữ đích là ngôn ngữ máy hoặc là một biểu diễn bằng ký hiệu cho một ngôn ngữ nh vậy thì chơng trình dịch đợc gọi là compiler. Ngôn ngữ assembly thuần khiết là ngôn ngữ mà trong đó mỗi lệnh (chỉ thị) của nó khi đợc dịch sinh ra đúng một chỉ thị máy, điều đó có nghĩa là có sự tơng ứng 1 - 1 giữa các lệnh máy và các lệnh trong ngôn ngữ assembly. Nếu mỗi dòng trong chơng trình assembly chứa một chỉ thị assmebly và mỗi word trong bộ nhớ chứa một lệnh máy thì chơng trình dài n dòng sẽ sinh ra một chơng trình ngôn ngữ máy dài n word . Sử dụng ngôn ngữ assmebly để lập trình dễ hơn sử dụng ngôn ngữ máy (dạng số, là dãy các bit) rất nhiều. Việc sử dụng tên và địa chỉ bằng ký hiệu thay cho số nhị phân (hoặc hệ 8, 10, 16) tạo nên sự khác biệt lớn. Mọi ngời dễ dàng có thể nhớ đợc các ký hiệu (symbol) viết tắt cho lệnh cộng (add), trừ (substract), nhân (multiply) và chia (divide) là ADD, SUB, MUL, DIV nhng ít ai có thể nhớ đợc các lệnh máy cho các phép toán đó dới dạng số, ví dụ là: 24576, 57344, 28672 và 29184 (trừ khi làm việc quá nhiều với chúng mà tự nhiên nhớ đợc). Ngời lập trình bằng ngôn ngữ assembly chỉ cần nhớ các tên bằng ký hiệu gợi nhớ ADD, SUB, MUL, DIV, . . . vì chúng sẽ đợc assembler dịch ra các lệnh máy. Tuy nhiên nếu ai muốn lập trình bằng ngôn ngữ máy thì họ cần phải nhớ mã lệnh dới dạng số (hoặc liên tục tra cứu). Đối với địa chỉ, cũng rút ra các nhận xét tơng tự. Ngời lập trình bằng ngôn ngữ asembly có thể đặt tên bằng ký hiệu gợi nhớ cho các ô nhớ và giao cho assembly phải Trờng đại học kỹ thuật Công Nghiệp Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính 29 http:// www.ebook.edu.vn cung cấp đúng địa chỉ bằng số, trong khi đó ngời lập trình bằng ngôn ngữ máy luôn luôn phải làm việc với các giá trị bằng số của các địa chỉ. Vì vậy mà từ khi có ngôn ngữ assembly ra đời cho đến nay, không còn ai viết chơng trình bằng ngôn ngữ máy nữa. Ngoài sự tơng ứng (ánh xạ) 1 - 1 của các lệnh assembly vào các lệnh máy, ngôn ngữ assembly còn có một tính chất khác nữa làm cho nó khác hẳn các ngôn ngữ lập trình bậc cao, đó là ngời lập trình bằng ngôn ngữ assembly có thể truy cập tới tất cả các đặc điểm trong máy tính vật lý. Ví dụ, nếu có một bit báo tràn số (Overflow bit) thì chơng trình bằng ngôn ngữ assembly có thể truy cập và kiểm tra trực tiếp bit này, trong khi đó chơng trình bằng ngôn ngữ bậc cao (Pascal, C . . .) không thể làm đợc việc đó. Một sự khác biệt lớn và quan trong nữa giữa chơng trình assembly và chơng trình bằng ngôn ngữ bậc cao là chơng trình bằng ngôn ngữ assembly chỉ có thể chạy đợc trên một họ máy, trong khi đó chơng trình đợc viết bằng ngôn ngữ bậc cao nói chung có thể chạy đợc trên nhiều họ máy, đây chính là một u điểm lớn của ngôn ngữ bậc cao so với ngôn ngữ assembly. Nói chung, tất cả các việc có thể thực hiện đợc bằng ngôn ngữ máy đều có thể thực hiện đợc bằng ngôn ngữ assembly, tuy nhiên ngôn ngữ bậc cao không làm đợc nh vậy một cách hiệu quả. Khi xây dựng các ứng dụng lớn, thông thờng ngời ta chọn ngôn ngữ bậc cao vì nó hớng tới thuật toán giải quyết vấn đề (Ngôn ngữ hớng bài toán - problem-oriented language) mà không chọn ngôn ngữ assembly vì khi đó ngời lập trình phải chú ý tới các chi tiết nhỏ nhặt khi lập trình. Ngợc lại, khi xây dựng các chơng trình nhỏ thực hiện các thao tác can thiệp sâu vào phần cứng máy tính thì ngời ta thờng chọn ngôn ngữ assembly vì tính tối u, hiệu quả và khả năng mạnh mẽ của nó. 2. Giới thiệu khung chơng trình Với bất kỳ ngôn ngữ nào, khi ta lập trình bằng ngôn ngữ đó ta cũng phải tuân thủ chơng trình viết đúng cú pháp, quy định khung chơng trình. Từ đó chơng trình mới đợc dịch ra mã máy, rồi mới tạo ra các chơng trình chạy đợc (phần mở rộng: *.EXE hoặc *.COM). Một chơng trình hợp ngữ bao gồm các dòng lệnh, mỗi lệnh đợc viết trên một dòng - Một dòng lệnh có thể là lệnh thật dới dạng gợi nhớ (nmenomic) hay dạng ký hiệu (symbolic) của bộ vi xử lý. - Hoặc hớng dẫn chơng trình dịch (Essembler directive). Lệnh thật dới dạng gợi nhớ sẽ đợc dịch ra mã máy còn hớng dẫn chơng trình dịch thì không, nó chỉ có tác dụng chỉ dẫn cho chơng trình dịch thực hiện công việc trong quá trình dịch. Lệnh có thể đợc viết dới dạng chữ hoa hay chữ thờng đều đợc, chúng đợc cho là tơng đơng vì đối với các dòng lệnh, chơng trình dịch không phân biệt kiểu chữ. a. Cấu trúc của một lệnh hợp ngữ Một dòng lệnh của chơng trình hợp ngữ (assembly) có cấu trúc nh sau: Tên (Nhãn) Mã lệnh Các toán hạng Giải thích Trờng đại học kỹ thuật Công Nghiệp Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính 30 http:// www.ebook.edu.vn Ví du: + LAP: Mov CL, AH ;Số lần lặp đợc đặt trong thanh ghi CL LAP là nhãn Mov là mã lệnh CL, AH là các toán hạng Và trờng giải thích bắt đầu bằng dấu chấm phẩy (;) + Main Proc Main là tên Proc là mã của lệnh giả () hay hớng dẫn chơng trình dịch (dùng để bắt đầu chơng trình hoặc bắt đầu chơng trình con) Một lệnh không nhất thiết phải có đầy đủ các trờng nh trên. Tuỳ từng công việc cụ thể mà lệnh có thể khuyết một hoặc một số trờng nào đó. Trờng tên (Nhãn) Trờng này chứa nhãn, tên biến, tên hằng hoặc tên thủ tục của chơng trình. Tên và nhãn sẽ đợc chơng trình dịch gán bằng các địa chỉ cụ thể của ô nhớ. Quy tắc đặt tên (cũng khá giống nh quy tắc đặt tên trong ngôn ngữ Pascal) - Dùng các ký tự thuộc bộ chữ cái (không phân biệt chữ hoa, chữ thờng) - Không đợc bắt đầu bằng chữ số, không đợc chứa dấu cách - Độ dài: 1 21 ký tự - Có thể sử dụng các ký tự đặc biệt nh: ?, ., _, @, $, % - Trong trờng hợp nếu dùng dấu chấm (.), thì nó phải đợc đặt ở vị trí đầu tiên của tên hoặc nhãn. - Nhãn thờng kết thúc bằng dấu hai chấm (;) Trờng mã lệnh Trờng này gồm mã các lệnh thật hoặc giả (hớng dẫn chơng trình dịch) - Lệnh thật: lệnh dạng gợi nhớ (nmemonic) của bộ vi xử lý. Lệnh này sẽ đợc chơng trình dịch dịch ra mã máy. - Hớng dẫn chơng trình dịch thì không đợc dịch. Trờng các toán hạng Trờng này là dữ liệu cho các thao tác Tuỳ từng lệnh cụ thể mà có thể có 2, 1 hoặc không có toán hạng nào Ví dụ: Mov al, al ;Lệnh này có 2 toán hạng Rol bx, cl ;Lệnh này có 2 toán hạng Not bl ;Lệnh này có 1 toán hạng Ret n ;Lệnh này có 1 toán hạng Ret ;Lệnh này không có toán hạng nào Sti ;Lệnh này không có toán hạng nào Nop ;Lệnh này không có toán hạng nào Với hớng dẫn chơng trình dịch, trờng này chứa các thông tin khác nhau liên quan đến các lệnh giả của hơng dẫn. Trờng đại học kỹ thuật Công Nghiệp Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính 31 http:// www.ebook.edu.vn Trờng giải thích Trờng này đợc bắt đầu bằng dấu chầm phẩy (;), sau đó là dòng giải thich. Chơng trình dịch sẽ bỏ qua không dịch trờng này. Lệnh tuy đợc viết dới dạng gợi nhớ của bộ vi xử lí, tuy nhiên chúng ta luôn nên có trờng này. Lời giải thích cần sát nghĩa của công việc thực hiện (không nên giải thích ý nghĩa của câu lệnh). b. Dữ liệu cho chơng trình hợp ngữ Dữ liệu cho (của) một chơng trình hợp ngữ có thể ở dạng hệ 2, hệ 10, hệ 16 hoặc dạng ký tự. Đối với chơng trình Debug (dùng để tìm lỗi cho các chơng trình hợp ngữ) thì dữ liệu bằng số đọc ngầm định ở dạng hệ 16. Còn đối với assembly thì dữ liệu bằng số đợc ngầm định ở hệ 10. Khi cung cấp dữ liệu cho chơng trình, số cho ở hệ nào thì phải kèm hậu tố của hệ đó (trừ hệ 10 - ngầm định). Riêng đối với hệ 16, nếu số bắt đầu bằng chữ cái (a f hoặc A F) thì phải thêm số 0 ở trớc để chơng trình dịch không nhầm với một tên hoặc nhãn nào đó. (B-Binary: Hệ 2; D-Decimal: Hệ 10; H-Hexa: Hệ 16). Ví dụ: 1001b ;số ở hệ 2 100 ;số ở hệ 10 0ah ;số ở hệ 16 Nếu dữ liệu cho dới dạng ký tự thì phải bao đóng (đặt) ký tự trong cặp dấu nháy đơn. Ví dụ: 'a' ;Ký tự a 'abcd' ;Chuỗi ký tự Với kiểu ký tự, ngoài cách trên ta còn có thể dùng mã ASCII của ksy tự đó. Ví dụ: '0' ;Ký tự 0 30h ;Mã ASCII của ký tự 0 Với 2 cách viết trong ví dụ trên là nh nhau đối với chơng trình dịch assembler. c. Biến và hằng Một biến bất kỳ đợc sử dụng trong chơng trình hợp ngữ phải đợc định nghĩa, chơng trình dịch sẽ gán cho biến đó một địa chỉ xác định trong bộ nhớ. Biến đơn Một biến đơn trong chơng trình hợp ngữ đợc định nghĩa theo mẫu sau: Tên_biến Kiểu Giá trị khởi tạo Tên: do ngời sử dụng tự đặt theo quy tắc đặt tên Kiểu: là kích thớc (phạm vi) biểu diễn của biến. Có các kiểu sau: DB (Define Byte): Kiểu byte (1 byte) DW (Define Word): Kiểu word (2 byte) DD (Define Double Word): Kiểu double word (4 byte) DF (Define Farword): Kiểu farword (6 byte), chỉ dùng với bộ vi xử lý 80386 DQ (Define Quadword): Kiểu Quadword (8 byte) Trờng đại học kỹ thuật Công Nghiệp Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính 32 http:// www.ebook.edu.vn DT (Define Ten byte): Kiểu Ten byte (10 byte) Trong một biến có kích tớc lớn hơn 1 byte thì byte cao ở địa chỉ cao, byte thấp ở địa chỉ thấp (Theo quy ớc Big-endian của Intel). Ví dụ: Ab db 4 ;Định nghĩa một biến có tên là Ab, kích thớc 1 byte và đợc ;khởi tạo giá trị bằng 4. Ab1 db ? ;Định nghĩa một biến có tên là Ab1, kích thớc 1 byte và đợc ;cha đợc khởi tạo giá trị. Ab2 dw 100h ;Định nghĩa một biến có tên là Ab2, kích thớc 2 byte và đợc ;đợc khởi tạo giá trị bằng 100h = 256. Ab3 dw ? ;Định nghĩa một biến có tên là Ab3, kích thớc 2 byte và đợc ;cha đợc khởi tạo giá trị. Biến mảng Một biến mảng trong chơng trình hợp ngữ đợc định nghĩa theo mẫu sau: Tên_biến Kiểu Các giá trị khởi tạo Tên: do ngời sử dụng tự đặt theo quy tắc đặt tên. Kiểu: là kích thớc (phạm vi) biểu diễn của biến nh đã biết. Biến mảng là biến hình thành từ một dãy liên tiếp các phần tử cùng kiêu. Khi định nghĩa biến mảng ta gán tên cho một dãy liên tiếp các phần tử có cùng độ dài (kích thớc) trong bộ nhớ cùng với các giá trị ban đầu tơng ứng. Ví dụ: Ar db 1, 3, 2, 4 ;Định nghĩa một biến có tên là Ar, gồm 4 phần tử, mỗi phần tử có kích thớc 1 ;byte (gồm 4 byte đợc dành chỗ cho nó trong bộ nhớ từ địa chỉ ứng với Ar để ;chứa các giá trị khởi đầu là: 1, 2, 3 và 4). Phần tử đầu tiên của mảng có địa ;chỉ trùng với địa chỉ của Ar và có giá trị là 1, phần tử thứ 2 có địa chỉ là Ar+1 ;và có giá trị là 2, phần tử tiếp theo có . . . Ta có thể dùng toán tử DUP để khởi đầu giá trị các phần tử của mảng với cùng một giá trị. Ví dụ: Ar1 dw 100 DUP(5) ;Định nghĩa một biến có tên là Ar1, gồm 100 phần tử, mỗi phần tử có kích ;thớc 2 byte (gồm 200 byte đợc dành chỗ cho nó trong bộ nhớ từ địa chỉ ứng ;với Ar1 để chứa với cùng một giá trị khởi đầu cho mỗi 2 byte (word) là 5). ;Phần tử đầu tiên của mảng có địa chỉ trùng với địa chỉ của Ar1, các phần tử tiếp ;theo có địa chỉ Ar1+2, Ar1+4, Ar1+6, . . . Ar2 dd 20 DUP(?) ;Định nghĩa một biến có tên là Ar2, gồm 20 phần tử, mỗi phần tử có kích thớc ;4 byte (gồm 80 byte đợc dành chỗ cho nó trong bộ nhớ từ địa chỉ ứng với Ar2 ;và cha đợc khởi đầu giá trị). Phần tử đầu tiên của mảng có địa chỉ trùng với ;địa chỉ của Ar, các phần tử tiếp theo có địa chỉ Ar2+4, Ar2+8, Ar2+12, . . . Đặc biệt ta có thể dùng toán tử DUP lồng nhau để khởi đầu giá trị các phần tử của mảng. Ví dụ: Ar3 db 2, 2, 2 DUP(1, 3 DUP(5), 4) Trờng đại học kỹ thuật Công Nghiệp Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính 33 http:// www.ebook.edu.vn ;Định nghĩa một biến có tên là Ar3, gồm 12 phần tử, mỗi phần tử có kích thớc 1 byte (gồm 12 byte đợc dành chỗ cho nó trong bộ nhớ từ địa chỉ ứng với Ar3 để chứa các giá trị khởi đầu cho mỗi byte). Phần tử đầu tiên của mảng có địa chỉ trùng với địa chỉ của Ar3, các phần tử tiếp theo có địa chỉ Ar3+1, Ar3+2, . . . Dãy thứ tự giá trị các phần tử là: 2, 2, 1, 5, 5, 5, 4, 1, 5, 5, 5, 4 Biến xâu Biến kiểu xâu ký tự là trờng hợp dặc biệt của biến mảng mà các phần tử của mảng là ký tự. Một xâu ký tự có thể đợc định nghĩa bằng các ký tự, xâu ký tự hoặc bằng mã ASCII của các ký tự. Chúng ta có thể định nghĩa biến xâu ký tự theo các dòng ví dụ sau, chúng là tơng đơng nhau: Ví dụ: Str1 db 'Co non' Str2 db 'C', 'o', ' ', 'n', 'o', 'n' Str3 db 'C', 'o', ' ', 'non' Str4 db 43h, 6fh, 32h, 6eh, 6fh, 6eh Str5 db 43h, 'o', 32h, 'n', 6fh, 6eh Hằng Trong chơng trình hợp ngữ, các giá trị không đổi thờng đợc gán tên làm cho chơng trình rõ ràng, dễ đọc hơn - gọi là các hằng. Hằng trong chơng trình 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 nhờ lệnh giả EQU (Equate) theo mẫu sau: Tên_hằng Equ Giá trị khởi tạo Ví dụ: Cr Equ 0dh ;Carriage return Lf Equ 0ah ;Line feed Pa Equ 3f8h Clause Equ 'Co non xanh tan chan troi' Str db Clause,'$' Str1 db Clause, Cr, Lf., '$' d. Khung của một chơng trình hợp ngữ Một chơng trình mã máy đợc nạp vào bộ nhớ thờng bao gồm các vùng nhớ khác nhau: - Vùng dữ liệu: Dùng để chứa các biến, kết quả trung gian hay kết quả khi chạy chơng trình. - Vùng mã lệnh: Dùng để chứa mã lệnh của chơng trình. - Vùng ngăn xếp: Dùng để phục vụ cho các hoạt động của chơng trình nh gọi chơng trình con, trở về chơng trình chính từ chơng trình con. Một chơng trình hợp ngữ cũng có cấu trúc nh vậy, để khi đợc dịch nó sẽ tạo ra mã tơng ứng với chơng trình mã máy nói trên (có cấu trúc giống nh vậy). Chúng ta sẽ khai báo quy mô sử dụng bộ nhớ đối với các vùng nhớ đó để sử dụng một cách phù hợp, tiết kiệm, hiệu quả và đúng với cấu trúc chơng trình. Khai báo quy mô sử dụng bộ nhớ Khai báo này xác định kích thớc cho đoạn mã và dữ liệu của chơng trình. Trờng đại học kỹ thuật Công Nghiệp Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính 34 http:// www.ebook.edu.vn Sử dụng hớng dẫn chơng trình dịch .Model đặt trớc các hớng dẫn khác trong chơng trình theo mẫu nh sau: .Model Kích_thớc Ví dụ: .Model Small .Model Tiny Có các kiểu Kích_thớc bộ nhớ cho chơng trình hợp ngữ nh sau: - Tiny (hẹp): Mã lệnh và dữ liệu nằm gọn trong một đoạn - Small (nhỏ): Mã lệnh trong một đoạn, dữ liệu trong một đoạn - Medium (Trung bình): Mã lệnh hơn một đoạn, dữ liệu trong một đoạn - Compact (Gọn): Mã lệnh trong một đoạn, dữ liệu hơn một đoạn - Large (Lớn), Huge (Rất lớn - khổng lồ): Mã lệnh và dữ liệu hơn một đoạn. Các mảng có thể lớn hơn 64KByte Khai báo đoạn ngăn xếp Ngăn xếp là vùng nhớ phục vụ cho các hoạt động của chơng trình khi gọi cheơng trình con và trở về chơng trình chính từ chơng trình con. Tuỳ theo cấu trúcvà quy mô của chơng trình mà ta khai báo kích thớc của đoạn này. Việc khai báo đợc thực hiện nhờ hớng dẫn chơng trình dịch .Stack theo mẫu sau: .Stack Kích_thớc Ví dụ: .Stack 100 .Stack 100h ;256 Chú ý: Nếu ta không khai báo kích thớc của đoạn này thì chơng trình dịch sẽ tự động gán giá trị 1 Kbyte cho vùng ngăn xếp này. Đây là kích thớc quá lớn đối với một ứng dụng thông thờng. Nói chung ta nên chọn là 100 hoặc 100h là đủ. Khai báo đoạn dữ liệu Phần này để định nghĩa các biến của chơng trình. Hằng cũng nên định nghĩa ở đây để đảm bảo sự thống nhất (mặc dù ta có thể định nghĩa hằng ở chỗ khác, lý do là lệnh giả EQU không cấp phát bộ nhớ cho hằng (tên hằng không tơng ứng với một địa chỉ nào) nên ta có thể định nghĩa hằng tự do thoải mái trong chơng trình. Việc khai báo đoạn dữ liệu đợc thực hiện nhờ hớng dẫn chơng trình dịch .Data. Định nghĩa các biến, mảng và hằng đợc thực hiện tiếp ngay sau đó bằng các lệnh giả thích hợp, của thể nh sau: Ví dụ: .Data Chao db 'Xin chao ban!','$' Crlf db 0dh, 0ah, '$' Pa Equ 300h Khai báo đoạn mã lệnh Phần này chứa toàn bộ mã lệnh của chơng trình. Việc khai báo đoạn mã đợc thực hiện nhờ hớng dẫn chơng trình dịch .Code nh sau: .Code Tên_CTC Proc Các lệnh ;Các lệnh của thanh chơng trình chính Trờng đại học kỹ thuật Công Nghiệp Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính 35 http:// www.ebook.edu.vn Call Tên_ctc ;Gọi chơng trình con . . . Tên_CTC Endp Tổng quát: Một thủ tục đợc định nghĩa nhờ cặp thủ tục 'Proc - Endp ', chơng trình chính cũng là một thủ tục đợc định nghĩa nh trên. Lệnh giả Proc dùng để báo bắt đầu một thủ tục và lệnh giả Endp dùng để báo kết thúc thủ tục đó. Một chơng trình con cũng đợc định nghĩa dới dạng một thủ tục nhờ các lệnh giả 'Proc - Endp ' nh sau: Tên_ctc Proc Các lệnh của chơng trình con ở đây Ret Tên_ctc Endp Chú ý: Trong chơng trình con, tại cuối chơng trình có lệnh Ret là lệnh trở về chơng trình chính từ chơng trình con. Để kết thúc toàn bộ chơng trình, ta dùng hớng dẫn chơng trình dịch End nh sau: End Tên_CTC Khung của chơng trình hợp ngữ để dịch ra chơng trình *.exe .Model Small .Stack 100 .Data ;Định nghĩa các biến, mảng, hằng ở đây .Code Tên_CTC Proc ;Khởi tạo đoạn dữ liệu Mov ax, @Data Mov ds, ax Mov es, ax ;Nếu cần ;Các lệnh của chơng trình chính ;Trở về DOS dùng hàm 4ch của ngắt 21h Mov ah, 4ch Int 21h Tên_CTC Endp ;Các chơng trình con nếu có đợc định nghĩa ở đây End Tên_CTC Khi chơng trình *.exe đợc nạp vào bộ nhớ, DOS sẽ lập ra một một mảng gọi là đoạn mào đầu chơng trình (Program Segment Prefix - PSP) gồm 256 byte dùng để chứa các thông tin liên quan đến chơng trình và cả DOS, đợc gắn vào đầu chơng trình. DOS sử dụng các thông tin này để giúp chạy chơng trình, PSP đợc DOS khởi tạo cho mọi chơng trình dù chúng đợc viết bằng ngôn ngữ nào. Do ngay khi chơng trình đợc nạp vào bộ nhớ, DOS cũng đa các thông số liên quan đến chơng trình vào các thanh ghi DS và ES (cụ thể là DS và ES trỏ vào đầu của PSP) mà không chứa giá trị địa chỉ của các thanh ghi đoạn dữ liệu của chơng trình. Để chơng trình chạy đúng, ta phải khởi đầu cho các thanh ghi DS và ES nhờ các lệnh: Với 8088/8086 và một số bộ vi xử lý khác thuộc họ 80x86 Mov ax, @Data Mov ds, ax Mov es, ax Trờng đại học kỹ thuật Công Nghiệp Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính 36 http:// www.ebook.edu.vn của Intel, vì lý do kỹ thuật mà chúng không cho phép chuyển giá trị số (chế độ địa chỉ trực tiếp) vào các thanh ghi đoạn nên ta phải dùng thanh ghi ax làm trung gian. Thanh ghi ax cũng có thể thay thế bằng các thanh ghi đa năng khác. @Data là tên của đoạn dữ liệu, .Data dđịnh nghĩa bởi hớng dẫn chơng trình dịch chơng trình dịch sẽ dịch tên @Data thành giá trị địa chỉ của đoạn dữ liệu. Chơng trình ví dụ1.asm để dịch ra *,exe, thực hiện xuất một dòng ký tự lên màn hình. Dòng ký tự ở đây là lời chào bất kỳ đợc hiện giữa 2 dòng trống: .Model Small .Stack 100 .Data Chao db 'Xin chao, chuc mung ban da thanh cong voi chuong trinh dau tay$' Crlf db 0dh, 0ah, '$' .Code Vidu1 Proc Mov ax, @Data ;Lấy địa chỉ của đoạn dữ liệu Mov ds, ax ;Khởi tạo đoạn dữ liệu Mov es, ax ;Về đầu dòng mới dùng hàm 9 của ngắt 21h để "hiển thị" cặp ký tự ;xuống dòng (lf: line feed) và về đầu dòng (cr: carriage return) Mov ah, 9 Lea dx, crlf Int 21h ;Hiển thị lời chào dùng hàm 9 của ngắt 21h Mov ah, 9 Lea dx, Chao Int 21h ;Về đầu dòng mới dùng hàm 9 của ngắt 21h Mov ah, 9 Lea dx, crlf Int 21h ;Về DOS dùng hàm 4ch của ngắt 21h Mov ah, 4ch Int 21h Vidu1 Endp End Vidu1 Nhận xét về chơng trình trên: Khung của chơng trình hợp ngữ để dịch ra chơng trình *.com Với khung chơng trình hợp ngữ để dịch ra tệp chơng trình chạy đợc *.exe thì có mặt đầy đủ các đoạn. Ngoài tệp chơng trình chạy đợc có phần mở rộng .exe ra ta còn có khả năng dịch chơng trình hợp ngữ có kết cấu (cấu trúc) thích hợp ra một loại chơng trình chạy đợc kiểu khác với phần mở rộng .com. Đây là chơng trình ngắn gọn và đơn giản hơn nhiều so với tệp chơng trình *.exe mà trong đó các đoạn: đoạn mã, đoạn dữ liệu và đoạn ngăn xếp của chơng trình đợc gói gọn trong một đoạn (64Kbyte) duy nhất là đoạn mã. Với những ứng dụng mà dữ liệu và mã lệnh của chơng trình không yêu cầu nhiều về không gian nhớ thì ta có thể ghép luôn chúng chung vào cùng một đoạn mã rồi tạo ra tệp *.com. Việc tạo ra tệp này không chỉ tiết Trờng đại học kỹ thuật Công Nghiệp Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính 37 http:// www.ebook.edu.vn kiệm đợc thời gian và bộ nhớ khi cho chạy chơng trình mà còn tiết kiệm cả không gian nhớ khi phải lu trữ chúng trên bộ nhớ ngoài (đĩa từ). Để có thể tạo ra đợc chơng trình với phần mở rộng .com thì chơng trình nguồn hợp ngữ phải có kết cấu thích hợp, một ví dụ nh sau: .Model Tiny .Code ORG 100h Start: Jmp Continue ;Định nghĩa các biến, mảng, hằng ở đây Continue: Tên_CTC Proc ;Các lệnh của chơng trình chính ;Trở về DOS dùng ngắt 20h Int 20h Tên_CTC Endp ;Các chơng trình con nếu có đợc định nghĩa ở đây End Start Nhìn vào khung chơng trình hợp ngữ để dịch ra chơng trình .com ta thấy không có khai báo đoạn ngăn xếp và đoạn dữ liệu, khai báo quy mô sử dụng bộ nhớ là Tiny (tuy nhiên có thể sử dụng quy mô bộ nhớ là Small). ở đầu đoạn mã có lệnh giả Org (Origin: điểm xuất phát) và lệnh Jmp (nhảy). Lệnh Org 100h dùng để gán điạ chỉ bắt đầu cho chơng trình là 100h trong đoạn mã, bỏ qua vùng nhớ kích thớc 100h (256 byte) cho đoạn mào đầu (PSP) từ địa chỉ 0 đến địa chỉ 255. Lệnh Jmp dùng để nhảy qua phần bộ nhớ dành cho việc định nghĩa các dữ liệu (về nguyên tắc, dữ liệu có thể đợc đặt ở đầu hoặc cuối đoạn mã nhng ở đây, nó đợc đặt ở đầu để có thể áp dụng các định nghĩa đơn giản đã nói). Đích của lệnh nhảy là phần bắt đầu của chơng trình chính. Hình vẽ: Tệp chơng trình .com trong bộ nhớ Nhìn vào hình vẽ ta thấy một chơng trình .com cùng đợc nạp vào bộ nhớ sau vùng PSP nh chơng trình .exe. Ngăn xếp cho chơng trình đợc đặt cuối đoạn mã, đỉnh của ngăn xếp lúc ban đầu là ô nhớ có địa chỉ FFFEh. Đặc điểm của chơng trình *.com Vì dung lợng nhớ cực đại của một đoạn là 64Kbyte, nên ta phải chắc chắn rằng chơng trình của ta có số lợng byte của mã lệnh và dữ liệu là không lớn (không vợt quá giới hạn cho phép của một đoạn, nếu không nó sẽ làm cho cả nhóm nở ra về phía địa chỉ cao của đoạn). Chơng trình phải sử dụng ngăn xếp một cách hạn chế, nếu không nó sẽ làm cho đỉnh ngăn xếp dâng lên về phía địa chỉ thấp của đoạn khi hoạt động.Chúng ta phải đảm bảo rằng không thể xảy ra hiện tợng chùm lên nhau của các thông tin tại vùng ngăn xếp và thông tin tại vùng mã lệnh và dữ liệu. Khi kết thúc chơng trình kiểu *.com, để trở về DOS ta dùng ngắt 20h của DOS để làm cho chơng trình gọn hơn. Mặc dù ta vẫn có thể dùng hàm 4ch của ngắt 21h để trở về DOS nh đã dùng trong chơng trình để dịch ra *.exe. [...]... bị ghi mới Mở một tệp cho trớc ah =39 h; ds:dx=con trỏ trỏ đến một chuỗi ASCIIZ (đờng dẫn-path) ah=3ah; ds:dx=con trỏ trỏ đến một chuỗi ASCIIZ (đờng dẫn-path) ah=3bh; ds:dx=con trỏ trỏ đến một chuỗi ASCIIZ (đờng dẫn-path) ah=3ch; ds:dx=con trỏ trỏ đến một chuỗi ASCIIZ (đờng dẫn-path); cx=thuộc tính của tệp 36 h 3dh 3eh 3fh 40h 41h 42h 47h 48h Đóng một thẻ tệp cho trớc Đọc từ một tệp hay từ một thiết bị... dl=ngày (1 31 ) al=00h nếu ngày hợp lệ; al=ffh nếu ngày không hợp lệ ah=2bh; cx=năm(1980 2099); dh=tháng (1 12); dl=ngày (1 31 ) ah=2ch; ah=2dh; ch=giờ (0 23) ; cl=phút(0 59); dh=giây (0 59); dl=phần trăm giây(0 99) ah =30 h; ah =31 h; al=mã trả lại; dx=kích thớc bộ nhớ tính theo đơn vị 16 byte ah =33 h; al=00h để xác định trạng thái hiện tại của Ctrl-Break al=01h để thiết lập trạng thái hiện tại của Ctrl-Break... http://www.ebook.edu.vn 35 h Trờng đại học kỹ thuật Công Nghiệp Xác định vector ngắt (nhận địa chỉ của một vector ngắt) Xác định dung lợng còn trống trên đĩa ah =35 h; al=số hiệu ngắt; 39 h Tạo th mục con (MkDir) 3ah Xoá thu mục con (RmDir) 3bh Thay đổi th mục hiện tại (ChDir) 3ch Tạo lập một tệp (Creat) Tạo ra một tệp mới hoặc cắt bỏ tệp cũ để có đọ dài bằng 0 để chuẩn bị ghi mới Mở một tệp cho trớc ah =39 h; ds:dx=con... Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính 41 http://www.ebook.edu.vn for: mov dl,'*' mov cl,80 int 21h loop for Trờng đại học kỹ thuật Công Nghiệp ;để hiển thị ký tự e Cấu trúc While do vào Đây là vòng lặp với số lần lặp không biết trớc Chừng nào biểu thức điều kiện còn đúng thì thực hiện lặp lại công vi c (cv), để đảm bảo cho tính dừng của giải thuật thì công vi c (cv) phải có... tự nhận thuộc tính của ký tự vi t trớc Thiết lập bảng màu, nền và vi n Vi t điểm ảnh đồ hoạ Đọc điểm ảnh đồ hoạ Vi t ký tự trong chế độ telex Xác định chế độ màn hình Thiết lập thanh ghi màu Trờng đại học kỹ thuật Công Nghiệp ASCII của ký tự ah=9; al=mã ASCII của ký tự; bh=số trang; bl=thuộc tính; cx=số lần vi t ký tự ah=0ah; al=mã ASCII của ký tự; bl=số trang; cx=số lần vi t ký tự Không Thành công:... chạy đợc Đ *.exe Nếu chơng trình vi t ra để dịch ra kiểu chơng trình Dùng exe2bin dịch *.exe *.com thì ta phải dùng chơng trình EXE2BIN của thành *.com DOS để dịch tiếp tệp *.exe ra tệp chơng trình *.com Cho chạy Cho chạy chơng trình vừa dịch Chơng trình 38 Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính http://www.ebook.edu.vn Trờng đại học kỹ thuật Công Nghiệp 4 Các cấu trúc... trờng hợp cấu trúc while - do và cấu trúc repeat - until có thể thay thế cho nhau đợc Sự khác nhau ở chỗ: với cấu trúc repeat - until thì công vi c đợc thực hiện ít nhất 1 lần còn trong cấu trúc while - do thì công vi c có thể không đợc thực hiện lần nào Ta sẽ sử dụng các lệnh nhảy có điều kiện để điều cho vòng lặp này vào cv s dk đ ra Ví dụ: Tính tổng ax = 1+4+7+ + (3* (n-1)+1) Cộng cho đến khi số... luỹ add bx ,3 ;Chuyển lên phần tử tiếp theo của dãy cmp bx,100 ;Kiểm tra điều kiện (yêu cầu) của bài toán jbe repeat ;nếu cha thoả mãn thì cộng tiếp số hạng tiếp theo vào ax ;Ra khỏi cấu trúc 42 Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính http://www.ebook.edu.vn Trờng đại học kỹ thuật Công Nghiệp 5 Truyền tham số Khi xây dựng các ứng dụng cụ thể, ta cần quan tâm tới vi c truyền... trạng thái hiện tại của Ctrl-Break al=01h để thiết lập trạng thái hiện tại của Ctrl-Break dl=00h để thiết lập trạng thái OFF của Ctrl-Break dl=01h để thiết lập trạng thái ON của Ctrl-Break Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính ch=giờ (0 23) ; cl=phút(0 59); dh=giây (0 59); dl=phần trăm giây(0 99) al=00f nếu tgian hợp lệ; al=ffh nếu thời gian không hợp lệ bx=0000h; cx=0000h;... => hiên thị thông báo (Dkhien), mov dl,bl ;không là ký tự điều khiển thì 40 Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính s dk cv2 ra http://www.ebook.edu.vn Trờng đại học kỹ thuật Công Nghiệp mov ah,2 ;hiển thị ký tự đó int 21h ;bằng hàm 2 của ngắt 21h jmp Ra ;Xong công vi c thì ra khỏi cấu trúc Dkhien:lea dx,mesg ;mesg là biến xâu chứa dòng thông báo mov ah,9 ;Dùng hàm 9 . dùng với bộ vi xử lý 8 038 6 DQ (Define Quadword): Kiểu Quadword (8 byte) Trờng đại học kỹ thuật Công Nghiệp Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính 32 http:// www.ebook.edu.vn. tử của mảng. Ví dụ: Ar3 db 2, 2, 2 DUP(1, 3 DUP(5), 4) Trờng đại học kỹ thuật Công Nghiệp Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính 33 http:// www.ebook.edu.vn. số bộ vi xử lý khác thuộc họ 80x86 Mov ax, @Data Mov ds, ax Mov es, ax Trờng đại học kỹ thuật Công Nghiệp Nguyễn Tiến Duy Trung tâm Kỹ thuật máy tính Bộ môn Kỹ thuật máy tính 36 http:// www.ebook.edu.vn

Ngày đăng: 22/07/2014, 05:21

Từ khóa liên quan

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

  • Đang cập nhật ...

Tài liệu liên quan