Đang tải...

CLB Điện tử - Viễn thông Giới thiệu ngôn ngữ Assembly

Thảo luận trong 'Câu lạc bộ các ngành kỹ thuật' bắt đầu bởi khoadongluc, 10/5/10.

Thành viên đang xem bài viết (Users: 0, Guests: 0)

  1. khoadongluc
    Offline

    Nothing Is Impossible
    Thành viên BQT
    Expand Collapse

    Tham gia ngày:
    17/3/09
    Số km:
    22,748
    Được đổ xăng:
    7,026
    Mã lực:
    2,289
    Giới tính:
    Nam
    Xăng dự trữ:
    31,480 lít xăng
    1. Khái quát về phần mềm của bộ vi điều khiển
    Phần mềm là thuật ngữ để chỉ các lệnh mà bộ vi điều khiển phải thực hiện. Việc xây dựng phần mềm do người dùng thực hiện. Ta có thể lập trình bằng một trong ba ngôn ngữ sau: ngôn ngữ máy, ngôn ngữ cấp thấp (hợp ngữ-Assembly) và ngôn ngữ cấp cao. Trong ba loại này chỉ có ngôn ngữ máy là đối tượng thi hành trực tiếp của bộ vi xử lý. Nghĩa là bộ vi xử lý chỉ có thể hiểu và thi hành một chương trình viết bằng ngôn ngữ máy. Các chương trình viết bằng hợp ngữ hoặc ngôn ngữ bậc cao được dịch sang ngôn ngữ máy để thực hiện được trên các bộ vi xử lý.
    Hiện nay, các chương trình không còn viết bằng ngôn ngữ máy vì rất khó, rất dễ nhầm lẫn, khó sữa chữa. Thay vào đó là dùng hợp ngữ hoặc ngôn ngữ bậc cao để viết chương trình.
    Ngôn ngữ bậc cao cho phép viết chương trình gần với thuật toán tự nhiên hơn, và có thể thực hiện được kết cấu có cấu trúc hoặc ghép mảng. Một ưu điểm khác của ngôn ngữ bậc cao là tính độc lập với phần cứng. Như vậy, một chương trình viết bằng ngôn ngữ bậc cao có thể chạy được trên những bộ vi điều khiển khác nhau miễn là nó được dịch sang ngôn ngữ máy một cách thích hợp. Ngôn ngữ bậc cao rất gần gũi với ngôn ngữ con người nên dễ phát hiện và sữa chữa các sai sót hơn khi dùng hợp ngữ. Tuy nhiên, khi dùng ngôn ngữ bậc cao có những nhược điểm là hiệu suất dịch thấp, do đó sẽ dẫn đến tốn bộ nhớ và tốc độ thực hiện giảm. Ngoài ra, ngôn ngữ bậc cao chỉ có thể thích hợp với một số ứng dụng cụ thể, nên tính vạn năng của nó kém. Các ngôn ngữ bậc cao thường dùng là: Basic, Pascal, C, Fortran,…
    Hiện nay các vi điều khiển trên ôtô đều dùng chương trình ứng dụng viết bằng hợp ngữ vì chương trình viết bằng hợp ngữ ngắn hơn, chiếm ít bộ nhớ hơn và chạy nhanh hơn.
    2. Khung chương trình Assembly
    Một chương trình Assembly bao gồm các dòng lệnh, một dòng lệnh có thể là một lệnh thật dưới dạng gợi nhớ của bộ vi xử lý hoặc một hướng dẫn cho chương trình dịch (assembler directive, đôi khi gọi là lệnh giả). Lệnh thật sẽ được dịch ra mã máy còn lệnh giả thì không được dịch, vì 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.
    Một dòng lệnh của Assembly có thể có những trường sau (không nhất thiết phải có đủ các trường):
    Tên Mã lệnh Các toán hạng Chú giải
    - Trường tên: Có thể là 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 “:”.
    - Trường mã lệnh: Chứa các lệnh thật hoặc lệnh giả.
    - Trường toán hạng: Đối với các lệnh thật thì trường này chứa các toán hạng của lệnh. Tùy từng loại lệnh mà có thể không có, có 1 hoặc 2 toán hạng trong một lệnh. Đối với các lệnh giả thì trường này chứa các thông tin khác liên quan đến lệnh giả.
    - Trường chú giải: Lời giải thích phải được bắt đầu bằng dấu chấm phẩy. Trường chú giải dành cho người lập trình để ghi các lời giải thích cho các lệnh của chương trình, giúp cho người đọc chương trình dễ hiểu các thao tác của chương trình lớn. Khi đọc thấy dấu chấm phẩy, chương trình dịch bỏ qua không dịch từ sau dấu chấm phẩy đến hết dòng. Người lập trình có thể lợi dụng đặc điểm này để loại bỏ một dòng lệnh nào đó trong chương trình.
    Một chương trình mã máy trong bộ nhớ thường bao gồm các vùng nhớ khác nhau để chứa mã lệnh, chứa dữ liệu của chương trình và một vùng nhớ được dùng làm ngăn xếp phục vụ hoạt động của chương trình. Chương trình viết bằng ngôn ngữ Assembly cũng phải có cấu trúc tương tự để khi dịch nó sẽ tạo ra mã máy có cấu trúc như trên, tức là đoạn mã lệnh sẽ được dịch và để trong vùng nhớ mã lệnh, đoạn dữ liệu sẽ được dịch và để trong vùng nhớ dữ liệu và đoạn ngăn xếp sẽ được dịch và tạo ra vùng nhớ ngăn xếp cho chương trình.
    Trước khi tìm hiểu khung của một chương trình Assembly ta xem xét các khai báo có trong chương trình:
    a) Khai báo quy mô sử dụng bộ nhớ
    Kích thước bộ nhớ dành cho đoạn mã và đoạn dữ liệu trong một chương trình được xác định bằng lệnh giả .MODEL. Lệnh này phải được đặt trước các lệnh khác trong chương trình nhưng đặt sau lệnh giả khai báo loại CPU.
    Cú pháp: .MODEL Kiểu_kích_thước_bộ_nhớ
    [​IMG]
    Bảng 1: Các kiểu bộ nhớ khai báo trong Assembly
    b) Khai báo đoạn ngăn xếp
    Việc khai báo đoạn ngăn xếp là để 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
    Đoạn dữ liệu chứa 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
    d) Khai báo đoạn mã
    Đoạn mã chứa mã lệnh của chương trình, tức là các lệnh của chương trình sẽ viết ở đây. Để bắt đầu đoạn mã ta dùng lệnh giả .CODE
    Bên trong đoạn mã, các lệnh của chương trình có thể tổ chức thành chương trình chính và chương trình con như sau:
    .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
    ;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

    3. Các cấu trúc điều khiển chương trình bằng Assembly
    Thông thường khi lập trình chúng ta cần đến các cấu trúc điều khiển chương trình sau:
    + 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
    Để thực hiện các cấu trúc điều khiển chương trình này chúng ta sử dụng các lệnh nhẩy và lệnh lặp của bộ vi xử lý. Cụ thể như sau:
    a) Cấu trúc rẽ nhánh IF-THEN
    Có hai dạng:
    (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>
    Hoạt động của cấu trúc này có thể diễn tả bằng lưu đồ sau:
    [​IMG]
    Hình 1 : Sơ đồ cấu trúc IF-THEN và IF-THEN-ELSE
    b) Cấu trúc lựa chọn CASE
    Khác với cấu trúc rẽ nhánh IF-THEN chỉ rẽ được hai nhánh, cấu trúc lựa chọn có thể rẽ nhiều nhánh. Dạng tổng quát như sau:
    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
    Hoạt động của cấu trúc này thể hiện bằng lưu đồ sau:
    [​IMG]
    Hình 2 : Sơ đồ cấu trúc lựa chọn CASE
    c) Cấu trúc lặp với số lần xác định FOR-DO
    Dạng tổng quát
    FOR <Số lần lặp> DO
    <Công việc>
    ENDFOR
    Hoạt động của cấu trúc này thể hiện bằng lưu đồ sau:
    [​IMG]
    Hình 3 . Sơ đồ cấu trúc FOR-DO
    d) 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
    Dạng tổng quát
    WHILE <Điều kiện> DO <Công việc>
    Hoạt động của cấu trúc này được thể hiện qua lưu đồ sau:
    [​IMG]
    Hình 4 :Sơ đồ cấu trúc WHILE-DO
    - Kiểm tra điều kiện sau
    Dạng tổng quát
    REPEAT <Công việc> UNTIL <Điều kiện>
    Hoạt động của cấu trúc này được thể hiện qua lưu đồ sau:
    [​IMG]
    Hình 5 :Sơ đồ cấu trúc REPEAT-UNTIL
     
  2. vickykjt
    Offline

    Tài xế O-H
    Expand Collapse

    Tham gia ngày:
    14/5/12
    Số km:
    2
    Được đổ xăng:
    0
    Mã lực:
    0
    Xăng dự trữ:
    298 lít xăng
    [HELP] mình mới lần đầu tiếp xúc vs ngôn ngữ này nên ko hiểu cách để chạy 1 chương trình assembly bạn có thể hướng dẩn cụ thể giúp mình ko (bằng hình ảnh càng tốt ).
    thầy giáo vừa đưa mình 1 bài tập , vì mình chưa hiểu về môn này nên bạn có thế cho mình xin đoạn code và hướng dẩn cụ thể ko câu hỏi là: Viết ctrinh nhập vào 2 số in ra kết qả tổng 2 số đó , nếu trong 2 số có 1 số bằng 0 thì ko in ra gì cả. Hết
    Mong nhận đc trã lời của bạn sớm nhé. Thanks (cái bài tập mình đang cần hiểu gấp nên bạn chỉ mình trước nhé)
     

Chia sẻ trang này