DIV nguồn (Unsigned Divide)
2.3.6. Nhóm các lệnh đặc biệt CALL TEN_ctc
CALL TEN_ctc
Lệnh gọi chương trình con có tên là TEN_ctc trong cùng đoạn mã với chương trình chính. Chương trình này phải nằm trong giới hạn dịch chuyển –32Kbyte..32Kbyte-1 so với lệnh tiếp theo ngay sau lệnh CALL. Sau khi cất IP vào Stack, IP <= IP+Dịch chuyển. Nếu chương trình con nằm ở đoạn mã khác thì trong chương trình hợp ngữ TEN_ctc phải được khai báo là một chương trình con ở xa.
TEN_ctc Proc Far
HTL (Hall Processing): Dừng
Khi gặp lệnh này các hoạt động của 8088 bị tạm dừng (bước vào trạng thái dừng) cho đến khi có tác động vào chân INTR, NMI hoặc Reset của nó.
INT N (Interrupt Program Execution): Ngắt, gián đoạn chương trình đang được thực hiện.
(N=00h..FFh, gọi là số hiệu ngắt)
Khi gặp lệnh này, 8088 thực hiện các thao tác sau:
• SP <= SP-2, {SP} <= FR • IF <= 0 (cấm ngắt), TF <= 0 (chạy suốt) • SP <= SP-2, {SP} <= CS • SP <= SP-2, {SP} <= IP • IP <= {N*4}, CS <= {N*4+2} Ví dụ: Với N=5 thì: CS <= {0016h} IP <= {0014h}
INTO (Interrupt on Overflow): Ngắt nếu có tràn.
Nếu OF=1 thì lệnh ngắt cơng việc đang làm của bộ vi xử lý và thực hiện lệnh ngắt INT 4.
IRET(Interrupt Return)
Trở về chương trình chính (CTC) từ chương trình con phục vụ ngắt (ISR – Interrup Service Routin).
Tại cuối ISR phải có lệnh IRET để bộ vi xử lý tự động lấy lại địa chỉ trở về CTC và lấy lại thanh ghi cờ.
RET(Return from Procedure to Calling Program): Trở về CTC từ ctc
Viết lệnh: RET hoặc RET n (n: nguyên, dương)
Lệnh RET được đặt tại cuối chương trình con để bộ vi xử lý biết tự động lấy lại địa chỉ trở về chương trình chính.
Nếu dùng lệnh RET n thì sau khi lấy lại địa chỉ trở về (chỉ có IP hoặc có cả IP và CS) thì SP <= SP+n (dùng để nhảy qua, không muốn lấy lại các thơng số khác của chương trình cịn lại trong stack).
Lệnh này không tác động đến các cờ.
WAIT (Wait for TEST or INTR signal): Chờ tín hiệu từ chân TEST hoặc chân INTR
Lệnh đưa bộ vi xử lý vào trạng thái nghỉ cho đến khi có tín hiệu mức thấp tác động vào chân TEST hoặc tín hiệu mức cao tác động vào chân INTR. Nếu có yêu cầu ngắt và yêu cầu ngắt này được chấp nhận khi 8088 đang ở trạng thái nghỉ thì sau khi thực hiện xong ISR tương ứng, 8088 lại trở lại trạng thái nghỉ.
NOP (No Operation): CPU khơng làm gì cả
Lệnh này khơng làm gì, nó chỉ tăng giá trị của thanh ghi IP và tiêu tốn 3 chu kỳ đồng hồ (xung clock).
Lệnh này không tác động đến các cờ
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 3.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ỏ. Ngồ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 nhưng ít ai có thể nhớ được các lệnh máy cho các phép tố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 cung cấp đúng địa chỉ bằng số, trong khi đó người lập trình bằng ngơn ngữ máy ln ln 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ó.