SlideShare ist ein Scribd-Unternehmen logo
1 von 68
Chương 4: Tập lệnh vi xử lý 8085A và
phương pháp lập trình bằng hợp ngữ.

  I
  3      Khung Chương trình Assembly

  II     Biên soạn và dịch chương trình Assembly

  I
  3II   Thực hiện cấu trúc điều khiển chương trình bằng
        assembly
Chương 4: Lập trình Assembly
  I
  3     Khung Chương trình Assembly

  II    Biên soạn và dịch chương trình Assembly

 I
 3II   Thực hiện cấu trúc điều khiển chương trình bằng
       assembly
I. Khung Chương trình Assembly
1. Bộ ký tự của Assembly
2. Từ khóa
3. Tên tự đặt
4. Cấu trúc một lệnh Assembly
5. Các dạng hằng dùng trong Assembly
6. Khai báo biến và hằng
7. Một số lệnh cơ bản
8. Các lệnh vào ra
I. Khung Chương trình Assembly

1. Bộ ký tự của Assembly
 Các chữ cái latin: 26 chữ hoa A-Z, 26 chữ
   thường a-z.
 Các chữ số thập phân: ‘0’ - ‘9’
 Các ký hiệu phép toán, các dấu chấm câu
   và các ký hiệu đặc biệt: + - * / @ ? $ , . : [ ]
   ( ) < > { } & % !  # v.v...
 Các ký tự ngăn cách: space và tab
I. Khung Chương trình Assembly

2. Từ khóa
 Tên các thanh ghi, tên lệnh dạng gợi nhớ của bộ
    vi xử lý, tên toán tử...
 Các từ khóa này đòi hỏi người lập trình phải
    dùng đúng như Assembly quy định.



       Mov đích, nguồn
       Push toán hạng
       pushf
I. Khung Chương trình Assembly
3. Tên tự đặt
 Tên là một dãy ký tự dùng để biểu thị tên
    hằng, tên biến, tên nhãn, tên chương trình
    con, tên đoạn nhớ...
 Quy tắc đặt tên:
     •   Tên chỉ gồm chữ cái,
     •                     ký tự đặc biệt như ? @ _ $
     •   Chữ đầu của tên bắt buộc phải là chữ cái.
     •   Trong tên không có dấu cách.
     •   Tên có thể dài từ 1 đến 35 ký tự.
4. Cấu trúc một lệnh assembly




Lệnh thật                           Lệnh giả

Được                                Không
                Dòng lệnh
dịch ra                             được dịch
mã máy                              ra mã
                                    máy


                                    I. Khung Chương trình Assembly
4. Cấu trúc một lệnh assembly


Tên Mã lệnh         Các toán hạng   Chú giải




• Tên nhãn, tên biến hoặc tên thủ
tục (chương trình con).
• Các tên và nhãn này sẽ được
trình biên dịch gán bằng các địa
chỉ cụ thể của ô nhớ.
• Một nhãn kết thúc bằng dấu hai
chấm (:).



                                     I. Khung Chương trình Assembly
4. Cấu trúc một lệnh assembly


Tên Mã lệnh          Các toán hạng     Chú giải


• Chứa các lệnh
thật hoặc lệnh giả


                        • Lệnh thật: chứa các toán hạng của
                        lệnh, có thể không có, có 1 hoặc 2 toán
                        hạng trong một lệnh.
                        • Lệnh giả: chứa các thông tin khác liên
                        quan đến lệnh giả.

                                         I. Khung Chương trình Assembly
4. Cấu trúc một lệnh assembly


Tên Mã lệnh      Các toán hạng     Chú giải



       • bắt đầu bằng dấu chấm phẩy.
       • ghi các lời giải thích cho các lệnh của chương
       • chương trình dịch không dịch từ sau dấu chấm
       phẩy đến hết dòng.




                                     I. Khung Chương trình Assembly
4. Cấu trúc một lệnh assembly

VD1:
LAP MOV       AH,[BX]     ; Copy nội dung của ô nhớ có địa
                          chỉ DS:BX vào AH


VD2:
       MAIN PROC
       và
       MAIN ENDP

• Hai dòng lệnh này là hai lệnh giả,
• Trường tên có tên thủ tục là MAIN,
• Trường mã lệnh có lệnh giả PROC và ENDP. Đây là hai lệnh
  giả để bắt đầu và kết thúc một thủ tục có tên là MAIN.
                                       I. Khung Chương trình Assembly
5.Các dạng hằng dùng trong assembly


 Hằng số nhị phân: gồm một dãy các chữ số 0 và 1, kết thúc bằng chữ
  B. Ví dụ: 10011101B
 Hằng số hex: 0 đến 9 và A đến F (a đến f), kết thúc bằng chữ H. Đối
  với các số bắt đầu bằng chữ thì phải thêm 0 đằng trước để báo cho
   chương trình dịch biết đó là số không phải là tên.
   Ví dụ: 7AC5H, 0ABH
 Hằng số thập phân: 0 đến 9, có hoặc không có chữ D theo sau.
  Ví dụ: 34 hoặc 34D.
 Hằng ký tự: là một ký tự bất kỳ đặt giữa hai dấu phẩy trên. Ví dụ: „A‟
 Hằng xâu ký tự: là một dãy ký tự bất kỳ đặt giữa hai dấu phẩy trên.
   Ví dụ: „Nhap‟

                                                   I. Khung Chương trình Assembly
6. Khai báo biến và hằng
a) Khai báo biến

     Khai báo biến kiểu byte

     Khai báo biến kiểu từ


     Khai báo biến kiểu từ kép


     Khai báo biến mảng


     Khai báo biến kiểu xâu ký tự
6. Khai báo biến và hằng
* Khai báo biến kiểu byte
 Tên biến DB Giá trị khởi đầu
 Tên biến DB ?

 Ví dụ 1: B1        DB      4
   • Biến kiểu byte có tên là B1
   • Máy tính dành 1 byte bộ nhớ cho nó và trong byte đó có
     chứa giá trị 4.
 Ví dụ 2: B2         DB ?
    Định nghĩa biến byte có tên là B2 và dành 1 byte bộ nhớ cho nó.




                                                  I. Khung Chương trình Assembly
6. Khai báo biến và hằng
* Khai báo biến kiểu từ word
 Tên biến DW Giá trị khởi đầu
 Tên biến DW ?

 Ví dụ 1: B1          DW 42H
   • Biến kiểu word có tên là B1
   • Máy tính dành 2 byte bộ nhớ cho nó và trong byte đó có
     chứa giá trị 42H.
 Ví dụ 2: B2          DW ?
    Định nghĩa biến byte có tên là B2 và dành 1 byte bộ nhớ cho nó.




                                                  I. Khung Chương trình Assembly
6. Khai báo biến và hằng
* Khai báo biến kiểu từ kép Double word
 Tên biến DD Giá trị khởi đầu
 Tên biến DD ?

 Ví dụ 1: B1         DD 1000H
   • Biến kiểu Double word có tên là B1
   • Máy tính dành 4 byte bộ nhớ cho nó và trong byte đó có
     chứa giá trị 1000H
 Ví dụ 2: B2         DD ?
    Định nghĩa biến byte có tên là B2 và dành 4 byte bộ nhớ cho nó.




                                                  I. Khung Chương trình Assembly
6. Khai báo biến và hằng
* Khai báo biến kiểu MẢNG
 Tên biến mảng          DB/DW/DD          Các giá trị khởi đầu
 Gồm một dãy các phần tử và ô nhớ kiểu byte/ ord/double word
Ví dụ: M1 DB            4,5,6,7,8,9
   • Biến mảng có tên là M1
   • Máy tính dành 6 byte liên tiếp cho nó để chứa các giá trị khởi đầu tương
     ứng là 4, 5 ,6 ,7 ,8 , 9.
   • Phần tử đầu của mảng là 4 và có địa chỉ trùng với địa chỉ của tên biến
     (M1), phần tử thứ hai là 5 và có địa chỉ là M1+1...
Ví dụ: M2          DB            20 DUP(0)
        M3          DB            20 DUP(?)
   • Biến mảng có tên là M2 gồm 20 byte để chứa 20 giá trị khởi đầu bằng 0
   • Biến mảng có tên là M3 gồm 20 byte nhưng không chứa giá trị khởi đầu.
                                                   I. Khung Chương trình Assembly
6. Khai báo biến và hằng
* Khai báo biến kiểu MẢNG (tiếp)
    Chú ý:
•    Toán tử DUP có thể dùng lồng nhau để định nghĩa 1 mảng
      Ví dụ:    M4 DB        4,3,2,2 DUP(1,2 DUP(5),6)
               M4    DB        4,3,2,1,5,5,6,1,5,5,6
