chương 3: lập trình assembly
DESCRIPTION
3. 3. Khung Chương trình Assembly. III. I. Biên soạn và dịch chương trình Assembly. II. Chương 3: Lập trình Assembly. 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 - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/1.jpg)
Chương 3: Lập trình Assembly
Biên soạn và dịch chương trình AssemblyII
Khung Chương trình Assembly 3I
Thực hiện cấu trúc điều khiển chương trình bằng assembly3III
![Page 2: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/2.jpg)
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
![Page 3: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/3.jpg)
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
![Page 4: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/4.jpg)
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.
I. Khung Chương trình Assembly
Mov đích, nguồnPush toán hạngpushf
![Page 5: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/5.jpg)
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, chữ số và một số0 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ự.
I. Khung Chương trình Assembly
![Page 6: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/6.jpg)
I. Khung Chương trình Assembly
4. Cấu trúc một lệnh assembly
Dòng lệnh
Lệnh giả
Không được dịch ra mã máy
Lệnh thật
Được dịch ra mã máy
Tên: Mã lệnh Các toán hạng ;Chú giải
![Page 7: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/7.jpg)
4. Cấu trúc một lệnh assembly
LAP: MOV AH,[BX] ; Copy nội dung của ô nhớ có địa chỉ DS:BX vào AH
VD2: MAIN PROCvà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.
VD1:
I. Khung Chương trình Assembly
![Page 8: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/8.jpg)
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
5.Các dạng hằng dùng trong assembly
![Page 9: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/9.jpg)
6. Khai báo biến và hằng
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ự
a) Khai báo biến
![Page 10: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/10.jpg)
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
![Page 11: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/11.jpg)
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
![Page 12: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/12.jpg)
• 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
![Page 13: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/13.jpg)
• Khai báo biến kiểu MẢNG
Tên biến mảng DB/DW/DD Các giá trị khởi đầuVí dụ: M1 DB 4,5,6,7,8,9• 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
![Page 14: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/14.jpg)
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
![Page 15: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/15.jpg)
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
![Page 16: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/16.jpg)
6. Khai báo biến và hằngKhai 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 0DhLF EQU 0AhCHAO 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.
![Page 17: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/17.jpg)
7. Khung chương trình assembly
Khai báo quy mô sử dụng bộ nhớ
4
3
2
1
Khai báo đoạn ngăn xếp
Khai báo đoạn dữ liệu
Khai báo đoạn mã
![Page 18: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/18.jpg)
Khai báo quy mô sử dụng bộ nhớ
.MODEL Kiểu_kích_thước_bộ_nhớ
![Page 19: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/19.jpg)
7.Khung chương trình assembly
Khai báo quy mô sử dụng bộ nhớ
4
3
2
1
Khai báo đoạn ngăn xếp
Khai báo đoạn dữ liệu
Khai báo đoạn mã
![Page 20: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/20.jpg)
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
![Page 21: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/21.jpg)
7.Khung chương trình assembly
Khai báo quy mô sử dụng bộ nhớ
4
3
2
1
Khai báo đoạn ngăn xếp
Khai báo đoạn dữ liệu
Khai báo đoạn mã
![Page 22: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/22.jpg)
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ụ:.DATAMSG DB ‘Hello!$’B1 DB 100CR EQU 0DH ; Quay về đầu dòngLF EQU 0AH ; Xuống dòng
![Page 23: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/23.jpg)
Khai báo đoạn mã .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 ở đâyTên_CTCon PROC
;Các lệnh của chương trình conRET ;Trở về
Tên_CTCon ENDP
VD
![Page 24: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/24.jpg)
Khung chương trình Assembly để dịch ra chương trình .exe
. .MODEL SMALL.STACK 100H.DATA
;Các khai báo biến và hằng để tại đây.CODEMAIN PROC
;Khởi đầu cho đoạn DSMOV AX,@DATAMOV DS,AX;Các lệnh của chương trình để tại đây
......;Trở về DOS dùng hàm 4CH của INT 21HMOV AH,4CHINT 21H
MAIN ENDP;Các chương trình con (nếu có) khai báo tại đâyEND MAIN ;Kết thúc toàn bộ chương trình
VD
![Page 25: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/25.jpg)
Khung chương trình Assembly để dịch ra chương trình .com
.
.MODEL TINY
.CODEORG 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ệuSTART: JMP CONTINUE.
;Các khai báo biến và hằng để tại đâyCONTINUE:MAIN PROC
;Các lệnh của chương trình chính để tại đây;Trở về DOSINT 20H
MAIN ENDP;Các chương trình con (nếu có) khai báo ở đâyEND START
VD
![Page 26: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/26.jpg)
• 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
Các lệnh vào ra
![Page 27: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/27.jpg)
Hàm 1: Vào một kí tựInput AH=1Ra 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,1INT 21h
Các lệnh vào ra
![Page 28: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/28.jpg)
Vd: Nhập vào 2 số: Al, BL sau đó đảo giá trị cho nhau
MOV AH,1INT 21HMOV BL,AL
MOV AH,1INT 21H
XCHG AL,BL
Các lệnh vào ra
Nhập x
Nhập y
Đảo giá trị
![Page 29: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/29.jpg)
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ểnOutput: Giá trị của DL
Ví dụ: sau sẽ hiển thị dấu “?” lên màn hìnhMOV AH,2MOV DL,”?”INT 21h
Các lệnh vào ra
![Page 30: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/30.jpg)
Hàm 9: Hiển thị một chuỗi kí tựInput: AH=9 DX=Địa chỉ tương đỗi của chuỗiOutput: 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
Các lệnh vào ra
![Page 31: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/31.jpg)
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 21HVd: Viết chương trình hiển thị một chuỗi kí tự bất kì
Các lệnh vào ra
![Page 32: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/32.jpg)
Chương 3: Lập trình Assembly
Biên soạn và dịch chương trình AssemblyII
Khung Chương trình Assembly 3I
Thực hiện cấu trúc điều khiển chương trình bằng assembly3III
![Page 33: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/33.jpg)
II. Biên soạn và dịch chương trình Assembly.
![Page 34: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/34.jpg)
II. Biên soạn và dịch chương trình Assembly.
Trở về thư mục gôc C:\
![Page 35: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/35.jpg)
Truy nhập vào thư mục MASM
II. Biên soạn và dịch chương trình Assembly.
![Page 36: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/36.jpg)
Dịch chương trình sang mã máy
II. Biên soạn và dịch chương trình Assembly.
![Page 37: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/37.jpg)
Liên kết các tệp đuôi .OBJ để tạo thành một tệp chương trình chạy được đuôi .EXE
II. Biên soạn và dịch chương trình Assembly.
![Page 38: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/38.jpg)
II. Biên soạn và dịch chương trình Assembly.
Chạy chương trình
![Page 39: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/39.jpg)
Chương 3: Lập trình Assembly
Biên soạn và dịch chương trình AssemblyII
Khung Chương trình Assembly 3I
Thực hiện cấu trúc điều khiển chương trình bằng assembly3III
![Page 40: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/40.jpg)
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
=> sử dụng các lệnh nhảy và lệnh lặp của bộ vi xử lý. Cụ thể như sau:
III. Thực hiện các cấu trúc điều khiển chương trình bằng assembly
![Page 41: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/41.jpg)
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
![Page 42: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/42.jpg)
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
VD2: 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.
Cấu trúc rẽ nhánh IF-THEN
![Page 43: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/43.jpg)
Cấu trúc lựa chon CASECASE <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
Cấu trúc lựa chon CASE
![Page 44: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/44.jpg)
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.
III. Thực hiện các cấu trúc điều khiển chương trình bằng assembly
![Page 45: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/45.jpg)
FOR <Số lần lặp> DO<Công việc>
ENDFOR
Cấu trúc lặp với số lần xác định FOR-DO
Đưa số lần lặp vào bộ đếm
Công việc
Giảm bộ đếm đi 1
Bộ đếm = 0?
Đúng
Sai
![Page 46: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/46.jpg)
VD: Hiện thị một dòng 80 ký tự ‘$’
MOV CX,80
FOR_:
MOV AH,2
MOV DL,’$’
INT 21H
LOOP FOR_
ENDFOR_:
Cấu trúc lặp với số lần xác định FOR-DO
Cx=80
Công việc
Cx=cx-1
cx = 0?
Đúng
Sai
![Page 47: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/47.jpg)
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
JCXZ ENDFOR_
FOR_: MOV DL,’$’
INT 21H
LOOP FOR_
ENDFOR_:
Cấu trúc lặp với số lần xác định FOR-DO
![Page 48: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/48.jpg)
Kiểm tra điều kiện trước
Cấu trúc lặp với số lần không xác định
Pascal Assembly
WHILE <Điều kiện> DO
<Công việc>
WHILE <Điều kiện> <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
![Page 49: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/49.jpg)
Cấu trúc lặp với số lần không xác định
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
![Page 50: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/50.jpg)
Chương 3: Lập trình Assembly
Biên soạn và dịch chương trình AssemblyII
Khung Chương trình Assembly 3I
Thực hiện cấu trúc điều khiển chương trình bằng assembly3III
![Page 51: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/51.jpg)
Vào ra với số nhị phân
Nhập các số nhị phânNhập các số nhị phân từ bàn phím kết thúc bằng cách
nhấn phím Enter. Các số nhận được ở dạng chuỗi các chữ số 0 và 1. Mỗi kí tự được nhập phải đổi ra giá trị của từng bit
rồi kết hợp các bit vào trong thanh ghi, kết qủa lưu trong BX
![Page 52: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/52.jpg)
Thuật toán nhập số nhị phân
Xoá BX ;BX lưu kết quả
Nhập một kí tự ;’0’ hoặc ‘1’
While kí tự <> CR DoĐổi kí tự ra giá trị số nhị phân
Dịch trái BX
Chèn giá trị nhận được vào bit lsb của BX
Nhập kí tự
End_while
![Page 53: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/53.jpg)
Ví dụ: Biểu diễn với việc nhập 101 Xoá BX
BX=0000 0000 0000 0000 Nhập vào kí tự ‘1’ đổi nó thành 1 Dịch trái BX
BX=0000 0000 0000 0000 Chèn giá trị nhị phân nhận được vào bit lsb của BX
BX=0000 0000 0000 0001 Nhập kí tự ‘0’ đổi nó thành 0 Dịch trái BX
BX=0000 0000 0000 0010 Chèn giá trị nhị phân nhận được vào bit lsb của BX
BX=0000 0000 0000 0010 Nhập kí tự ‘1’ đổi nó thanh 1 Dịch trái BX
BX=0000 0000 0000 0100 Chèn giá trị nhị phân nhận được vào bit lsb của BX
BX=0000 0000 0000 0101 BX chứa 101B
![Page 54: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/54.jpg)
Thuật toán hiện số nhị phân
For 16 lần DoQuay trái BX ; BX chứa giá trị cần đưa ra, bit msb đưa vào CF
If CF=1 Then
Đưa ra ‘1’
Else
Đưa ra ‘0’
End_if
End_for
![Page 55: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/55.jpg)
Ví dụ: Biểu diễn với việc hiện 101
Học sinh tự làm
![Page 56: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/56.jpg)
Nhập và hiện số hex
Nhập số HEX Nhập số hex bao gồm các chữ số ‘0’ đến ‘9’
và các chữ cái từ ‘A’ đến ‘Z’ kết thúc bằng kí tự CR.
Giả thiết Chỉ sử dụng các chữ hoa Chỉ nhập vào tối đa 4 chữ số hex
![Page 57: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/57.jpg)
Thuật toán nhập số hex
Xoá BX ;BX chứa giá trị nhập vào
Nhập kí tự hex
While kí tự <> CR DoĐổi kí tự ra số nhị phân
Dịch trái BX 4 lần
Chèn giá trị mới vào 4 bit của BX
Nhập kí tự
End_While
![Page 58: Chương 3: Lập trình Assembly](https://reader033.vdocuments.pub/reader033/viewer/2022061511/56813b47550346895da42cf0/html5/thumbnails/58.jpg)
Thuật toán hiện số hex
BX chứa số 16 bit bằng giá trị của số hex 4 chữ số. Để đưa ra nội dung của BX, bắt đầu từ bên trái, lấy ra từng nhóm bit của mỗi chữ số đổi nó thành chữ số hex tương ứng sau đó đưa ra
For 4 lần DoChuyển BH vào DLDịch DL về bên phải 4 lầnIf DL<10 then
Đổi thành một trong các kí tự “0”.. ”9”Else
Đổi thành một trong các chữ cái “A” … “F”Đưa kí tự ra Quay BX 4 lần về bên trái
End_For