7 can ban assembly

30,626 views

Published on

kiến trúc máy tính
Slide bài giảng môn Kiến trúc máy tính

Published in: Technology, Education
94 Comments
69 Likes
Statistics
Notes
No Downloads
Views
Total views
30,626
On SlideShare
0
From Embeds
0
Number of Embeds
32
Actions
Shares
0
Downloads
0
Comments
94
Likes
69
Embeds 0
No embeds

No notes for slide
  • Ví dụ: Data segment buffer db 100 dup (?) ends S tack segment dw 100 dup(0ABCDh) ends Code segment mov ah,4ch int 21h ends Giả sử SS = 0717h thì SP là 0000h + (100d x 2) = 00C8h  SS:SP = 0717:00C8 h
  • 7 can ban assembly

    1. 1. KIẾN TRÚC MÁY TÍNH <ul><li>BÀI 7 </li></ul><ul><li>CĂN BẢN ASSEMBLY </li></ul>Giáo viên: Phạm Thành Văn ĐT: 0939.731.994 Email: [email_address]
    2. 2. MÔN HỌC: KIẾN TRÚC MÁY TÍNH <ul><li>Bài 1: TỔNG QUAN MÁY TÍNH </li></ul><ul><li>Bài 2: KIẾN TRÚC PHẦN MỀM BỘ XỬ LÝ </li></ul><ul><li>Bài 3: TỔ CHỨC BỘ XỬ LÝ </li></ul><ul><li>Bài 4: KỸ THUẬT XỬ LÝ THÔNG TIN </li></ul><ul><li>Bài 5: BỘ NHỚ MÁY TÍNH </li></ul><ul><li>Bài 6: HỆ THỐNG XUẤT NHẬP </li></ul><ul><li>Bài 7: CĂN BẢN VỀ ASSEMBLY </li></ul><ul><li>ÔN TẬP CUỐI MÔN </li></ul><ul><li>ĐỒ ÁN MÔN HỌC </li></ul><ul><li>THI CUỐI MÔN </li></ul>
    3. 3. BÀI 7: CĂN BẢN VỀ ASSEMBLY <ul><li>Căn bản về lập trình hợp ngữ (assembly) </li></ul><ul><li>Tập lệnh x86 </li></ul><ul><li>Ngăn xếp và chương trình con </li></ul>Ngôn ngữ lập trình assembly (hợp ngữ) sử dụng các từ gợi nhớ, từ viết tắt… thay cho các chỉ thị (lệnh) phức tạp trong vi xử lý, giúp người lập trình tạo ra các chương trình có khả năng thực thi nhanh và sử dụng tài nguyên tối ưu.
    4. 4. MỤC TIÊU BÀI HỌC <ul><li>Hiểu các thành phần cơ bản của chương trình hợp ngữ (Assembly) </li></ul><ul><li>Nắm được cấu trúc của chương trình Assembly </li></ul><ul><li>Hiểu cách khai báo biến, toán tử, các hàm và các chế độ địa chỉ </li></ul><ul><li>Viết được chương trình hợp ngữ theo yêu cầu </li></ul>
    5. 5. Căn bản về lập trình hợp ngữ Giới thiệu khái quát về hợp ngữ và các công cụ hỗ trợ dùng cho hệ vi xử lý x86 của Intel <ul><li>Một số khái niệm: </li></ul><ul><ul><li>Ngôn ngữ Assembly: </li></ul></ul><ul><ul><ul><li>Là ngôn ngữ lập trình sử dụng các từ gợi nhớ, từ viết tắt thay cho các chỉ thị điều khiển (mã thực thi) phức tạp của vi xử lý. </li></ul></ul></ul><ul><ul><ul><li>Ngôn ngữ assembly phụ vào kiến trúc của vi xử lý </li></ul></ul></ul><ul><ul><li>Assembler: </li></ul></ul><ul><ul><ul><li>Chương trình hỗ trợ giúp chuyển đổi từ ngôn ngữ assembly thành các mã thực thi của vi xử lý. </li></ul></ul></ul><ul><ul><ul><li>Có nhiều chương trình assember như: Turbo Assembler, Macro Assembler (Microsoft ), Emu8086 </li></ul></ul></ul>
    6. 6. Căn bản về lập trình hợp ngữ <ul><li>Một số khái niệm: </li></ul><ul><ul><li>Assembler: </li></ul></ul>
    7. 7. Căn bản về lập trình hợp ngữ <ul><li>Một số khái niệm: </li></ul><ul><ul><li>Giới thiệu chương trình Emu8086 ( http://www.emu8086.com/ ) </li></ul></ul><ul><ul><ul><li>Giao diện chương trình: Welcome Screen </li></ul></ul></ul>
    8. 8. Căn bản về lập trình hợp ngữ <ul><li>Một số khái niệm: </li></ul><ul><ul><li>Giới thiệu chương trình Emu8086 ( http://www.emu8086.com/ ) </li></ul></ul><ul><ul><ul><li>Giao diện chương trình: Code Editor </li></ul></ul></ul>
    9. 9. Căn bản về lập trình hợp ngữ <ul><li>Một số khái niệm: </li></ul><ul><ul><li>Giới thiệu chương trình Emu8086 ( http://www.emu8086.com/ ) </li></ul></ul><ul><ul><ul><li>Giao diện chương trình: Emulate Program (Emulator) </li></ul></ul></ul>
    10. 10. Căn bản về lập trình hợp ngữ <ul><li>Một số khái niệm: </li></ul><ul><ul><li>Giới thiệu chương trình Emu8086 ( http://www.emu8086.com/ ) </li></ul></ul><ul><ul><ul><li>Giao diện chương trình: các cửa sổ khác </li></ul></ul></ul>
    11. 11. Căn bản về lập trình hợp ngữ <ul><li>Một số khái niệm: </li></ul><ul><ul><li>Giới thiệu chương trình Emu8086 ( http://www.emu8086.com/ ) </li></ul></ul><ul><ul><ul><li>Giao diện chương trình: bảng mã ASCII </li></ul></ul></ul>
    12. 12. Căn bản về lập trình hợp ngữ <ul><li>Một số khái niệm: </li></ul><ul><ul><li>Một số công cụ khác </li></ul></ul><ul><ul><ul><li>Win32Dasm: dịch ngược từ mã máy thành ngôn ngữ assembly </li></ul></ul></ul>
    13. 13. Căn bản về lập trình hợp ngữ <ul><li>Một số khái niệm: </li></ul><ul><ul><li>Một số công cụ khác </li></ul></ul><ul><ul><ul><li>BeeHex: chỉnh sửa trực tiếp nội dung (mã lệnh) của chương trình theo hệ Hexadecimal </li></ul></ul></ul>
    14. 14. Căn bản về lập trình hợp ngữ <ul><li>Một số khái niệm: </li></ul><ul><ul><li>Một số công cụ khác </li></ul></ul><ul><ul><ul><li>WinHex: chương trình chỉnh sửa dữ liệu trong máy (dùng mã Hex) </li></ul></ul></ul>
    15. 15. Căn bản về lập trình hợp ngữ <ul><li>Một số khái niệm: </li></ul><ul><ul><li>Cấu trúc một lệnh hợp ngữ: </li></ul></ul><ul><ul><ul><li>Tên/nhãn: Mã lệnh Các toán hạng ;Chú giải </li></ul></ul></ul><ul><ul><ul><li>Ví dụ: </li></ul></ul></ul><ul><ul><ul><li>LAP: MOV AH,[BX] ;Copy nội dung của ô nhớ tại địa chỉ DS:BX vào thanh ghi đa dụng AH </li></ul></ul></ul><ul><ul><li>Các dạng hằng trong hợp ngữ: </li></ul></ul><ul><ul><ul><li>Số nhị phân: gồm 0 hoặc 1 và kết thúc bằng chữ b (hoặc B) </li></ul></ul></ul><ul><ul><ul><li>Số thập lục phân: gồm các số từ 0  9, a  f (hoặc A  F) và kết thúc bằng chữ h (hoặc H). Nếu số bắt đầu bằng chữ thì phải có số 0 đứng trước. </li></ul></ul></ul><ul><ul><ul><li>Ví dụ: 01001011b, 1101B, 37Fh, 100H, 0A7Fh </li></ul></ul></ul>
    16. 16. Căn bản về lập trình hợp ngữ <ul><li>Một số khái niệm: </li></ul><ul><ul><li>Các dạng hằng trong hợp ngữ: </li></ul></ul><ul><ul><ul><li>Số thập phân: gồm các số từ 0  9, có thể kết thúc bẳng chữ d (hoặc D) </li></ul></ul></ul><ul><ul><ul><li>Ví dụ: 10100, 8086d, 888D </li></ul></ul></ul><ul><ul><ul><li>Ký tự: là ký tự bất kỳ (mã ASCII) đặt trong dấu ‘ ’ hoặc “ ” </li></ul></ul></ul><ul><ul><ul><li>Chuỗi ký tự: là một dãy ký tự bất kỳ (mã ASCII) đặt trong dấu ‘ ’ hoặc “ ” </li></ul></ul></ul><ul><ul><ul><li>Ví dụ: “Assembly”, ‘A’ </li></ul></ul></ul>
    17. 17. Căn bản về lập trình hợp ngữ <ul><li>Cấu trúc chương trình hợp ngữ: </li></ul><ul><ul><li>Cấu trúc chương trình hợp ngữ: (dùng cho tập tin thực thi *.exe) </li></ul></ul>
    18. 18. Căn bản về lập trình hợp ngữ <ul><li>Cấu trúc chương trình hợp ngữ: </li></ul><ul><ul><li>Cấu trúc chương trình hợp ngữ: (dùng cho tập tin thực thi *.exe) </li></ul></ul><ul><ul><ul><li>Phần “Data segment”: khai báo các hằng số, biến mảng… </li></ul></ul></ul><ul><ul><ul><li>Các toán tử giả thường dùng: </li></ul></ul></ul><ul><ul><ul><li>org  xác định vị trí mã lệnh khi thực thi </li></ul></ul></ul><ul><ul><ul><li>EQU  gán giá trị cho một biến </li></ul></ul></ul><ul><ul><ul><li>DB  khai báo biến kích thước một byte </li></ul></ul></ul><ul><ul><ul><li>DW  khai báo biến kích thước hai byte </li></ul></ul></ul><ul><ul><ul><li>DD  khai báo biến kích thước bốn byte </li></ul></ul></ul><ul><ul><ul><li>DQ  khai báo biến kích thước tám byte </li></ul></ul></ul><ul><ul><ul><li>DT  khai báo biến kích thước mười byte </li></ul></ul></ul><ul><ul><ul><li>dup (?)  tạo một mảng và gán cùng một giá trị </li></ul></ul></ul>
    19. 19. Căn bản về lập trình hợp ngữ <ul><li>Cấu trúc chương trình hợp ngữ: </li></ul><ul><ul><li>Cấu trúc chương trình hợp ngữ: (dùng cho tập tin thực thi *.exe) </li></ul></ul><ul><ul><ul><li>Phần “Data segment”: khai báo các hằng số, biến mảng… </li></ul></ul></ul><ul><ul><ul><li>Ví dụ: </li></ul></ul></ul><ul><ul><ul><li>Data Segment </li></ul></ul></ul><ul><ul><ul><li>xuongdong EQU 0Dh ;xuống dòng </li></ul></ul></ul><ul><ul><ul><li>Tmp DB ? ;tạo một biến tên Tmp </li></ul></ul></ul><ul><ul><ul><li>Str DB “Message…” ;tạo một mảng chứa chuỗi </li></ul></ul></ul><ul><ul><ul><li>bufferdata DB 100 dup (?) ;tạo mảng có 100 ô nhớ </li></ul></ul></ul><ul><ul><ul><li>Ends </li></ul></ul></ul>
    20. 20. Căn bản về lập trình hợp ngữ <ul><li>Cấu trúc chương trình hợp ngữ: </li></ul><ul><ul><li>Cấu trúc chương trình hợp ngữ: (dùng cho tập tin thực thi *.exe) </li></ul></ul><ul><ul><ul><li>Phần “Stack segment”: khai báo bộ nhớ ngăn xếp. Do x86 sử dụng các thanh ghi 16bit nên kích thước bộ đệm luôn được gán bằng toán tử DW </li></ul></ul></ul><ul><ul><ul><li>Ví dụ: </li></ul></ul></ul><ul><ul><ul><ul><li>Stack Segment </li></ul></ul></ul></ul><ul><ul><ul><li>DW 256 dup (?) ;Tạo ngăn xếp có 256 ô nhớ </li></ul></ul></ul><ul><ul><ul><ul><li>Ends </li></ul></ul></ul></ul>
    21. 21. Căn bản về lập trình hợp ngữ <ul><li>Cấu trúc chương trình hợp ngữ: </li></ul><ul><ul><li>Cấu trúc chương trình hợp ngữ: (dùng cho tập tin thực thi *.exe) </li></ul></ul><ul><ul><ul><li>Phần “Code Segment”: phần chính của chương trình chứa các lệnh hợp ngữ gồm chương trình chính và chương trình con - Procedure (nếu có) </li></ul></ul></ul><ul><ul><ul><li>Ví dụ: </li></ul></ul></ul><ul><ul><ul><ul><li>Code Segment </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Start: </li></ul></ul></ul></ul><ul><ul><ul><ul><li>… ;các lệnh hợp ngữ </li></ul></ul></ul></ul><ul><ul><ul><ul><li>call Chuongtrinhcon ;Gọi chương trình con </li></ul></ul></ul></ul><ul><ul><ul><ul><li>… ;các lệnh hợp ngữ </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Ends </li></ul></ul></ul></ul>
    22. 22. Căn bản về lập trình hợp ngữ <ul><li>Cấu trúc chương trình hợp ngữ: </li></ul><ul><ul><li>Cấu trúc chương trình hợp ngữ: (dùng cho tập tin thực thi *.exe) </li></ul></ul><ul><ul><ul><li>Phần “Code Segment”: phần chính của chương trình chứa các lệnh hợp ngữ gồm chương trình chính và chương trình con - Procedure (nếu có) </li></ul></ul></ul><ul><ul><ul><li>Ví dụ: </li></ul></ul></ul><ul><ul><ul><ul><li>Chuongtrinhcon Proc </li></ul></ul></ul></ul><ul><ul><ul><ul><li>… ;các lệnh hợp ngữ </li></ul></ul></ul></ul><ul><ul><ul><ul><li>ret ;quay về chương trình chính </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Chuongtrinhcon EndP </li></ul></ul></ul></ul>
    23. 23. Căn bản về lập trình hợp ngữ <ul><li>Cấu trúc chương trình hợp ngữ: </li></ul><ul><ul><li>Cấu trúc chương trình hợp ngữ: (dùng cho tập tin lệnh *.com) </li></ul></ul><ul><ul><ul><li>Tập tin lệnh chỉ gồm hai phần (data và code), không có bộ nhớ ngăn xếp </li></ul></ul></ul><ul><ul><ul><li>Ví dụ: </li></ul></ul></ul><ul><li>Code Segment </li></ul><ul><li>org 100h ;địa chỉ bắt đầu của chương trình </li></ul><ul><li>Start: JMP CONTINUE </li></ul><ul><li>;Các khai báo biến, mảng, hằng… để tại đây </li></ul><ul><li>  CONTINUE: </li></ul><ul><li>MAIN PROC </li></ul><ul><li>;Các lệnh của chương trình chính, trở về DOS bằng INT 20h </li></ul><ul><li>MAIN ENDP </li></ul><ul><li>;Các chương trình con (nếu có) khai báo ở đây </li></ul><ul><li>  END start </li></ul>
    24. 24. Căn bản về lập trình hợp ngữ <ul><li>Các chế độ địa chỉ: </li></ul><ul><ul><li>Định vị ô nhớ: địa chỉ một ô nhớ (1byte) trong bộ nhớ được xác định bằng hai phần gồm địa chỉ đoạn (segment) và địa chỉ nền (offset) </li></ul></ul>
    25. 25. Căn bản về lập trình hợp ngữ <ul><li>Các chế độ địa chỉ: </li></ul><ul><ul><li>Địa chỉ nền được lưu trong BX, SI, DI hoặc BP. Kết hợp với [ ] sẽ có thể xác định được các ô nhớ khác nhau. </li></ul></ul><ul><ul><li>Địa chỉ đoạn mặc định được lưu trong thanh ghi DS. Ngoại trừ trường hợp dùng thanh ghi nền là BP thì thanh ghi đoạn phải là SS. Một số thanh ghi đoạn khác: CS, ES </li></ul></ul><ul><ul><li>Ví dụ: chuyển dữ liệu từ ô nhớ tại vị trí 0710:0050h vào byte thấp của thanh ghi AX </li></ul></ul><ul><ul><li>mov ax,0710h ;Gán giá trị 0710h cho AX </li></ul></ul><ul><ul><li>mov ds,ax ;Xác định địa chỉ đoạn trong DS </li></ul></ul><ul><ul><ul><li>mov bx,50h ; Xác định địa chỉ nền trong BX </li></ul></ul></ul><ul><ul><ul><li>mov al,[bx] ;chuyển dữ liệu tại DS:BX vào AL </li></ul></ul></ul>
    26. 26. Căn bản về lập trình hợp ngữ <ul><li>Các chế độ địa chỉ: </li></ul><ul><ul><li>Một số kiểu định vị được hỗ trợ thường dùng </li></ul></ul><ul><ul><li>d8: khoảng cách tương đối 8 bit (-128  +127) </li></ul></ul><ul><ul><li>d16: khoảng cách tương đối 16 bit </li></ul></ul>[BX + SI] [BX + DI] [BP + SI] [BP + DI] [SI] [DI] d16 (chỉ dùng cho offset) [BX] [BX + SI + d8] [BX + DI + d8] [BP + SI + d8] [BP + DI + d8] [SI + d8] [DI + d8] [BP + d8] [BX + d8] [BX + SI + d16] [BX + DI + d16] [BP + SI + d16] [BP + DI + d16] [SI + d16] [DI + d16] [BP + d16] [BX + d16]
    27. 27. Các lệnh điều khiển của x86 Giới thiệu các lệnh thông dụng trong tập lệnh x86 và một số đoạn lệnh có cấu trúc khác <ul><li>Một số cơ bản (xem thêm 8086 instruction set ): </li></ul><ul><ul><li>Dạng lệnh: Lệnh <toán hạng 1>, <toán hạng 2> ; Ghi chú </li></ul></ul><ul><ul><li>Các loại toán hạng: </li></ul></ul><ul><ul><ul><li>Thanh ghi (REG): AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP. </li></ul></ul></ul><ul><ul><ul><li>Thanh ghi địa chỉ đoạn (SREG): DS, ES, SS, và CS (CS chỉ dùng cho toán hạng nguồn) </li></ul></ul></ul><ul><ul><ul><li>Ô nhớ: [BX], [BX+SI+7], biến, hằng số… </li></ul></ul></ul><ul><ul><ul><li>Hằng số: 5, -24, 3Fh, 10001101b… </li></ul></ul></ul>
    28. 28. Các lệnh điều khiển của x86 <ul><li>Một số cơ bản (xem thêm 8086 instruction set ): </li></ul><ul><ul><li>Ví dụ lệnh di chuyển: MOV <toán hạng đích>, <toán hạng nguồn> </li></ul></ul><ul><ul><ul><li>Chép nội dung của toán hạng nguồn vào toán hạng đích </li></ul></ul></ul><ul><ul><ul><li>Toán hạng nguồn có thể là một hằng số, thanh ghi hoặc ô nhớ </li></ul></ul></ul><ul><ul><ul><li>Toán hạng đích chỉ là thanh ghi hoặc ô nhớ </li></ul></ul></ul><ul><ul><ul><li>Cả hai toán hạng phải cùng kích thước </li></ul></ul></ul><ul><ul><ul><li>Không sử dụng với thanh ghi CS và IP </li></ul></ul></ul><ul><ul><ul><li>Ví dụ: </li></ul></ul></ul>ORG 100h MOV AX, 0B800h MOV DS, AX MOV CL, 'A' MOV CH, 1101_1111b MOV BX, 15Eh MOV [BX], CX RET
    29. 29. Các lệnh điều khiển của x86 <ul><li>Các lệnh xuất nhập ký tự dùng ngắt 21h của DOS: </li></ul><ul><ul><li>AH = 1  Đọc một ký tự và hiển thị ra màn hình, ký tự nhận được cất trong AL </li></ul></ul><ul><ul><li>Ví dụ: mov ah,01h </li></ul></ul><ul><ul><li>int 21h </li></ul></ul><ul><ul><li>AH = 2  Xuất một ký tự trong thanh ghi DL ra màn hình, sau khi hoàn tất thì AL = DL </li></ul></ul><ul><ul><li>Ví dụ: mov ah,02h </li></ul></ul><ul><ul><li>mov dl,’A’ </li></ul></ul><ul><ul><li>int 21h </li></ul></ul>
    30. 30. Các lệnh điều khiển của x86 <ul><li>Các lệnh xuất nhập ký tự dùng ngắt 21h của DOS: </li></ul><ul><ul><li>AH = 9  Xuất một chuỗi lưu tại DS:DX, chuỗi phải được kết thúc bằng dấu $ </li></ul></ul><ul><ul><li>Ví dụ: </li></ul></ul>
    31. 31. Các lệnh điều khiển của x86 <ul><li>Các lệnh xuất nhập ký tự dùng ngắt 21h của DOS: </li></ul><ul><ul><li>AH = 10  Nhập một chuỗi ký tự và lưu vào DS:DX. Trong đó, byte đầu tiên qui định số ký tự nhập tối đa, byte thứ hai là số ký tự thực tế nhập vào, các ô nhớ còn lại chứa ký tự nhập vào và lệnh này không thêm dấu $ vào cuối chuỗi. </li></ul></ul><ul><ul><li>Ví dụ: </li></ul></ul>
    32. 32. Các lệnh điều khiển của x86 <ul><li>Các lệnh xuất nhập dữ liệu dùng ngắt 21h của DOS: </li></ul><ul><ul><li>AH = 0Eh  Chọn ổ đĩa mặc định </li></ul></ul><ul><ul><li>AH = 19h  Xác định ổ đĩa mặc định </li></ul></ul><ul><ul><li>AH = 39h  Tạo thư mục </li></ul></ul><ul><ul><li>AH = 3Ah  Xóa thư mục </li></ul></ul><ul><ul><li>AH = 3Bh  Chọn thư mục mặc định </li></ul></ul><ul><ul><li>AH = 3Ch  Tạo tập tin rỗng </li></ul></ul><ul><ul><li>AH = 3Dh  Mở một tập tin </li></ul></ul><ul><ul><li>AH = 3Eh  Đóng một tập tin </li></ul></ul><ul><ul><li>AH = 3Fh  Đọc dữ liệu từ một tập tin </li></ul></ul><ul><ul><li>AH = 40h  Ghi dữ liệu vào một tập tin </li></ul></ul><ul><ul><li>AH = 41h  xóa một tập tin </li></ul></ul>
    33. 33. Các lệnh điều khiển của x86 <ul><li>Các lệnh xuất nhập dữ liệu dùng ngắt 21h của DOS: </li></ul><ul><ul><li>AH = 42h  xác định vị trí dữ liệu trong tập tin (seek) </li></ul></ul><ul><ul><li>AH = 47h  xác định thư mục mặc định </li></ul></ul><ul><ul><li>AH = 4Ch  trả quyền điều khiển (thoát khỏi chương trình) </li></ul></ul><ul><ul><li>AH = 42h  đổi tên hoặc di chuyển tập tin </li></ul></ul><ul><ul><li>Ghi chú: xem thêm “The list of all interrupts that are currently supported by the emulator” để biết thêm chi tiết (Help  Interrupts) </li></ul></ul>
    34. 34. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><ul><li>Lệnh so sánh: so sánh giá trị giữa hai toán hạng </li></ul></ul><ul><ul><li>CMP < Trái>, <Phải> </li></ul></ul><ul><li>Nếu Trái > Phải ⇒ Trái - Phải > 0 : CF = 0 và ZF = 0 </li></ul><ul><li>Nếu Trái < Phải ⇒ Trái - Phải < 0 : CF = 1 và ZF = 0 </li></ul><ul><li>Nếu Trái = Phải ⇒ Trái - Phải = 0 : CF = 0 và ZF = 1 </li></ul><ul><li>TEST <Trái>, <Phải> </li></ul><ul><li>  Nếu Trái and Phải = 0 thì ZF = 1, ngược lại thì ZF = 0 </li></ul><ul><li>Toán hạng Trái, Phải: Thanh ghi, ô nhớ hoặc hằng số </li></ul><ul><li>Ví dụ: so sánh hai số nguyên dương </li></ul><ul><li>  MOV AH, 1 ; AH ← 1 </li></ul><ul><li>MOV AL, 2 ; AL ← 2 </li></ul><ul><li>CMP AH, AL ; CF ← 1, ZF ← 0 vì AH < AL </li></ul>
    35. 35. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><ul><li>Lệnh nhảy: chuyển hướng chương trình đến một vị trí khác theo một yếu cầu cho trước . Có hai dạng: lệnh nhảy có điều kiện và không điều kiện </li></ul></ul><ul><ul><ul><li>Nhảy không điều kiện: JMP <Vị trí nhảy đến> </li></ul></ul></ul><ul><li>myPointer DW Prepare, Calculate, Check, Output </li></ul><ul><li>... MOV BX, 2 ; chỉ số trong mảng con trỏ </li></ul><ul><li>SHL BX, 1 ; nhân đôi </li></ul><ul><li>JMP myPointer[BX] </li></ul><ul><li>... </li></ul><ul><li>Prepare: ; công việc 0 </li></ul><ul><li>... </li></ul><ul><li>Calculate: ; công việc 1 </li></ul><ul><li>... </li></ul><ul><li>Check: ; công việc 2 – nơi cần nhảy đến </li></ul><ul><li>... </li></ul><ul><li>Output: ; công việc 3 </li></ul>
    36. 36. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><ul><li>Lệnh nhảy: </li></ul></ul><ul><ul><ul><li>Nhảy có điều kiện: J<điềukiện> <Vị trí nhảy đến > </li></ul></ul></ul>
    37. 37. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><ul><li>Lệnh nhảy: </li></ul></ul><ul><ul><ul><li>Nhảy có điều kiện khác: Lệnh <Vị trí đến> </li></ul></ul></ul>Lệnh Ý nghĩa LOOP Giảm CX và nhảy nếu CX khác 0 LOOPE Giảm CX và nhảy nếu CX khác 0 và hai toán hạng so sánh trước đó bằng nhau (CF = 0 và ZF = 1) LOOPNE Giảm CX và nhảy nếu CX khác 0 và hai toán hạng so sánh trước đó không bằng nhau (ZF = 0) LOOPNZ Giảm CX và nhảy nếu CX khác 0 và ZF = 0 LOOPZ Giảm CX và nhảy nếu CX khác 0 và ZF = 1 JCXZ Nhảy nếu CX bằng 0
    38. 38. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><ul><li>Cấu trúc rẽ nhánh IF…Then: sử dụng phép so sánh và các lệnh nhảy có điều kiện để thực hiện. Có hai dạng </li></ul></ul><ul><ul><ul><li>IF <Điều kiện> THEN <Công việc> </li></ul></ul></ul><ul><ul><ul><li>IF <Điều kiện> THEN <Công việc 1> ELSE <Công việc 2> </li></ul></ul></ul>
    39. 39. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><ul><ul><li>IF <Điều kiện> THEN <Công việc> </li></ul></ul></ul><ul><li>Ví dụ: Dùng cấu trúc IF để kiểm tra nếu AX < 0 thì đổi dấu. Sau cấu trúc IF dùng lệnh MOV để đưa AX vào BX. </li></ul><ul><li>IF_: </li></ul><ul><li>CMP AX,0 ;so sánh AX với số 0 </li></ul><ul><li>JAE ENDIF_ ;nhảy nếu AX >= 0 </li></ul><ul><li>NEG AX ;thực hiện khi AX < 0 </li></ul><ul><li>ENDIF_: </li></ul><ul><li>MOV BX,AX ;thực hiện khi AX >= 0 </li></ul>
    40. 40. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><ul><ul><li>IF <Điều kiện> THEN <Công việc 1> ELSE <Công việc 2> </li></ul></ul></ul><ul><li>Ví dụ: Giả sử AL và BL chứa mã ASCII của ký tự. Kiểm tra nếu AL<=BL thì hiện ra màn hình ký tự trong AL, còn không thì hiện ký tự trong BL </li></ul><ul><li>IF_: </li></ul><ul><li>CMP AL,BL ;so sánh AL và BL </li></ul><ul><li>JA ELSE_ ;nhảy nếu AL > BL </li></ul><ul><li>MOV AH,2 ;lệnh được thực thi nếu AL <= BL </li></ul><ul><li>MOV DL,AL </li></ul><ul><li>INT 21H </li></ul><ul><li>JMP ENDIF_ </li></ul><ul><li>ELSE_: </li></ul><ul><li>MOV AH,2 ;lệnh được thực thi nếu AL > BL </li></ul><ul><li>MOV DL, BL </li></ul><ul><li>INT 21H </li></ul><ul><li>ENDIF_: </li></ul>
    41. 41. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><ul><li>Cấu trúc lựa chọn CASE: sử dụng phép so sánh và các lệnh nhảy có điều kiện để thực hiện. Cấu trúc tổng quát của lệnh </li></ul></ul><ul><li>CASE <Biểu thức> OF </li></ul><ul><li>Giá_trị_1: Công_việc_1 </li></ul><ul><li>Giá_trị_2: Công_việc_2 </li></ul><ul><li>… </li></ul><ul><li>Giá_trị_N: Công_việc_N </li></ul>
    42. 42. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><ul><li>Ví dụ: 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. </li></ul></ul><ul><ul><li>CASE_: </li></ul></ul><ul><ul><li>CMP AX,0 </li></ul></ul><ul><ul><li>JL AM </li></ul></ul><ul><ul><li>JE KHONG </li></ul></ul><ul><ul><li>JG DUONG </li></ul></ul><ul><ul><li>AM: </li></ul></ul><ul><ul><li>MOV BX,-1 </li></ul></ul><ul><ul><li>JMP ENDCASE_ </li></ul></ul><ul><ul><li>KHONG: </li></ul></ul><ul><ul><li>MOV BX,0 </li></ul></ul><ul><ul><li>JMP ENDCASE_ </li></ul></ul><ul><ul><li>DUONG: </li></ul></ul><ul><ul><li>MOV BX,1 </li></ul></ul><ul><ul><li>ENDCASE_: </li></ul></ul>
    43. 43. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><ul><li>Cấu trúc vòng lặp với số lần xác định FOR…DO: sử dụng phép so sánh và các lệnh nhảy có điều kiện để thực hiện. Cấu trúc tổng quát của lệnh </li></ul></ul><ul><li>FOR <Số lần lặp> DO </li></ul><ul><li><Công việc> </li></ul><ul><li>ENDFOR </li></ul>
    44. 44. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><li>Ví dụ: Hiển thị một dòng 26 ký tự hoa trong bảng mã ASCII. Đoạn chương trình như sau: </li></ul><ul><li>FOR_: </li></ul><ul><li>MOV CX,26 ;số lần lặp lại </li></ul><ul><li>MOV BL,41h ;ký tự đầu tiên (chữ A) </li></ul><ul><li>HIENTHI_: </li></ul><ul><li>MOV AH,2 ;đoạn lệnh xuất từng ký tự </li></ul><ul><li>MOV DL,BL </li></ul><ul><li>INT 21H </li></ul><ul><li>INC BL </li></ul><ul><li>LOOP HIENTHI_ </li></ul><ul><li>ENDFOR_: </li></ul>
    45. 45. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><ul><li>Cấu trúc vòng lặp với số lần không xác định: sử dụng phép so sánh và các lệnh nhảy (có điều kiện và không điều kiện) để thực hiện. Có hai dạng cấu trúc tổng quát như sau </li></ul></ul><ul><ul><ul><li>Kiểm tra điều kiện trước: WHILE <Điều kiện> DO <Công việc> </li></ul></ul></ul>
    46. 46. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><li>Ví dụ: Đếm số ký tự đọc được từ bàn phím lưu vào CX, khi gặp phím ‘ENTER’ thì dừng. </li></ul><ul><li>Đoạn chương trình như sau: </li></ul><ul><li>MOV CX,-1 ;Chứa số ký tự đếm được </li></ul><ul><li>MOV AL,’$’ ;Để AL khác ký tự ‘Enter’ </li></ul><ul><li>WHILE_: </li></ul><ul><li>CMP AL,0DH ;Có khác ký tự CR không? </li></ul><ul><li>JE ENDWHILE_ ; Là ‘enter’ thì kết thúc </li></ul><ul><li>INC CX ;Không phải ‘enter’ thì tiếp tục </li></ul><ul><li>MOV AH,1 </li></ul><ul><li>INT 21H </li></ul><ul><li>JMP WHILE_ </li></ul><ul><li>ENDWHILE_: </li></ul>
    47. 47. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><ul><li>Cấu trúc vòng lặp với số lần không xác định: sử dụng phép so sánh và các lệnh nhảy (có điều kiện và không điều kiện) để thực hiện. Có hai dạng cấu trúc tổng quát như sau </li></ul></ul><ul><ul><ul><li>Kiểm tra điều kiện sau: </li></ul></ul></ul><ul><ul><ul><li>REPEAT <Công việc> UNTIL <Điều kiện> </li></ul></ul></ul>
    48. 48. Các lệnh điều khiển của x86 <ul><li>Các đoạn lệnh có cấu trúc: </li></ul><ul><li>Ví dụ: Đếm số ký tự đọc được từ bàn phím lưu vào CX, khi gặp phím ‘ENTER’ thì dừng. </li></ul><ul><li>Đoạn chương trình như sau: </li></ul><ul><li>MOV CX,0 ;Chứa số ký tự đếm được </li></ul><ul><li>REPEAT_: </li></ul><ul><li>MOV AH,1 </li></ul><ul><li>INT 21H </li></ul><ul><li>CMP AL,0DH ;Kiểm tra có phải phím enter? </li></ul><ul><li>JE UNTIL_ ;phím ‘enter’ thì nhảy </li></ul><ul><li>INC CX ;không phải ‘enter’ thì tiếp tục đếm </li></ul><ul><li>JMP REPEAT_ </li></ul><ul><li>UNTIL_: </li></ul>
    49. 49. Ngăn xếp Ngăn xếp là vùng chứa dữ liệu tạm thời trong khi hoạt động của chương trình <ul><li>Ngăn xếp: </li></ul><ul><ul><li>Mục đích: chứa dữ liệu tạm thời trong khi hoạt động và được đặt ở đầu một đoạn ô nhớ </li></ul></ul><ul><ul><li>Nguyên tắc hoạt động: Dữ liệu vào trước sẽ ra sau. Hai thanh ghi SS:SP luôn chỉ đến đỉnh ngăn xếp. Khi ngăn xếp đầy thì SP = 0 </li></ul></ul>
    50. 50. Ngăn xếp <ul><li>Ngăn xếp: </li></ul><ul><ul><li>Cách khai báo ngăn xếp: </li></ul></ul><ul><ul><li>Các sử dụng: </li></ul></ul><ul><ul><ul><li>Cất dữ liệu vào ngăn xếp: </li></ul></ul></ul><ul><ul><ul><ul><li>PUSH <dữ liệu 16bit> ;cất dữ liệu có độ dài 16bit </li></ul></ul></ul></ul><ul><ul><ul><ul><li>PUSHA ;cất các thanh ghi AX, CX, DX, BX, SP, BP, SI, DI </li></ul></ul></ul></ul><ul><ul><ul><ul><li>PUSHF ;cất trạng thái các cờ </li></ul></ul></ul></ul><ul><ul><ul><li>Lấy dữ liệu ra từ ngăn xếp: </li></ul></ul></ul><ul><ul><ul><ul><li>POP <dữ liệu 16bit> ;lấy dữ liệu có độ dài 16bit </li></ul></ul></ul></ul><ul><ul><ul><ul><li>POPA ;lấy các thanh ghi AX, CX, DX, BX, SP, BP, SI, DI </li></ul></ul></ul></ul><ul><ul><ul><ul><li>POPF ;lấy trạng thái các cờ </li></ul></ul></ul></ul>
    51. 51. Chương trình con Chương trình con là một phần tách riêng của chương trình chính nhằm thực hiện một công việc cụ thể. Gồm hai dạng là thủ tục (Procedue) và hàm (Function). <ul><li>Thủ tục: </li></ul><ul><ul><li>Mục đích: dùng để thực hiện một công việc xác định, không có kết quả trả về </li></ul></ul><ul><ul><li>Cách sử dụng: </li></ul></ul><ul><ul><ul><li>Để gọi một chương trình con:lệnh CALL <tên chương trình con> </li></ul></ul></ul><ul><ul><ul><li>Để quay về chương trình chính: lệnh RET </li></ul></ul></ul><ul><ul><li>Khai báo chương trình con: </li></ul></ul><ul><ul><ul><li><tên chương trình con> Proc </li></ul></ul></ul><ul><ul><ul><li>;… mã lệnh của chương trình con … </li></ul></ul></ul><ul><ul><ul><li><tên chương trình con> EndP </li></ul></ul></ul>
    52. 52. Chương trình con
    53. 53. Chương trình con <ul><li>Hàm: </li></ul><ul><ul><li>Mục đích: dùng để thực hiện một công việc xác định và có kết quả trả về </li></ul></ul><ul><ul><li>Cách sử dụng: tương tự như thủ tục. Tuy nhiên để truyền các tham số cho chương trình con hoặc nhận kết quả trả về thì thực hiện thông qua thanh ghi, ô nhớ hoặc các biến, mảng đã được định nghĩa trước. </li></ul></ul><ul><ul><li>Lưu ý: </li></ul></ul><ul><ul><li>Khi thực hiện chương trình con, cần cất giữ nội dung các thanh ghi hiện tại vào ngăn xếp và khôi phục lại sau khi trở về chương trình chính bằng các lệnh PUSH/POP </li></ul></ul><ul><ul><li>Nên có chú thích cụ thể về một chương trình con (ví dụ: Mục đích, các tham số vào ra, cách sử dụng…) </li></ul></ul>
    54. 54. Câu hỏi bài tập <ul><li>Cho đoạn khai báo ngăn xếp sau: </li></ul><ul><li>Con trỏ ngăn xếp SP có giá trị bao nhiêu (hệ Hexa) </li></ul><ul><li>Ngăn xếp chứa được bao nhiêu từ </li></ul><ul><li>Cho AX=1234h, BX=5678h, CX=9ABCh và SP=1000h. Cho biết nội dung các thanh ghi AX, BX, CX và SP sau khi thực hiện đoạn lệnh: </li></ul>
    55. 55. Câu hỏi bài tập <ul><li>Khi cất thêm dữ liệu vào bộ đệm đã bị đầy (SP = 0) thì chương trình sẽ hoạt động như thề nào, cho ví dụ minh họa. </li></ul><ul><li>Thực hiện các bài tập trong “Giáo trình bài tập Kiến trúc máy tính” </li></ul>
    56. 56. TÓM L ƯỢ C BÀI HỌC <ul><li>Assembly là ngôn ngữ lập trình cấp thấp dùng các từ gợi nhớ thay cho các mã lệnh phức tạp của vi xử lý </li></ul><ul><li>Mỗi loại vi xử lý có một (hoặc nhiều) tập lệnh </li></ul><ul><li>Một chương trình hợp ngữ gồm các phần: khai báo biến, bộ nhớ đệm, chương trình chính và các chương trình con (nếu có) </li></ul><ul><li>Kết luận </li></ul><ul><ul><li>Ngôn ngữ assembly (hợp ngữ) phụ thuộc vào kiến trúc của CPU </li></ul></ul><ul><ul><li>Chương trình viết bằng hợp ngữ tương tác trực tiếp đến vi xử lý và có tốc độ thực thi nhanh. </li></ul></ul><ul><ul><li>Có thể kết hợp giữa hợp ngữ và lập trình ngôn ngữ cấp cao giúp chương trình linh hoạt hơn. </li></ul></ul>
    57. 57. HỎI - ĐÁP
    58. 58. THE - END Thank You !

    ×