•    Khi lưu trữ một từ trong bộ nhớ thì byte thấp của nó sẽ được để ở
     ô nhớ có địa chỉ thấp, byte cao để ở ô nhớ có địa chỉ cao.
    Ví dụ:     W1       DW        0FFACH
    => Byte thấp ACH sẽ được để tại địa chỉ W1, byte cao FFH sẽ
     được để tại địa chỉ tiếp theo W1+1.


                                               I. Khung Chương trình Assembly
6. Khai báo biến và hằng
* Khai báo biến kiểu xâu kí tự
   Là trường hợp đặc biệt của biến mảng kiểu byte, trong đó 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 của các ký tự đó.
   Ví dụ:
      • Xaukt       DB      „ABCDE‟

       •   Xaukt     DB     41h,42h,43h,44h,45h

       •   Xaukt     DB     41h,42h,‟C‟,‟D‟,45h


                                            I. Khung Chương trình Assembly
6. Khai báo biến và hằng
b) Khai báo biến hằng
 • Hằng có thể là kiểu số hoặc kiểu ký tự.
 • Tên hằng EQU Giá trị của hằng
 • Ví dụ:
           CR          EQU 0Dh
           LF          EQU 0Ah
           CHAO                 EQU „Hello‟

• Vì lệnh giả EQU không dành chỗ của bộ nhớ cho tên hằng
  nên ta có thể khai báo hằng ở bất kỳ đâu trong chương trình.
  Tuy nhiên người ta thường đặt các khai báo hằng trong đoạn
  dữ liệu.
7. Một số lệnh cơ bản
•    MOV Đích, Nguồn
Ví dụ: Mov AH,10D ;Chuyển giá trị 10 vào AH
   Mov AX,BX ; Chuyển giá trị thanh ghi BX vào thanh ghi AX
   Mov [DI],CX ; Chuyển giá trị thanh ghi CX vào ô nhớ DS:DI
•    XCHG Đích, Nguồn: Hoán đổi nội dung của 2 toán hạng đích
    và nguồn
Ví dụ: XCHG AH,BL ; Hoán đổi nội dung của hai thanh ghi AH và B
• Lệnh cộng không nhớ: ADD Đích, Nguồn
  Áp dụng cho= số nhị phân, gần như phép toán xor
  Đích = Đích + Nguồn
• Lệnh cộng có nhớ: ADC Đích, Nguồn (Add With Carry)
  Đích Đích + Nguồn + CF
7. Một số lệnh cơ bản
- Lệnh tăng: INC Đích         Đích Đích + 1
- Lệnh giảm: DEC Đích         Đích Đích - 1
- Lệnh trừ không mượn: SUB Đích, Nguồn          Đích Đích - Nguồn
- Lệnh trừ có mượn: SBB Đích, Nguồn
    Đích Đích - Nguồn - CF
- NEG Đích                                      Đích -Đích
- LEA Đích, Nguồn (Load Effective Address): Nạp địa chỉ thực
  + Đích thường là một trong các thanh ghi: BX, CX, DX, BP, SI, DI
  + Nguồn là tên biến trong đoạn DS được chỉ rõ trong lệnh hoặc ô nhớ
   cụ thể
 => Chuyển địa chỉ lệch của ô nhớ Nguồn vào thanh ghi Đích 16 bit
   VD: Tb1 db “Nhap so can kiem tra: $”
   LEA DX, Tb1
8. Các lệnh vào ra
• Lệnh INT: Gọi các chương trình ngắt của DOS và BIOS.
• Dạng lệnh: INT số_hiệu_ngắt
• Ngắt INT 21h
=> Ngắt int 21h dùng để gọi rất nhiều hàm của DOS. Mỗi hàm
  được gọi bằng cách đặt số hàm vào trong thanh ghi AH và gọi
  ngắt INT 21h
8. Các lệnh vào ra
 Hàm 1: Vào một kí tự
    Input AH=1
    Ra AL = Lưu mã ASCII của kí tự nhập vào
           = 0 Nếu 1 phím điều khiển hay chức năng
 được ấn
 => Để gọi phục vụ này ta thực hiện lệnh:

 MOV AH,1
 INT 21h
8. Các lệnh vào ra
Vd: Nhập vào 2 số: Al, BL sau đó đảo giá trị cho nhau

  MOV AH,1
  INT 21H                        Nhập x
  MOV BL,AL

  MOV AH,1
                               Nhập y
  INT 21H


  XCHG AL,BL                  Đảo giá trị
8. Các lệnh vào ra
 Hàm 2: Hiển thị một kí tự hay thi hành một chức năng điều
 khiển
  Input: AH=2
         DL=Mã ASCII của kí tự hiển thị hay kí tự điều khiển
  Output: Giá trị của DL

   Ví dụ: sau sẽ hiển thị dấu “?” lên màn hình
       MOV AH,2
       MOV DL,”?”
       INT 21h
8. Các lệnh vào ra
 Hàm 9: Hiển thị một chuỗi kí tự
     Input: AH=9
            DX=Địa chỉ tương đỗi của chuỗi
     Output: Hiễn thị một chuỗi ra màn hình

 Kí tự “$” đánh dấu kết thúc chuỗi và không được hiển thị. Nếu
chuỗi chứa mã ASCII của kí tự điều khiển thì các chức năng điều
khiển sẽ được thi hành
   VD: msg           DB            “Xin chao $”

 Để sao chép địa chỉ tương đối từ nguồn sang đích
   LEA đích, nguồn

    VD: Lea DX, msg
8. Các lệnh vào ra
Chu trình hiển thị chuỗi kí tự
 B1: Khởi tạo đoạn dữ liệu chứa trong thanh ghi DS
          MOV AX,@DATA
          MOV         DS,AX
          @ DATA : Tên đoạn dữ liệu được định nghĩa bởi .Data
                     Địa chỉ dữ liệu không chuyển trực tiếp.
 B2: đưa địa chỉ vào thanh ghi DX
          LEA DX,MSG
          MOV AH,9
          INT      21H
Vd: Viết chương trình hiển thị một chuỗi kí tự bất kì
9.Khung chương trình assembly

       1         Khai báo quy mô sử dụng bộ nhớ

2            Khai báo đoạn ngăn xếp

             Khai báo đoạn dữ liệu

3                         Khai báo đoạn mã

            4
a. Khai báo quy mô sử dụng bộ nhớ

.MODEL Kiểu_kích_thước_bộ_nhớ
b. Khai báo đoạn ngăn xếp .

• Máy tính dành ra một vùng nhớ đủ lớn dùng làm ngăn xếp phục
  vụ cho hoạt động của chương trình.
• Cú pháp:
        .STACK Kích_thước
• Kích_thước quyết định số byte dành cho ngăn xếp. Thông
  thường với 100 - 256 byte là đủ để làm ngăn xếp và ta có thể
  khai báo kích thước cho ngăn xếp như sau:

      .STACK 100
       hoặc
      .STACK 100H
c. Khai báo đoạn dữ liệu .

•Bao gồm toàn bộ các khai báo biến và hằng của chương trình.
 Các khai báo trong đoạn dữ liệu đặt sau lệnh giả .DATA

Ví dụ:
.DATA
MSG        DB     „Hello!$‟
B1         DB     100
CR         EQU    0DH ; Quay về đầu dòng
LF         EQU    0AH ; Xuống dòng
d. Khung chương trình Assembly để dịch ra chương
                                       trình .EXE
• Đoạn mã chứa mã lệnh của chương trình
• Để bắt đầu đoạn mã ta dùng lệnh giả .CODE
• Chương trình chính và chương trình con.
      .CODE
      Tên_CTChính PROC
               ;Các lệnh của chương trình chính
               …       .
      CALL Tên_CTCon           ;Gọi chương trình con
               …
      Tên_CTChính ENDP
                                                       VD
      ;Khai báo các chương trình con ở đây
      Tên_CTCon       PROC
              ;Các lệnh của chương trình con
              RET     ;Trở về
      Tên_CTCon       ENDP
e. Khung chương trình Assembly để dịch ra chương
                                            trình .com
                                                       .
. Đoạn mã, đoạn dữ liệu và đoạn ngăn xếp được gộp lại trong một
  đoạn duy nhất là đoạn mã
 .MODEL TINY
 .CODE
       ORG 100H ; để gán địa chỉ bắt đầu của chương trình tại 100h
       ; để nhảy qua toàn bộ phần bộ nhớ dành cho việc khai báo dữ liệu
 START: JMP CONTINUE.
       ;Các khai báo biến và hằng để tại đây
 CONTINUE:
 MAIN PROC
                                                                     VD
       ;Các lệnh của chương trình chính để tại đây
       ;Trở về DOS
       INT 20H
 MAIN ENDP
       ;Các chương trình con (nếu có) khai báo ở đây
       END START
Chương 4: Lập trình Assembly
  I
  3     Khung Chương trình Assembly

  II    Biên soạn và dịch chương trình Assembly

 I
 3II   Thực hiện cấu trúc điều khiển chương trình bằng assembly
II. Biên soạn và dịch chương trình Assembly
                                          .
II. Biên soạn và dịch chương trình Assembly
                                          .




        Trở về thư mục gôc C:
II. Biên soạn và dịch chương trình Assembly
                                          .




                 Truy nhập vào thư mục MASM
II. Biên soạn và dịch chương trình Assembly
                                             .




                    Dịch chương trình sang mã máy
II. Biên soạn và dịch chương trình Assembly
                                          .




                                      c đuôi .EXE
II. Biên soạn và dịch chương trình Assembly
                                          .




               Chạy chương trình
Chương 4: Lập trình Assembly
  I
  3     Khung Chương trình Assembly

  II    Biên soạn và dịch chương trình Assembly

 I
 3II   Thực hiện cấu trúc điều khiển chương trình bằng assembly
III. Thực hiện các cấu trúc điều khiển chương trình
                                      bằng assembly
   A. Lệnh JMP: Lệnh nhảy không điều kiện.
    Cú pháp JMP Nhãn
   => Chuyển CS:IP tới vị trí được xác định bởi Nhãn


   B. Các lệnh nhảy có điều kiện
    Có ba loại nhảy có điều kiện:
       <1> Các lệnh nhảy không dấu dùng với các số không
       dấu
      <2> Các lệnh nhảy có dấu được dùng khi kết quả trả về
       là các số có dấu
      <3> Các lệnh nhảy điều kiện đơn: điều kiện phụ thuộc
       vào một cờ riêng biệt.
III. Thực hiện các cấu trúc điều khiển chương trình
                                      bằng assembly
   1.Các lệnh nhảy không dấu
   JA/ JNBE
        Jump if Above: Nhảy nếu lớn hơn
        Jump if Not Below or Equal: Nhảy nếu không thấp hơn
   hoặc bằng).
               vd: JA NHAN        / JNBE NHAN
    JAE/JNB/JNC
               Jump if Above or Equal: Nhảy nếu cao hơn hoặc
   bằng
        Jump if Not Below: Nhảy nếu không thấp hơn
        vd: JAE NHAN
             JNB NHAN
             JNC NHAN
III. Thực hiện các cấu trúc điều khiển chương trình
                                      bằng assembly

   1.Các lệnh nhảy không dấu
   JB/JC/JNAE
    Jump if Below: Nhảy nếu thấp hơn
    Jump if Carry: Nhảy nếu có nhớ
    Jump if Not Above or Equal:Nhảy nếu không cao hơn hoặc
      bằng)
        VD: JB NHAN / JC NHAN              / JNAE
   NHAN

   JBE/JNA
    Jump if Below or Equal: Nhảy nếu thấp hơn hoặc bằng
    Jump if Not Above: Nhảy nếu không cao hơn
          JBE NHAN
          JNA NHAN
III. Thực hiện các cấu trúc điều khiển chương trình
                                        bằng assembly
2. Các lệnh nhảy có dấu

• JG/JNLE : Jump if Greater than/ Jump if Not Less than or
Equal (Nhảy nếu lớn hơn/ Nhảy nếu không bé hơn hoặc bằng)
              JG     NHAN
              JNLE NHAN
      •    JGE/JNL: Jump if Greater than or Equal/ Jump if Not
          Less than (Nhảy nếu lớn hơn hoặc bằng/ Nhảy nếu
          không nhỏ hơn)
        JGE     NHAN
        JNL NHAN
III. Thực hiện các cấu trúc điều khiển chương
                          trình bằng assembly
   2. Các lệnh nhảy có dấu
   JL/ JNGE: Jump if Less than/ Jump if Not
     Greater than or Equal (Nhảy nếu nhỏ hơn/ Nhảy
     nếu không lớn hơn hoặc bằng)
            JL  NHAN
            JNGE NHAN
    JLE/JNG: Jump if Less than or Equal/ Jump if
     Not Greater than (Nhảy nếu nhỏ hơn hoặc bằng/
     Nhảy nếu không lớn hơn)
            JLE  NHAN
            JNG NHAN
III. Thực hiện các cấu trúc điều khiển chương trình
                                      bằng assembly
   3. Các lệnh nhảy điều kiện đơn
    JCXZ : Jump if CX Register if Zero (Nhảy nếu
   nội dung thanh đếm rỗng)
          JCXZ NHAN
    JE/JZ: Jump if Equal/ Jump if Zero (Nhảy nếu
   bằng nhau/ Nhảy nếu kết quả bằng không)
          JE NHAN
          JZ NHAN
    JC: Jump if Carry ( Nhảy nếu có nhớ)
III. Thực hiện các cấu trúc điều khiển chương trình
                                      bằng assembly
    3. Các lệnh nhảy điều kiện đơn
   JNC : Jump if Not Carry (Nhảy nếu không nhớ)
    JO: Jump if Overflow (Nhảy nếu tràn)
    JNO: Jump if Not Overflow (Nhảy nếu không
   tràn)
    JS:      Jump if Sign (Nhảy nếu dấu âm)
    JNS: Jump if Not Sign (Nhảy nếu dấu dương)
    Tất cả các lệnh nhảy hoặc nhảy có điều kiện đều
   không tác động đến cờ
VD: so sánh lệnh nhảy có dấu và không dấu

 Mỗi lệnh nhảy có dấu đều tương ứng với một
 lệnh nhảy không dấu:
VD: JG (có dấu),JA(không dấu)
 Ví dụ: AX chứa 7FFFh, BX chứa 8000h
  Cmp    AX,BX
  Ja     TEST  ; Không nhảy đến nhãn TEST
Nếu coi AX, BX là các số có dấu thì AX>BX nhưng
 sử dụng
  Cmp AX,BX
  Ja     TEST     ; Không nhảy đến nhãn TEST vì Ja là lệnh
     nhảy không dấu
III. Thực hiện các cấu trúc điều khiển chương trình
                                       bằng assembly
C: CMP Left, Right
 Left: có thể là thanh ghi hoặc ô nhớ (Không được phép là
   hằng số)
 Right: có thể là thanh ghi hoặc ô nhớ hoặc hằng số.
 Các toán hạng của lệnh Cmp không thể cùng là các ô nhớ.
=> Lệnh này so sánh Left và Right bằng cách lấy toán tử Left trừ
   đi toán tử Right, kết quả không được lưu lại nhưng các cờ bị
   ảnh hưởng. Các toán hạng của lệnh Cmp không thể cùng là các
   ô nhớ.
III. Thực hiện các cấu trúc điều khiển chương trình
                                      bằng assembly

D: Các cấu trúc ngôn ngữ bậc cao
 Cấu trúc rẽ nhánh IF-THEN
 Cấu trúc lựa chọn CASE
 Cấu trúc lặp với số lần xác định FOR-DO
 Cấu trúc lặp với số lần không xác định
 REPEAT-UNTIL và WHILE-DO
        ng các lệnh nhảy và lệnh lặp của bộ vi
 xử lý. Cụ thể như sau:
Cấu trúc rẽ nhánh IF-THEN
 Cấu trúc rẽ nhánh IF-THEN
(1) IF <Điều kiện> THEN <Công việc>
(2) IF <Điều kiện> THEN <Công việc 1> ELSE <Công việc 2>
Cấu trúc rẽ nhánh IF-THEN

VD: Viết   đoạn chương trình gán BX   |AX|
   IF_:
      CMP AX,0
      JAE ENDIF_
      NEG AX
   ENDIF_:
      MOV BX,AX
Cấu trúc lựa chon CASE

 Cấu trúc lựa chon CASE
     CASE <Biểu thức> OF
       Giá_trị_1: Công_việc_1
       Giá_trị_2: Công_việc_2
       Giá_trị_N: Công_việc_N
     END_CASE
III. Thực hiện các cấu trúc điều khiển chương trình
                                       bằng assembly
 B1: Nếu AX chứa số âm thì đưa -1 vào BX, nếu AX chứa 0 thì
  đưa 0 vào BX, nếu AX chứa số dương thì đưa 1 vào BX.
Cấu trúc lặp với số lần xác định FOR-DO

FOR <Số lần lặp> DO
                              Đưa số lần lặp
  <Công việc>                  vào bộ đếm
ENDFOR
                                Công việc


                              Giảm bộ đếm đi
                                    1

                                               Sai
                               Bộ đếm = 0?
                                       Đúng
Cấu trúc lặp với số lần xác định FOR-DO

 VD: Hiện thị một dòng 80 ký tự „$‟
                                        Cx=80
FOR_:
   MOV CX,80
   MOV AH,2                            Công việc
   MOV DL,‟$‟
   INT 21H
                                        Cx=cx-1
   LOOP FOR_
ENDFOR_:
                                                     Sai
                                        cx = 0?
                                              Đúng
Cấu trúc lặp với số lần xác định FOR-DO

 Chú ý: Sử dụng lệnh nhảy JCXZ để tránh vòng lặp không kết
  thúc được
   MOV CX,80
   MOV AH,2
   JCNZ ENDFOR_
FOR_:
    MOV DL,‟$‟
    INT 21H
  LOOP FOR_
ENDFOR_:
Cấu trúc lặp với số lần không xác định
   Kiểm tra điều kiện trước

Pascal              Assembly

WHILE <Điều kiện>   WHILE <Điều kiện>
  DO                  <Công việc>
<Công việc>         ENDWHILE



BT: Đếm số kí tự được đọc vào từ bàn
phím khi nào gặp CR thì thôi
Cấu trúc lặp với số lần không xác định
 Kiểm tra điều kiện sau


REPEAT <Công việc>
UNTIL <Điều kiện>

BT: Đếm số kí tự được đọc vào từ
bàn phím khi nào gặp CR thì thôi
Nội dung tóm lược



           Cấu trúc một lệnh




                        Các toán
Tên      Mã lệnh                   Chú giải
                         hạng
Nội dung tóm lược
 Khung chương trình
                        Bắt đầu

              Khai báo chương trình chính

              Các lệnh chương trình chính

              Kết thúc chương trình chính

               Khai báo chương trình con

               Các lệnh chương trình con

               Kết thúc chương trình con

                        Kết thúc
Cách tạo và chạy một chương trình hợp ngữ dạng EXE

                     Bắt đầu

                 Trình soạn thảo

                   File . ASM

                 Trình biên dịch

                    File .OBJ

                  Trình liên kết

                    File .EXE

                     Kết thúc
Các cấu trúc lập trình của hợp ngữ
Các cấu trúc lập trình của hợp ngữ
Các cấu trúc lập trình của hợp ngữ
Câu hỏi ôn tập chương 4


Câu 1: Trình bày cú pháp của chương trình hợp ngữ?
Câu 2: Trình bày Khung của chương trình hợp ngữ để
      dịch ra chương trình .EXE?
Câu 3: Trình bày Khung của chương trình hợp ngữ để
      dịch ra chương trình .COM?
Câu 4: Cách tạo và cho chạy một chương trình hợp
      ngữ IPM PC?

Weitere ähnliche Inhalte

Was ist angesagt?

Bài giảng kiến trúc máy tính
Bài giảng kiến trúc máy tínhBài giảng kiến trúc máy tính
Bài giảng kiến trúc máy tính
Cao Toa
 
Bài Tập Xử Lí Tín Hiệu Số
Bài Tập Xử Lí Tín Hiệu SốBài Tập Xử Lí Tín Hiệu Số
Bài Tập Xử Lí Tín Hiệu Số
viethung094
 
Giáo trình xử lý ảnh
Giáo trình xử lý ảnhGiáo trình xử lý ảnh
Giáo trình xử lý ảnh
Tùng Trần
 
Kiến trúc máy tính và hợp ngữ bài 04
Kiến trúc máy tính và hợp ngữ bài 04Kiến trúc máy tính và hợp ngữ bài 04
Kiến trúc máy tính và hợp ngữ bài 04
Nhóc Nhóc
 
thuc hanh xu ly tin hieu so
thuc hanh xu ly tin hieu sothuc hanh xu ly tin hieu so
thuc hanh xu ly tin hieu so
Kimkaty Hoang
 
Báo cáo kĩ thuật phần mềm và ứng dụng
Báo cáo kĩ thuật phần mềm và ứng dụngBáo cáo kĩ thuật phần mềm và ứng dụng
Báo cáo kĩ thuật phần mềm và ứng dụng
Vượng Đặng
 
Bai tap va loi giai sql
Bai tap va loi giai sqlBai tap va loi giai sql
Bai tap va loi giai sql
. .
 
Các loại mã đường truyền và ứng dụng neptune
Các loại mã đường truyền và ứng dụng neptuneCác loại mã đường truyền và ứng dụng neptune
Các loại mã đường truyền và ứng dụng neptune
給与 クレジット
 

Was ist angesagt? (20)

Xử lý tín hiệu số
Xử lý tín hiệu sốXử lý tín hiệu số
Xử lý tín hiệu số
 
Bài giảng kiến trúc máy tính
Bài giảng kiến trúc máy tínhBài giảng kiến trúc máy tính
Bài giảng kiến trúc máy tính
 
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thôngBáo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
 
Chuong 04 mach logic
Chuong 04 mach logicChuong 04 mach logic
Chuong 04 mach logic
 
Đại số boolean và mạch logic
Đại số boolean và mạch logicĐại số boolean và mạch logic
Đại số boolean và mạch logic
 
Bài Tập Xử Lí Tín Hiệu Số
Bài Tập Xử Lí Tín Hiệu SốBài Tập Xử Lí Tín Hiệu Số
Bài Tập Xử Lí Tín Hiệu Số
 
Tichchap
TichchapTichchap
Tichchap
 
Họ vi xử lí 8086 intel
Họ vi xử lí 8086 intelHọ vi xử lí 8086 intel
Họ vi xử lí 8086 intel
 
Chuong 05 transistor bjt
Chuong 05 transistor bjtChuong 05 transistor bjt
Chuong 05 transistor bjt
 
mạch tổ hợp và mạch trình tự - Điện tử Đo lường
mạch tổ hợp và mạch trình tự - Điện tử Đo lườngmạch tổ hợp và mạch trình tự - Điện tử Đo lường
mạch tổ hợp và mạch trình tự - Điện tử Đo lường
 
Giáo trình xử lý ảnh
Giáo trình xử lý ảnhGiáo trình xử lý ảnh
Giáo trình xử lý ảnh
 
Bài Giảng Vi Xử Lý PIT
Bài Giảng Vi Xử Lý PITBài Giảng Vi Xử Lý PIT
Bài Giảng Vi Xử Lý PIT
 
Kiến trúc máy tính và hợp ngữ bài 04
Kiến trúc máy tính và hợp ngữ bài 04Kiến trúc máy tính và hợp ngữ bài 04
Kiến trúc máy tính và hợp ngữ bài 04
 
[Báo cáo] Bài tập lớn Xử lý tín hiệu số: Thiết kế bộ lọc FIR
[Báo cáo] Bài tập lớn Xử lý tín hiệu số: Thiết kế bộ lọc FIR[Báo cáo] Bài tập lớn Xử lý tín hiệu số: Thiết kế bộ lọc FIR
[Báo cáo] Bài tập lớn Xử lý tín hiệu số: Thiết kế bộ lọc FIR
 
thuc hanh xu ly tin hieu so
thuc hanh xu ly tin hieu sothuc hanh xu ly tin hieu so
thuc hanh xu ly tin hieu so
 
Chuong3 lập trình hợp ngữ
Chuong3 lập trình hợp ngữChuong3 lập trình hợp ngữ
Chuong3 lập trình hợp ngữ
 
Báo cáo kĩ thuật phần mềm và ứng dụng
Báo cáo kĩ thuật phần mềm và ứng dụngBáo cáo kĩ thuật phần mềm và ứng dụng
Báo cáo kĩ thuật phần mềm và ứng dụng
 
chuong 4. dai so boole
chuong 4.  dai so boolechuong 4.  dai so boole
chuong 4. dai so boole
 
Bai tap va loi giai sql
Bai tap va loi giai sqlBai tap va loi giai sql
Bai tap va loi giai sql
 
Các loại mã đường truyền và ứng dụng neptune
Các loại mã đường truyền và ứng dụng neptuneCác loại mã đường truyền và ứng dụng neptune
Các loại mã đường truyền và ứng dụng neptune
 

Andere mochten auch

Andere mochten auch (20)

03 lap trinh hop ngu voi 8086
03 lap trinh hop ngu voi 808603 lap trinh hop ngu voi 8086
03 lap trinh hop ngu voi 8086
 
On tap ctmt 8086
On tap ctmt 8086On tap ctmt 8086
On tap ctmt 8086
 
Assembly
AssemblyAssembly
Assembly
 
Bài giảng Mạng máy tính
Bài giảng Mạng máy tínhBài giảng Mạng máy tính
Bài giảng Mạng máy tính
 
Ch assembly
Ch assemblyCh assembly
Ch assembly
 
Bai tap mon_lap_trinh_hop_ngu
Bai tap mon_lap_trinh_hop_nguBai tap mon_lap_trinh_hop_ngu
Bai tap mon_lap_trinh_hop_ngu
 
Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05
 
Kiến trúc máy tính
Kiến trúc máy tínhKiến trúc máy tính
Kiến trúc máy tính
 
Microprocessor final ver1_part2
Microprocessor final ver1_part2Microprocessor final ver1_part2
Microprocessor final ver1_part2
 
Mạng máy tính
Mạng máy tínhMạng máy tính
Mạng máy tính
 
đề Cương ôn tập
đề Cương ôn tậpđề Cương ôn tập
đề Cương ôn tập
 
Bai giang-ktvxl-2012
Bai giang-ktvxl-2012Bai giang-ktvxl-2012
Bai giang-ktvxl-2012
 
Nguyen van chinh tran duc thang vy duc loi
Nguyen van chinh tran duc thang vy duc loiNguyen van chinh tran duc thang vy duc loi
Nguyen van chinh tran duc thang vy duc loi
 
Chuong4
Chuong4Chuong4
Chuong4
 
Vixuly1
Vixuly1Vixuly1
Vixuly1
 
Optimalizace sortimentu
Optimalizace sortimentuOptimalizace sortimentu
Optimalizace sortimentu
 
Link asm in another language
Link asm in another languageLink asm in another language
Link asm in another language
 
Ky.thuat.vi.xu.ly uds
Ky.thuat.vi.xu.ly udsKy.thuat.vi.xu.ly uds
Ky.thuat.vi.xu.ly uds
 
Giao trinh mang_may_tinh
Giao trinh mang_may_tinhGiao trinh mang_may_tinh
Giao trinh mang_may_tinh
 
Ktmt c61 hop ngu assembly
Ktmt c61 hop ngu assemblyKtmt c61 hop ngu assembly
Ktmt c61 hop ngu assembly
 

Ähnlich wie Chuong 4. lap trinh hop ngu

LP_TRINH_HP_NG_MIPS_Mc_dich.pdf
LP_TRINH_HP_NG_MIPS_Mc_dich.pdfLP_TRINH_HP_NG_MIPS_Mc_dich.pdf
LP_TRINH_HP_NG_MIPS_Mc_dich.pdf
Chuong
 
Hướng dẫn lập_trình_avr
Hướng dẫn lập_trình_avrHướng dẫn lập_trình_avr
Hướng dẫn lập_trình_avr
Duy Tân
 
C cho 8051
C cho 8051C cho 8051
C cho 8051
Nhan Bui
 
Chuanmanguon 151124092923-lva1-app6892
Chuanmanguon 151124092923-lva1-app6892Chuanmanguon 151124092923-lva1-app6892
Chuanmanguon 151124092923-lva1-app6892
HaiNguyen870
 
Nmlt c02 gioi_thieunnltc_in
Nmlt c02 gioi_thieunnltc_inNmlt c02 gioi_thieunnltc_in
Nmlt c02 gioi_thieunnltc_in
Huy Nguyễn
 
Chuong10
Chuong10Chuong10
Chuong10
na
 
06 tong quan ve ngon ngu c
06 tong quan ve ngon ngu c06 tong quan ve ngon ngu c
06 tong quan ve ngon ngu c
Trí Nguyễn
 
Tai lieu lap trinh c cho 8051
Tai lieu lap trinh c cho 8051Tai lieu lap trinh c cho 8051
Tai lieu lap trinh c cho 8051
viet Nguyen
 
Tai lieu lap trinh c cho 8051
Tai lieu lap trinh c cho 8051Tai lieu lap trinh c cho 8051
Tai lieu lap trinh c cho 8051
engineertrongbk
 

Ähnlich wie Chuong 4. lap trinh hop ngu (20)

Lập trình C cho VĐK 8051
Lập trình C cho VĐK 8051Lập trình C cho VĐK 8051
Lập trình C cho VĐK 8051
 
LP_TRINH_HP_NG_MIPS_Mc_dich.pdf
LP_TRINH_HP_NG_MIPS_Mc_dich.pdfLP_TRINH_HP_NG_MIPS_Mc_dich.pdf
LP_TRINH_HP_NG_MIPS_Mc_dich.pdf
 
Hop ngu mips
Hop ngu mipsHop ngu mips
Hop ngu mips
 
Nmlt c02 gioi_thieunnltc
Nmlt c02 gioi_thieunnltcNmlt c02 gioi_thieunnltc
Nmlt c02 gioi_thieunnltc
 
1 -nhapmon
1  -nhapmon1  -nhapmon
1 -nhapmon
 
Lap trinh assembler
Lap trinh assemblerLap trinh assembler
Lap trinh assembler
 
Kiến thức cơ bản về lập trình hợp ngữ Assembly
Kiến thức cơ bản về lập trình hợp ngữ AssemblyKiến thức cơ bản về lập trình hợp ngữ Assembly
Kiến thức cơ bản về lập trình hợp ngữ Assembly
 
Hướng dẫn lập_trình_avr
Hướng dẫn lập_trình_avrHướng dẫn lập_trình_avr
Hướng dẫn lập_trình_avr
 
C cho 8051
C cho 8051C cho 8051
C cho 8051
 
Chuong 3
Chuong 3Chuong 3
Chuong 3
 
Bai02 java introduction
Bai02 java introductionBai02 java introduction
Bai02 java introduction
 
Chuanmanguon 151124092923-lva1-app6892
Chuanmanguon 151124092923-lva1-app6892Chuanmanguon 151124092923-lva1-app6892
Chuanmanguon 151124092923-lva1-app6892
 
Coding Standard (Chuẩn Mã Nguồn)
Coding Standard (Chuẩn Mã Nguồn)Coding Standard (Chuẩn Mã Nguồn)
Coding Standard (Chuẩn Mã Nguồn)
 
Nmlt c02 gioi_thieunnltc_in
Nmlt c02 gioi_thieunnltc_inNmlt c02 gioi_thieunnltc_in
Nmlt c02 gioi_thieunnltc_in
 
Chuong10
Chuong10Chuong10
Chuong10
 
Tai lieu huong_dan_ve_lap_trinh_php_7512
Tai lieu huong_dan_ve_lap_trinh_php_7512Tai lieu huong_dan_ve_lap_trinh_php_7512
Tai lieu huong_dan_ve_lap_trinh_php_7512
 
Giao an trinh_pascal_bai_tap_co_dap_an_huong_dan
Giao an trinh_pascal_bai_tap_co_dap_an_huong_danGiao an trinh_pascal_bai_tap_co_dap_an_huong_dan
Giao an trinh_pascal_bai_tap_co_dap_an_huong_dan
 
06 tong quan ve ngon ngu c
06 tong quan ve ngon ngu c06 tong quan ve ngon ngu c
06 tong quan ve ngon ngu c
 
Tai lieu lap trinh c cho 8051
Tai lieu lap trinh c cho 8051Tai lieu lap trinh c cho 8051
Tai lieu lap trinh c cho 8051
 
Tai lieu lap trinh c cho 8051
Tai lieu lap trinh c cho 8051Tai lieu lap trinh c cho 8051
Tai lieu lap trinh c cho 8051
 

Chuong 4. lap trinh hop ngu

  • 1. Chương 4: Tập lệnh vi xử lý 8085A và phương pháp lập trình bằng hợp ngữ. I 3 Khung Chương trình Assembly II Biên soạn và dịch chương trình Assembly I 3II Thực hiện cấu trúc điều khiển chương trình bằng assembly
  • 2. Chương 4: Lập trình Assembly I 3 Khung Chương trình Assembly II Biên soạn và dịch chương trình Assembly I 3II Thực hiện cấu trúc điều khiển chương trình bằng assembly
  • 3. I. Khung Chương trình Assembly 1. Bộ ký tự của Assembly 2. Từ khóa 3. Tên tự đặt 4. Cấu trúc một lệnh Assembly 5. Các dạng hằng dùng trong Assembly 6. Khai báo biến và hằng 7. Một số lệnh cơ bản 8. Các lệnh vào ra
  • 4. I. Khung Chương trình Assembly 1. Bộ ký tự của Assembly  Các chữ cái latin: 26 chữ hoa A-Z, 26 chữ thường a-z.  Các chữ số thập phân: ‘0’ - ‘9’  Các ký hiệu phép toán, các dấu chấm câu và các ký hiệu đặc biệt: + - * / @ ? $ , . : [ ] ( ) < > { } & % ! # v.v...  Các ký tự ngăn cách: space và tab
  • 5. I. Khung Chương trình Assembly 2. Từ khóa  Tên các thanh ghi, tên lệnh dạng gợi nhớ của bộ vi xử lý, tên toán tử...  Các từ khóa này đòi hỏi người lập trình phải dùng đúng như Assembly quy định. Mov đích, nguồn Push toán hạng pushf
  • 6. I. Khung Chương trình Assembly 3. Tên tự đặt  Tên là một dãy ký tự dùng để biểu thị tên hằng, tên biến, tên nhãn, tên chương trình con, tên đoạn nhớ...  Quy tắc đặt tên: • Tên chỉ gồm chữ cái, • ký tự đặc biệt như ? @ _ $ • Chữ đầu của tên bắt buộc phải là chữ cái. • Trong tên không có dấu cách. • Tên có thể dài từ 1 đến 35 ký tự.
  • 7. 4. Cấu trúc một lệnh assembly Lệnh thật Lệnh giả Được Không Dòng lệnh dịch ra được dịch mã máy ra mã máy I. Khung Chương trình Assembly
  • 8. 4. Cấu trúc một lệnh assembly Tên Mã lệnh Các toán hạng Chú giải • Tên nhãn, tên biến hoặc tên thủ tục (chương trình con). • Các tên và nhãn này sẽ được trình biên dịch gán bằng các địa chỉ cụ thể của ô nhớ. • Một nhãn kết thúc bằng dấu hai chấm (:). I. Khung Chương trình Assembly
  • 9. 4. Cấu trúc một lệnh assembly Tên Mã lệnh Các toán hạng Chú giải • Chứa các lệnh thật hoặc lệnh giả • Lệnh thật: chứa các toán hạng của lệnh, có thể không có, có 1 hoặc 2 toán hạng trong một lệnh. • Lệnh giả: chứa các thông tin khác liên quan đến lệnh giả. I. Khung Chương trình Assembly
  • 10. 4. Cấu trúc một lệnh assembly Tên Mã lệnh Các toán hạng Chú giải • bắt đầu bằng dấu chấm phẩy. • ghi các lời giải thích cho các lệnh của chương • chương trình dịch không dịch từ sau dấu chấm phẩy đến hết dòng. I. Khung Chương trình Assembly
  • 11. 4. Cấu trúc một lệnh assembly VD1: LAP MOV AH,[BX] ; Copy nội dung của ô nhớ có địa chỉ DS:BX vào AH VD2: MAIN PROC và MAIN ENDP • Hai dòng lệnh này là hai lệnh giả, • Trường tên có tên thủ tục là MAIN, • Trường mã lệnh có lệnh giả PROC và ENDP. Đây là hai lệnh giả để bắt đầu và kết thúc một thủ tục có tên là MAIN. I. Khung Chương trình Assembly
  • 12. 5.Các dạng hằng dùng trong assembly  Hằng số nhị phân: gồm một dãy các chữ số 0 và 1, kết thúc bằng chữ B. Ví dụ: 10011101B  Hằng số hex: 0 đến 9 và A đến F (a đến f), kết thúc bằng chữ H. Đối với các số bắt đầu bằng chữ thì phải thêm 0 đằng trước để báo cho chương trình dịch biết đó là số không phải là tên. Ví dụ: 7AC5H, 0ABH  Hằng số thập phân: 0 đến 9, có hoặc không có chữ D theo sau. Ví dụ: 34 hoặc 34D.  Hằng ký tự: là một ký tự bất kỳ đặt giữa hai dấu phẩy trên. Ví dụ: „A‟  Hằng xâu ký tự: là một dãy ký tự bất kỳ đặt giữa hai dấu phẩy trên. Ví dụ: „Nhap‟ I. Khung Chương trình Assembly
  • 13. 6. Khai báo biến và hằng a) Khai báo biến Khai báo biến kiểu byte Khai báo biến kiểu từ Khai báo biến kiểu từ kép Khai báo biến mảng Khai báo biến kiểu xâu ký tự
  • 14. 6. Khai báo biến và hằng * Khai báo biến kiểu byte  Tên biến DB Giá trị khởi đầu  Tên biến DB ?  Ví dụ 1: B1 DB 4 • Biến kiểu byte có tên là B1 • Máy tính dành 1 byte bộ nhớ cho nó và trong byte đó có chứa giá trị 4.  Ví dụ 2: B2 DB ?  Định nghĩa biến byte có tên là B2 và dành 1 byte bộ nhớ cho nó. I. Khung Chương trình Assembly
  • 15. 6. Khai báo biến và hằng * Khai báo biến kiểu từ word  Tên biến DW Giá trị khởi đầu  Tên biến DW ?  Ví dụ 1: B1 DW 42H • Biến kiểu word có tên là B1 • Máy tính dành 2 byte bộ nhớ cho nó và trong byte đó có chứa giá trị 42H.  Ví dụ 2: B2 DW ?  Định nghĩa biến byte có tên là B2 và dành 1 byte bộ nhớ cho nó. I. Khung Chương trình Assembly
  • 16. 6. Khai báo biến và hằng * Khai báo biến kiểu từ kép Double word  Tên biến DD Giá trị khởi đầu  Tên biến DD ?  Ví dụ 1: B1 DD 1000H • Biến kiểu Double word có tên là B1 • Máy tính dành 4 byte bộ nhớ cho nó và trong byte đó có chứa giá trị 1000H  Ví dụ 2: B2 DD ?  Định nghĩa biến byte có tên là B2 và dành 4 byte bộ nhớ cho nó. I. Khung Chương trình Assembly
  • 17. 6. Khai báo biến và hằng * Khai báo biến kiểu MẢNG  Tên biến mảng DB/DW/DD Các giá trị khởi đầu  Gồm một dãy các phần tử và ô nhớ kiểu byte/ ord/double word Ví dụ: M1 DB 4,5,6,7,8,9 • Biến mảng có tên là M1 • Máy tính dành 6 byte liên tiếp cho nó để chứa các giá trị khởi đầu tương ứng là 4, 5 ,6 ,7 ,8 , 9. • Phần tử đầu của mảng là 4 và có địa chỉ trùng với địa chỉ của tên biến (M1), phần tử thứ hai là 5 và có địa chỉ là M1+1... Ví dụ: M2 DB 20 DUP(0) M3 DB 20 DUP(?) • Biến mảng có tên là M2 gồm 20 byte để chứa 20 giá trị khởi đầu bằng 0 • Biến mảng có tên là M3 gồm 20 byte nhưng không chứa giá trị khởi đầu. I. Khung Chương trình Assembly
  • 18. 6. Khai báo biến và hằng * Khai báo biến kiểu MẢNG (tiếp)  Chú ý: • Toán tử DUP có thể dùng lồng nhau để định nghĩa 1 mảng Ví dụ: M4 DB 4,3,2,2 DUP(1,2 DUP(5),6) M4 DB 4,3,2,1,5,5,6,1,5,5,6 • Khi lưu trữ một từ trong bộ nhớ thì byte thấp của nó sẽ được để ở ô nhớ có địa chỉ thấp, byte cao để ở ô nhớ có địa chỉ cao. Ví dụ: W1 DW 0FFACH => Byte thấp ACH sẽ được để tại địa chỉ W1, byte cao FFH sẽ được để tại địa chỉ tiếp theo W1+1. I. Khung Chương trình Assembly
  • 19. 6. Khai báo biến và hằng * Khai báo biến kiểu xâu kí tự  Là trường hợp đặc biệt của biến mảng kiểu byte, trong đó 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 của các ký tự đó.  Ví dụ: • Xaukt DB „ABCDE‟ • Xaukt DB 41h,42h,43h,44h,45h • Xaukt DB 41h,42h,‟C‟,‟D‟,45h I. Khung Chương trình Assembly
  • 20. 6. Khai báo biến và hằng b) Khai báo biến hằng • Hằng có thể là kiểu số hoặc kiểu ký tự. • Tên hằng EQU Giá trị của hằng • Ví dụ: CR EQU 0Dh LF EQU 0Ah CHAO EQU „Hello‟ • Vì lệnh giả EQU không dành chỗ của bộ nhớ cho tên hằng nên ta có thể khai báo hằng ở bất kỳ đâu trong chương trình. Tuy nhiên người ta thường đặt các khai báo hằng trong đoạn dữ liệu.
  • 21. 7. Một số lệnh cơ bản • MOV Đích, Nguồn Ví dụ: Mov AH,10D ;Chuyển giá trị 10 vào AH Mov AX,BX ; Chuyển giá trị thanh ghi BX vào thanh ghi AX Mov [DI],CX ; Chuyển giá trị thanh ghi CX vào ô nhớ DS:DI • XCHG Đích, Nguồn: Hoán đổi nội dung của 2 toán hạng đích và nguồn Ví dụ: XCHG AH,BL ; Hoán đổi nội dung của hai thanh ghi AH và B • Lệnh cộng không nhớ: ADD Đích, Nguồn Áp dụng cho= số nhị phân, gần như phép toán xor Đích = Đích + Nguồn • Lệnh cộng có nhớ: ADC Đích, Nguồn (Add With Carry) Đích Đích + Nguồn + CF
  • 22. 7. Một số lệnh cơ bản - Lệnh tăng: INC Đích Đích Đích + 1 - Lệnh giảm: DEC Đích Đích Đích - 1 - Lệnh trừ không mượn: SUB Đích, Nguồn Đích Đích - Nguồn - Lệnh trừ có mượn: SBB Đích, Nguồn Đích Đích - Nguồn - CF - NEG Đích Đích -Đích - LEA Đích, Nguồn (Load Effective Address): Nạp địa chỉ thực + Đích thường là một trong các thanh ghi: BX, CX, DX, BP, SI, DI + Nguồn là tên biến trong đoạn DS được chỉ rõ trong lệnh hoặc ô nhớ cụ thể => Chuyển địa chỉ lệch của ô nhớ Nguồn vào thanh ghi Đích 16 bit VD: Tb1 db “Nhap so can kiem tra: $” LEA DX, Tb1
  • 23. 8. Các lệnh vào ra • Lệnh INT: Gọi các chương trình ngắt của DOS và BIOS. • Dạng lệnh: INT số_hiệu_ngắt • Ngắt INT 21h => Ngắt int 21h dùng để gọi rất nhiều hàm của DOS. Mỗi hàm được gọi bằng cách đặt số hàm vào trong thanh ghi AH và gọi ngắt INT 21h
  • 24. 8. Các lệnh vào ra  Hàm 1: Vào một kí tự Input AH=1 Ra AL = Lưu mã ASCII của kí tự nhập vào = 0 Nếu 1 phím điều khiển hay chức năng được ấn => Để gọi phục vụ này ta thực hiện lệnh: MOV AH,1 INT 21h
  • 25. 8. Các lệnh vào ra Vd: Nhập vào 2 số: Al, BL sau đó đảo giá trị cho nhau MOV AH,1 INT 21H Nhập x MOV BL,AL MOV AH,1 Nhập y INT 21H XCHG AL,BL Đảo giá trị
  • 26. 8. Các lệnh vào ra  Hàm 2: Hiển thị một kí tự hay thi hành một chức năng điều khiển Input: AH=2 DL=Mã ASCII của kí tự hiển thị hay kí tự điều khiển Output: Giá trị của DL Ví dụ: sau sẽ hiển thị dấu “?” lên màn hình MOV AH,2 MOV DL,”?” INT 21h
  • 27. 8. Các lệnh vào ra  Hàm 9: Hiển thị một chuỗi kí tự Input: AH=9 DX=Địa chỉ tương đỗi của chuỗi Output: Hiễn thị một chuỗi ra màn hình  Kí tự “$” đánh dấu kết thúc chuỗi và không được hiển thị. Nếu chuỗi chứa mã ASCII của kí tự điều khiển thì các chức năng điều khiển sẽ được thi hành VD: msg DB “Xin chao $”  Để sao chép địa chỉ tương đối từ nguồn sang đích LEA đích, nguồn VD: Lea DX, msg
  • 28. 8. Các lệnh vào ra Chu trình hiển thị chuỗi kí tự B1: Khởi tạo đoạn dữ liệu chứa trong thanh ghi DS MOV AX,@DATA MOV DS,AX @ DATA : Tên đoạn dữ liệu được định nghĩa bởi .Data Địa chỉ dữ liệu không chuyển trực tiếp. B2: đưa địa chỉ vào thanh ghi DX LEA DX,MSG MOV AH,9 INT 21H Vd: Viết chương trình hiển thị một chuỗi kí tự bất kì
  • 29. 9.Khung chương trình assembly 1 Khai báo quy mô sử dụng bộ nhớ 2 Khai báo đoạn ngăn xếp Khai báo đoạn dữ liệu 3 Khai báo đoạn mã 4
  • 30. a. Khai báo quy mô sử dụng bộ nhớ .MODEL Kiểu_kích_thước_bộ_nhớ
  • 31. b. Khai báo đoạn ngăn xếp . • Máy tính dành ra một vùng nhớ đủ lớn dùng làm ngăn xếp phục vụ cho hoạt động của chương trình. • Cú pháp: .STACK Kích_thước • Kích_thước quyết định số byte dành cho ngăn xếp. Thông thường với 100 - 256 byte là đủ để làm ngăn xếp và ta có thể khai báo kích thước cho ngăn xếp như sau: .STACK 100 hoặc .STACK 100H
  • 32. c. Khai báo đoạn dữ liệu . •Bao gồm toàn bộ các khai báo biến và hằng của chương trình. Các khai báo trong đoạn dữ liệu đặt sau lệnh giả .DATA Ví dụ: .DATA MSG DB „Hello!$‟ B1 DB 100 CR EQU 0DH ; Quay về đầu dòng LF EQU 0AH ; Xuống dòng
  • 33. d. Khung chương trình Assembly để dịch ra chương trình .EXE • Đoạn mã chứa mã lệnh của chương trình • Để bắt đầu đoạn mã ta dùng lệnh giả .CODE • Chương trình chính và chương trình con. .CODE Tên_CTChính PROC ;Các lệnh của chương trình chính … . CALL Tên_CTCon ;Gọi chương trình con … Tên_CTChính ENDP VD ;Khai báo các chương trình con ở đây Tên_CTCon PROC ;Các lệnh của chương trình con RET ;Trở về Tên_CTCon ENDP
  • 34. e. Khung chương trình Assembly để dịch ra chương trình .com . . Đoạn mã, đoạn dữ liệu và đoạn ngăn xếp được gộp lại trong một đoạn duy nhất là đoạn mã .MODEL TINY .CODE ORG 100H ; để gán địa chỉ bắt đầu của chương trình tại 100h ; để nhảy qua toàn bộ phần bộ nhớ dành cho việc khai báo dữ liệu START: JMP CONTINUE. ;Các khai báo biến và hằng để tại đây CONTINUE: MAIN PROC VD ;Các lệnh của chương trình chính để tại đây ;Trở về DOS INT 20H MAIN ENDP ;Các chương trình con (nếu có) khai báo ở đây END START
  • 35. Chương 4: Lập trình Assembly I 3 Khung Chương trình Assembly II Biên soạn và dịch chương trình Assembly I 3II Thực hiện cấu trúc điều khiển chương trình bằng assembly
  • 36. II. Biên soạn và dịch chương trình Assembly .
  • 37. II. Biên soạn và dịch chương trình Assembly . Trở về thư mục gôc C:
  • 38. II. Biên soạn và dịch chương trình Assembly . Truy nhập vào thư mục MASM
  • 39. II. Biên soạn và dịch chương trình Assembly . Dịch chương trình sang mã máy
  • 40. II. Biên soạn và dịch chương trình Assembly . c đuôi .EXE
  • 41. II. Biên soạn và dịch chương trình Assembly . Chạy chương trình
  • 42. Chương 4: Lập trình Assembly I 3 Khung Chương trình Assembly II Biên soạn và dịch chương trình Assembly I 3II Thực hiện cấu trúc điều khiển chương trình bằng assembly
  • 43. III. Thực hiện các cấu trúc điều khiển chương trình bằng assembly A. Lệnh JMP: Lệnh nhảy không điều kiện.  Cú pháp JMP Nhãn => Chuyển CS:IP tới vị trí được xác định bởi Nhãn B. Các lệnh nhảy có điều kiện  Có ba loại nhảy có điều kiện: <1> Các lệnh nhảy không dấu dùng với các số không dấu <2> Các lệnh nhảy có dấu được dùng khi kết quả trả về là các số có dấu <3> Các lệnh nhảy điều kiện đơn: điều kiện phụ thuộc vào một cờ riêng biệt.
  • 44. III. Thực hiện các cấu trúc điều khiển chương trình bằng assembly 1.Các lệnh nhảy không dấu JA/ JNBE Jump if Above: Nhảy nếu lớn hơn Jump if Not Below or Equal: Nhảy nếu không thấp hơn hoặc bằng). vd: JA NHAN / JNBE NHAN JAE/JNB/JNC Jump if Above or Equal: Nhảy nếu cao hơn hoặc bằng Jump if Not Below: Nhảy nếu không thấp hơn vd: JAE NHAN JNB NHAN JNC NHAN
  • 45. III. Thực hiện các cấu trúc điều khiển chương trình bằng assembly 1.Các lệnh nhảy không dấu JB/JC/JNAE Jump if Below: Nhảy nếu thấp hơn Jump if Carry: Nhảy nếu có nhớ Jump if Not Above or Equal:Nhảy nếu không cao hơn hoặc bằng) VD: JB NHAN / JC NHAN / JNAE NHAN JBE/JNA Jump if Below or Equal: Nhảy nếu thấp hơn hoặc bằng Jump if Not Above: Nhảy nếu không cao hơn JBE NHAN JNA NHAN
  • 46. III. Thực hiện các cấu trúc điều khiển chương trình bằng assembly 2. Các lệnh nhảy có dấu • JG/JNLE : Jump if Greater than/ Jump if Not Less than or Equal (Nhảy nếu lớn hơn/ Nhảy nếu không bé hơn hoặc bằng) JG NHAN JNLE NHAN • JGE/JNL: Jump if Greater than or Equal/ Jump if Not Less than (Nhảy nếu lớn hơn hoặc bằng/ Nhảy nếu không nhỏ hơn) JGE NHAN JNL NHAN
  • 47. III. Thực hiện các cấu trúc điều khiển chương trình bằng assembly 2. Các lệnh nhảy có dấu JL/ JNGE: Jump if Less than/ Jump if Not Greater than or Equal (Nhảy nếu nhỏ hơn/ Nhảy nếu không lớn hơn hoặc bằng) JL NHAN JNGE NHAN JLE/JNG: Jump if Less than or Equal/ Jump if Not Greater than (Nhảy nếu nhỏ hơn hoặc bằng/ Nhảy nếu không lớn hơn) JLE NHAN JNG NHAN
  • 48. III. Thực hiện các cấu trúc điều khiển chương trình bằng assembly 3. Các lệnh nhảy điều kiện đơn  JCXZ : Jump if CX Register if Zero (Nhảy nếu nội dung thanh đếm rỗng) JCXZ NHAN  JE/JZ: Jump if Equal/ Jump if Zero (Nhảy nếu bằng nhau/ Nhảy nếu kết quả bằng không) JE NHAN JZ NHAN  JC: Jump if Carry ( Nhảy nếu có nhớ)
  • 49. III. Thực hiện các cấu trúc điều khiển chương trình bằng assembly 3. Các lệnh nhảy điều kiện đơn JNC : Jump if Not Carry (Nhảy nếu không nhớ)  JO: Jump if Overflow (Nhảy nếu tràn)  JNO: Jump if Not Overflow (Nhảy nếu không tràn)  JS: Jump if Sign (Nhảy nếu dấu âm)  JNS: Jump if Not Sign (Nhảy nếu dấu dương) Tất cả các lệnh nhảy hoặc nhảy có điều kiện đều không tác động đến cờ
  • 50. VD: so sánh lệnh nhảy có dấu và không dấu  Mỗi lệnh nhảy có dấu đều tương ứng với một lệnh nhảy không dấu: VD: JG (có dấu),JA(không dấu)  Ví dụ: AX chứa 7FFFh, BX chứa 8000h Cmp AX,BX Ja TEST ; Không nhảy đến nhãn TEST Nếu coi AX, BX là các số có dấu thì AX>BX nhưng sử dụng Cmp AX,BX Ja TEST ; Không nhảy đến nhãn TEST vì Ja là lệnh nhảy không dấu
  • 51. III. Thực hiện các cấu trúc điều khiển chương trình bằng assembly C: CMP Left, Right  Left: có thể là thanh ghi hoặc ô nhớ (Không được phép là hằng số)  Right: có thể là thanh ghi hoặc ô nhớ hoặc hằng số.  Các toán hạng của lệnh Cmp không thể cùng là các ô nhớ. => Lệnh này so sánh Left và Right bằng cách lấy toán tử Left trừ đi toán tử Right, kết quả không được lưu lại nhưng các cờ bị ảnh hưởng. Các toán hạng của lệnh Cmp không thể cùng là các ô nhớ.
  • 52. III. Thực hiện các cấu trúc điều khiển chương trình bằng assembly D: Các cấu trúc ngôn ngữ bậc cao  Cấu trúc rẽ nhánh IF-THEN  Cấu trúc lựa chọn CASE  Cấu trúc lặp với số lần xác định FOR-DO  Cấu trúc lặp với số lần không xác định REPEAT-UNTIL và WHILE-DO ng các lệnh nhảy và lệnh lặp của bộ vi xử lý. Cụ thể như sau:
  • 53. Cấu trúc rẽ nhánh IF-THEN  Cấu trúc rẽ nhánh IF-THEN (1) IF <Điều kiện> THEN <Công việc> (2) IF <Điều kiện> THEN <Công việc 1> ELSE <Công việc 2>
  • 54. Cấu trúc rẽ nhánh IF-THEN VD: Viết đoạn chương trình gán BX |AX| IF_: CMP AX,0 JAE ENDIF_ NEG AX ENDIF_: MOV BX,AX
  • 55. Cấu trúc lựa chon CASE  Cấu trúc lựa chon CASE CASE <Biểu thức> OF Giá_trị_1: Công_việc_1 Giá_trị_2: Công_việc_2 Giá_trị_N: Công_việc_N END_CASE
  • 56. III. Thực hiện các cấu trúc điều khiển chương trình bằng assembly  B1: Nếu AX chứa số âm thì đưa -1 vào BX, nếu AX chứa 0 thì đưa 0 vào BX, nếu AX chứa số dương thì đưa 1 vào BX.
  • 57. Cấu trúc lặp với số lần xác định FOR-DO FOR <Số lần lặp> DO Đưa số lần lặp <Công việc> vào bộ đếm ENDFOR Công việc Giảm bộ đếm đi 1 Sai Bộ đếm = 0? Đúng
  • 58. Cấu trúc lặp với số lần xác định FOR-DO  VD: Hiện thị một dòng 80 ký tự „$‟ Cx=80 FOR_: MOV CX,80 MOV AH,2 Công việc MOV DL,‟$‟ INT 21H Cx=cx-1 LOOP FOR_ ENDFOR_: Sai cx = 0? Đúng
  • 59. Cấu trúc lặp với số lần xác định FOR-DO  Chú ý: Sử dụng lệnh nhảy JCXZ để tránh vòng lặp không kết thúc được MOV CX,80 MOV AH,2 JCNZ ENDFOR_ FOR_: MOV DL,‟$‟ INT 21H LOOP FOR_ ENDFOR_:
  • 60. Cấu trúc lặp với số lần không xác định  Kiểm tra điều kiện trước Pascal Assembly WHILE <Điều kiện> WHILE <Điều kiện> DO <Công việc> <Công việc> ENDWHILE BT: Đếm số kí tự được đọc vào từ bàn phím khi nào gặp CR thì thôi
  • 61. Cấu trúc lặp với số lần không xác định  Kiểm tra điều kiện sau REPEAT <Công việc> UNTIL <Điều kiện> BT: Đếm số kí tự được đọc vào từ bàn phím khi nào gặp CR thì thôi
  • 62. Nội dung tóm lược Cấu trúc một lệnh Các toán Tên Mã lệnh Chú giải hạng
  • 63. Nội dung tóm lược  Khung chương trình Bắt đầu Khai báo chương trình chính Các lệnh chương trình chính Kết thúc chương trình chính Khai báo chương trình con Các lệnh chương trình con Kết thúc chương trình con Kết thúc
  • 64. Cách tạo và chạy một chương trình hợp ngữ dạng EXE Bắt đầu Trình soạn thảo File . ASM Trình biên dịch File .OBJ Trình liên kết File .EXE Kết thúc
  • 65. Các cấu trúc lập trình của hợp ngữ
  • 66. Các cấu trúc lập trình của hợp ngữ
  • 67. Các cấu trúc lập trình của hợp ngữ
  • 68. Câu hỏi ôn tập chương 4 Câu 1: Trình bày cú pháp của chương trình hợp ngữ? Câu 2: Trình bày Khung của chương trình hợp ngữ để dịch ra chương trình .EXE? Câu 3: Trình bày Khung của chương trình hợp ngữ để dịch ra chương trình .COM? Câu 4: Cách tạo và cho chạy một chương trình hợp ngữ IPM PC?