LẬP TRÌNH VỚI HỢP NGỮ
Gv: Lê Minh Triết Gv: Lê Minh Triết
Phần 1:
Quy trình tạo và chạy chương trình Quy trình tạo và chạy chương trình
Bộ hợp dịch ASM có hai trình cơ bản là Bộ hợp dịch ASM có hai trình cơ bản là
TASM.EXE (trình hợp dịch) TASM.EXE (trình hợp dịch) TLINK.EXE (trình liên kết) TLINK.EXE (trình liên kết)
Ngoài ra ta còn cần một chương trình Ngoài ra ta còn cần một chương trình dùng để soạn thảo để tạo chương trình dùng để soạn thảo để tạo chương trình nguồn. nguồn.
! Ta có thể dùng bộ chương trình BorlandC ! Ta có thể dùng bộ chương trình BorlandC
để soạn thảo chương trình nguồn. để soạn thảo chương trình nguồn.
Biên soạn: Lê Minh Triết
Các bước tiến hành lập trình Các bước tiến hành lập trình
Soạn thảo chương trình nguồn Soạn thảo chương trình nguồn
Dùng trình hợp dịch TASM.EXE Dùng trình hợp dịch TASM.EXE
Dùng trình liên kết TLINK.EXE Dùng trình liên kết TLINK.EXE
Thực thi chương trình Thực thi chương trình
Kết quả Kết quả
Biên soạn: Lê Minh Triết
Các bước cài đặt và tạo đường Các bước cài đặt và tạo đường dẫn File biên dịch dẫn File biên dịch
1. Chạy file Install.exe trong thư mục 1. Chạy file Install.exe trong thư mục
BorlandC (BC) BorlandC (BC)
2. Nhấn nút Enter để bắt đầu cài đặt 2. Nhấn nút Enter để bắt đầu cài đặt
Biên soạn: Lê Minh Triết
Các bước cài đặt và tạo đường Các bước cài đặt và tạo đường dẫn File biên dịch dẫn File biên dịch
3. Chọn lại ổ đĩa chứa các tập tin cài đặt 3. Chọn lại ổ đĩa chứa các tập tin cài đặt
Biên soạn: Lê Minh Triết
Các bước cài đặt và tạo đường Các bước cài đặt và tạo đường dẫn File biên dịch dẫn File biên dịch
Kiểm tra đường dẫn chứa các tập tin cài đặt Kiểm tra đường dẫn chứa các tập tin cài đặt
Biên soạn: Lê Minh Triết
Các bước cài đặt và tạo đường Các bước cài đặt và tạo đường dẫn File biên dịch dẫn File biên dịch
4. Sửa lại thư mục cài đặt (nhấn Enter) 4. Sửa lại thư mục cài đặt (nhấn Enter)
Biên soạn: Lê Minh Triết
Các bước cài đặt và tạo đường Các bước cài đặt và tạo đường dẫn File biên dịch dẫn File biên dịch
E:\BorlandC sửa lại là C:\BC hay C:\BorlandC E:\BorlandC sửa lại là C:\BC hay C:\BorlandC
Biên soạn: Lê Minh Triết
Các bước cài đặt và tạo đường Các bước cài đặt và tạo đường dẫn File biên dịch dẫn File biên dịch
Sau khi sửa xong, nhấn ESC để thoát khỏi Sau khi sửa xong, nhấn ESC để thoát khỏi
màn hình chỉnh sửa đường dẫn. màn hình chỉnh sửa đường dẫn.
Chọn Start Installation để bắt đầu cài đặt. Chọn Start Installation để bắt đầu cài đặt.
Biên soạn: Lê Minh Triết
Các bước cài đặt và tạo đường Các bước cài đặt và tạo đường dẫn File biên dịch dẫn File biên dịch
Khi cài đặt có 1 vài file bị lỗi, ta nhấn nút Khi cài đặt có 1 vài file bị lỗi, ta nhấn nút
C để tiếp tục C để tiếp tục
Biên soạn: Lê Minh Triết
Các bước cài đặt và tạo đường Các bước cài đặt và tạo đường dẫn File biên dịch dẫn File biên dịch
Nhấn 1 nút bất kỳ để tiếp tục Nhấn 1 nút bất kỳ để tiếp tục
– ESC để tắt màn hình. – ESC để tắt màn hình. Chú ý tạo đường dẫn (PATH) Chú ý tạo đường dẫn (PATH)
Biên soạn: Lê Minh Triết
Tạo file đường dẫn Path Tạo file đường dẫn Path
Tạo 01 file *.bat trong ổ đĩa C:\ Tạo 01 file *.bat trong ổ đĩa C:\ (hay ổ đĩa đã cài đặt BorlandC) (hay ổ đĩa đã cài đặt BorlandC)
Biên soạn: Lê Minh Triết
Các bước tiến hành lập trình Các bước tiến hành lập trình
1. Chạy cửa sổ Run 1. Chạy cửa sổ Run 2. Gõ lệnh CMD 2. Gõ lệnh CMD 3. CD\ 3. CD\ 4. Chạy File P.bat 4. Chạy File P.bat 5. Chạy chương trình soạn thảo BC.EXE 5. Chạy chương trình soạn thảo BC.EXE 6. Soạn nội dung chương trình nguồn 6. Soạn nội dung chương trình nguồn
Lưu lại File với đuôi *.asm Lưu lại File với đuôi *.asm
7. 7. 8. Thoát khỏi BorlandC 8. Thoát khỏi BorlandC 9. Chạy chương trình hợp dịch TASM.EXE 9. Chạy chương trình hợp dịch TASM.EXE 10. Chạy trình liên kết TLINK.EXE 10. Chạy trình liên kết TLINK.EXE 11. Thực thi chương trình. 11. Thực thi chương trình.
Biên soạn: Lê Minh Triết
Ví dụ: Soạn chương trình Hello Ví dụ: Soạn chương trình Hello
Soạn tập tin Hello.asm Soạn tập tin Hello.asm
Khai báo dữ liệu bắt đầu bằng .Data
Khai báo đoạn mã chương trình bắt đầu bằng .Code
Biên soạn: Lê Minh Triết
Ví dụ: Dịch chương trình Hello Ví dụ: Dịch chương trình Hello
Gõ lệnh Tasm Hello.asm Gõ lệnh Tasm Hello.asm
Thông báo số lỗi
Biên soạn: Lê Minh Triết
Ví dụ: Dịch chương trình Hello Ví dụ: Dịch chương trình Hello
Gõ lệnh Tasm Hello.asm Gõ lệnh Tasm Hello.asm
Thông báo số lỗi
Gõ tiếp lệnh Tlink Hello.obj Gõ tiếp lệnh Tlink Hello.obj Chương trình sẽ tạo ra file Hello.exe Chương trình sẽ tạo ra file Hello.exe
Biên soạn: Lê Minh Triết
Phần 2:
TỔ CHỨC THANH GHI TỔ CHỨC THANH GHI
Thanh ghi (register) là nơi lưu dữ liệu bên Thanh ghi (register) là nơi lưu dữ liệu bên
trong CPU trong CPU Tùy theo độ dài 8 hay 16 bit và tùy theo Tùy theo độ dài 8 hay 16 bit và tùy theo chức năng khi đó thanh ghi được dùng để chức năng khi đó thanh ghi được dùng để chứa dữ liệu sẽ thao tác hoặc kết quả các chứa dữ liệu sẽ thao tác hoặc kết quả các phép tính hoặc các địa chỉ dùng để định vị ô phép tính hoặc các địa chỉ dùng để định vị ô nhớ khi cần thiết. nhớ khi cần thiết.
Có tất cả 14 thanh ghi, mỗi thanh ghi dài 16 Có tất cả 14 thanh ghi, mỗi thanh ghi dài 16
bit chia thành năm nhóm bit chia thành năm nhóm
Biên soạn: Lê Minh Triết
1. Nhóm thanh ghi đoạn 1. Nhóm thanh ghi đoạn (segment register) (segment register)
Gồm 4 thanh ghi: đoạn mã CS, đoạn dữ liệu DS, đoạn bổ Gồm 4 thanh ghi: đoạn mã CS, đoạn dữ liệu DS, đoạn bổ sung ES và đoạn stack SS. Là những thanh ghi chứa địa chỉ sung ES và đoạn stack SS. Là những thanh ghi chứa địa chỉ segment của các ô nhớ khi cần truy xuất. segment của các ô nhớ khi cần truy xuất.
Thanh ghi đoạn mã CS (Code Segment): Lưu địa chỉ Thanh ghi đoạn mã CS (Code Segment): Lưu địa chỉ segment chứa chương trình ngôn ngữ máy. segment chứa chương trình ngôn ngữ máy. Thanh ghi đoạn dữ liệu DS (Data Segment): Lưu địa chỉ Thanh ghi đoạn dữ liệu DS (Data Segment): Lưu địa chỉ segment của đoạn chứa dữ liệu trong chương trình. segment của đoạn chứa dữ liệu trong chương trình. Thanh ghi đoạn bổ sung ES (Extra Segment): Lưu địa chỉ Thanh ghi đoạn bổ sung ES (Extra Segment): Lưu địa chỉ segment của đoạn dữ liệu bổ sung. segment của đoạn dữ liệu bổ sung. Thanh ghi đoạn Stack SS (Stack Segment): Lưu địa chỉ Thanh ghi đoạn Stack SS (Stack Segment): Lưu địa chỉ segment của đoạn stack. segment của đoạn stack.
4 thanh ghi này có thể truy xuất dữ liệu trên 4 đoạn khác 4 thanh ghi này có thể truy xuất dữ liệu trên 4 đoạn khác nhau và 1 chương trình chỉ có thể sử dụng cùng một lúc tối nhau và 1 chương trình chỉ có thể sử dụng cùng một lúc tối đa 4 đoạn. đa 4 đoạn. CPU 80386 có 2 thanh ghi tương tự như ES là FS và GS. CPU 80386 có 2 thanh ghi tương tự như ES là FS và GS.
Biên soạn: Lê Minh Triết
2. Nhóm thanh ghi đa dụng 2. Nhóm thanh ghi đa dụng
(general register) (general register)
Gồm bốn thanh ghi AX, BX, CX, DX. Các thanh Gồm bốn thanh ghi AX, BX, CX, DX. Các thanh ghi này có thể xem như một thanh ghi 16 bit ghi này có thể xem như một thanh ghi 16 bit hoặc hai thanh ghi nhỏ: hoặc hai thanh ghi nhỏ:
AX = AH + AL AX = AH + AL
BX = BH + BL BX = BH + BL
CX = CH + CL CX = CH + CL
DX = DH + DL DX = DH + DL
CPU 80386 có thể kéo dài đến 32 bit tạo CPU 80386 có thể kéo dài đến 32 bit tạo thành thanh ghi EAX, EBX, ECX, EDX. thành thanh ghi EAX, EBX, ECX, EDX.
Biên soạn: Lê Minh Triết
Thanh ghi tích lũy AX (Accumulator register): thường Thanh ghi tích lũy AX (Accumulator register): thường dùng để lưu số nhân, số chia trong các phép toán nhân, chia, dùng để lưu số nhân, số chia trong các phép toán nhân, chia, các phép tính số học, logic và chuyển dữ liệu. các phép tính số học, logic và chuyển dữ liệu. VD: MUL BH VD: MUL BH
; AX ← AL*BH ; AX ← AL*BH
Thanh ghi cơ sở BX (Base register): thường dùng để Thanh ghi cơ sở BX (Base register): thường dùng để
định vị bộ nhớ. định vị bộ nhớ. VD: MOV [BX], AX ; Lấy nội dung thanh ghi AX đưa vào ô nhớ VD: MOV [BX], AX ; Lấy nội dung thanh ghi AX đưa vào ô nhớ
; có địa chỉ segment là DS và địa chỉ offset BX. ; có địa chỉ segment là DS và địa chỉ offset BX. Thanh ghi đếm CX (Count register): dùng để định số lần Thanh ghi đếm CX (Count register): dùng để định số lần
lặp của vòng lặp. lặp của vòng lặp.
Thanh ghi dữ liệu DX (Data register): dùng để lưu kết Thanh ghi dữ liệu DX (Data register): dùng để lưu kết quả của các phép toán nhân và chia, định địa chỉ cổng trong quả của các phép toán nhân và chia, định địa chỉ cổng trong các lệnh nhập xuất cổng. các lệnh nhập xuất cổng. VD: MOV AL, 62 VD: MOV AL, 62
; AL ← 62 ; AL ← 62
; Đưa nội dung của AL (tức 62) ra cổng 1000 ; Đưa nội dung của AL (tức 62) ra cổng 1000
MOV DX, 1000 ; DX ← 1000 MOV DX, 1000 ; DX ← 1000 OUT DX, AL OUT DX, AL
Biên soạn: Lê Minh Triết
Phần 3:
1. Cú pháp lệnh hợp ngữ 1. Cú pháp lệnh hợp ngữ
Một chương trình hợp ngữ gồm các Statement (mệnh đề) Một chương trình hợp ngữ gồm các Statement (mệnh đề) được viết liên tiếp nhau , mỗi Statement được viết trên 1 được viết liên tiếp nhau , mỗi Statement được viết trên 1 dòng. Một Statement có thể là: dòng. Một Statement có thể là: 1 lệnh (Instruction) : được chuyển thành mã máy. 1 lệnh (Instruction) : được chuyển thành mã máy. 1 chỉ dẫn (Assembler directive) : không chuyển thành 1 chỉ dẫn (Assembler directive) : không chuyển thành
mã máy mã máy
Các lệnh gồm 4 trường : Các lệnh gồm 4 trường :
Operation Operation
Operand(s) Comment Operand(s) Comment
Name Name Các trường cách nhau ít nhất 1 khoảng trắng hoặc 1 TAB Các trường cách nhau ít nhất 1 khoảng trắng hoặc 1 TAB ; khơỉ tạo thanh ghi CX ; khơỉ tạo thanh ghi CX Ví dụ: START : MOV CX,5 Ví dụ: START : MOV CX,5
Hay một chỉ dẫn của ASM : Hay một chỉ dẫn của ASM :
Ví dụ: MAIN Ví dụ: MAIN
PROC ; tạo một thủ tục có tên là MAIN PROC ; tạo một thủ tục có tên là MAIN
Biên soạn: Lê Minh Triết
1.1 Trường Tên 1.1 Trường Tên
(Name Field) (Name Field)
Trường tên dùng cho nhãn lệnh, tên thủ tục và tên biến. Trường tên dùng cho nhãn lệnh, tên thủ tục và tên biến.
ASM sẽ chuyển tên thành địa chỉ bộ nhớ . ASM sẽ chuyển tên thành địa chỉ bộ nhớ . Tên có thể dài từ 1 đến 31 ký tự . Tên có thể dài từ 1 đến 31 ký tự . Trong tên chứa các ký tự từ a-z, các số và các ký tự đặc biệt sau: Trong tên chứa các ký tự từ a-z, các số và các ký tự đặc biệt sau:
? ,@ , _ , $ và dấu. ? ,@ , _ , $ và dấu.
Không được phép có ký tự trống trong phần tên. Không được phép có ký tự trống trong phần tên. Tên không được bắt đầu bằng một số . Tên không được bắt đầu bằng một số . ASM không phân biệt giữa ký tự viết thường và viết hoa . ASM không phân biệt giữa ký tự viết thường và viết hoa . Các ví dụ về tên hợp lệ và không hợp lệ trong ASM. Các ví dụ về tên hợp lệ và không hợp lệ trong ASM.
Tên hợp lệ Tên hợp lệ COUNTER1 COUNTER1 @CHARACTER @CHARACTER SUM_OF_DIGITS SUM_OF_DIGITS DONE? DONE? .TEST .TEST
Tên không hợp lệ Tên không hợp lệ TWO WORDS TWO WORDS 2ABC 2ABC A45.28 A45.28 YOU&ME YOU&ME ADD-REPEAT ADD-REPEAT
Biên soạn: Lê Minh Triết
1.2 Trường toán tử 1.2 Trường toán tử
( operation field) ( operation field)
Đối với 1 lệnh trường toán tử chưá ký hiệu (Symbol) Đối với 1 lệnh trường toán tử chưá ký hiệu (Symbol) của phép toán (Operation code = OPCODE). ASM sẽ của phép toán (Operation code = OPCODE). ASM sẽ chuyển ký hiệu phép toán thành mã máy . chuyển ký hiệu phép toán thành mã máy .
Thông thường ký hiệu mã phép toán mô tả chức Thông thường ký hiệu mã phép toán mô tả chức năng của phép toán. Ví dụ: ADD, SUB, INC, DEC, năng của phép toán. Ví dụ: ADD, SUB, INC, DEC, INT... INT...
Đối với chỉ dẫn của ASM, trường toán tử chưá một Đối với chỉ dẫn của ASM, trường toán tử chưá một opcode giả (pseudo operation code = pseudo-op). opcode giả (pseudo operation code = pseudo-op). ASM không chuyển pseudo-op thành mã máy mà ASM không chuyển pseudo-op thành mã máy mà hướng dẫn ASM thực hiện một việc gì đó ví dụ tạo hướng dẫn ASM thực hiện một việc gì đó ví dụ tạo ra một thủ tục, định nghĩa các biến ... ra một thủ tục, định nghĩa các biến ...
Biên soạn: Lê Minh Triết
1.3 Trường các toán hạng 1.3 Trường các toán hạng (Operand(s) field) (Operand(s) field)
Trong 1 lệnh, trường toán hạng chỉ ra các số liệu tham gia Trong 1 lệnh, trường toán hạng chỉ ra các số liệu tham gia
trong lệnh đó. trong lệnh đó.
1 lệnh có thể không có toán hạng , có 1 hoặc 2 toán hạng . 1 lệnh có thể không có toán hạng , có 1 hoặc 2 toán hạng .
AX AX WORD1,2 WORD1,2
Ví dụ: NOP Ví dụ: NOP INC INC ADD ADD
; không có toán hạng ; không có toán hạng ; 1 toán hạng ; 1 toán hạng ; 2 toán hạng, ; 2 toán hạng, ;cộng 2 với nội dung của từ nhớ WORD1 ;cộng 2 với nội dung của từ nhớ WORD1 Trong các lệnh 2 toán hạng toán hạng đầu là toán hạng Trong các lệnh 2 toán hạng toán hạng đầu là toán hạng đích (destination operand). Toán hạng đích thường là thường là đích (destination operand). Toán hạng đích thanh ghi hoặc vị trí nhớ dùng để lưu trữ kết quả. Toán thanh ghi hoặc vị trí nhớ dùng để lưu trữ kết quả. Toán hạng thứ hai là toán hạng nguồn. Toán hạng nguồn là toán hạng nguồn. Toán hạng nguồn hạng thứ hai thường không bị thay đổi sau khi thực hiện lệnh . thường không bị thay đổi sau khi thực hiện lệnh .
Đối với một chỉ dẫn của ASM, trường toán hạng chứa một Đối với một chỉ dẫn của ASM, trường toán hạng chứa một hoặc nhiều thông tin mà ASM dùng để thực thi chỉ dẫn . hoặc nhiều thông tin mà ASM dùng để thực thi chỉ dẫn .
Biên soạn: Lê Minh Triết
1.4 Trường chú thích 1.4 Trường chú thích (Comment field) (Comment field)
Trường chú thích là một tuỳ chọn trong ngôn Trường chú thích là một tuỳ chọn trong ngôn ngữ ASM. Lập trình viên dùng trường chú thích ngữ ASM. Lập trình viên dùng trường chú thích để thuyết minh về câu lệnh. Điều này là cần để thuyết minh về câu lệnh. Điều này là cần thiết vì ngôn ngữ ASM là ngôn ngữ cấp thấp thiết vì ngôn ngữ ASM là ngôn ngữ cấp thấp (low level) vì vậy sẽ rất khó hiểu chương trình (low level) vì vậy sẽ rất khó hiểu chương trình nếu nó không được chú thích một cách đầy đủ nếu nó không được chú thích một cách đầy đủ và rõ ràng. Tuy nhiên không nên có chú thích và rõ ràng. Tuy nhiên không nên có chú thích đối với mọi dòng của chương trình, kể cả đối với mọi dòng của chương trình, kể cả những lệnh mà ý nghĩa của nó đã rất rõ ràng. những lệnh mà ý nghĩa của nó đã rất rõ ràng.
Biên soạn: Lê Minh Triết
2. Các kiểu số liệu trong 2. Các kiểu số liệu trong chương trình hợp ngữ chương trình hợp ngữ
CPU chỉ làm việc với các số nhị phân. Vì CPU chỉ làm việc với các số nhị phân. Vì vậy ASM phải chuyển tất cả các loại số vậy ASM phải chuyển tất cả các loại số liệu thành số nhị phân. liệu thành số nhị phân.
Trong một chương trình hợp ngữ cho Trong một chương trình hợp ngữ cho phép biểu diễn số liệu dưới dạng nhị phép biểu diễn số liệu dưới dạng nhị phân, thập phân hoặc thập lục phân. phân, thập phân hoặc thập lục phân.
Biên soạn: Lê Minh Triết
2.1 Các số 2.1 Các số
1 số nhị phân là 1 dãy các bit 0, 1 và kết thúc bằng b hoặc B 1 số nhị phân là 1 dãy các bit 0, 1 và kết thúc bằng b hoặc B 1 số thập phân là 1 dãy các chữ số thập phân và kết thúc bởi d 1 số thập phân là 1 dãy các chữ số thập phân và kết thúc bởi d
hoặc D (có thể không cần) hoặc D (có thể không cần)
1 số hex phải bắt đầu bởi 1 chữ số thập phân và phải kết thúc 1 số hex phải bắt đầu bởi 1 chữ số thập phân và phải kết thúc
bởi h hoặc H. bởi h hoặc H.
Ví dụ các biểu diễn số hợp lệ và không hợp lệ trong ASM : Ví dụ các biểu diễn số hợp lệ và không hợp lệ trong ASM :
Số Số 10111 10111 10111b 10111b -2183D -2183D 1B4DH 1B4DH 1B4D 1B4D FFFFH FFFFH 0FFFFH 0FFFFH
Loại Loại thập phân thập phân nhị phân nhị phân thập phân thập phân hex hex số hex không hợp lệ số hex không hợp lệ số hex không hợp lệ số hex không hợp lệ số hex số hex
Biên soạn: Lê Minh Triết
2.2 Các ký tự 2.2 Các ký tự
Ký tự và một chuỗi các ký tự phải được Ký tự và một chuỗi các ký tự phải được đóng giữa hai dấu ngoặc đơn hoặc hai đóng giữa hai dấu ngoặc đơn hoặc hai dấu ngoặc kép. dấu ngoặc kép. Ví dụ: ‘A’ và “HELLO”. Ví dụ: ‘A’ và “HELLO”.
Các ký tự đều được chuyển thành mã Các ký tự đều được chuyển thành mã
ASCII. ASCII.
Do đó trong một chương trình ASM xem Do đó trong một chương trình ASM xem khai báo ‘A’ hay 41h (mã ASCII của A) khai báo ‘A’ hay 41h (mã ASCII của A) là giống nhau là giống nhau
Biên soạn: Lê Minh Triết
3. Các biến (Variables) 3. Các biến (Variables)
Trong ASM biến đóng vai trò như trong ngôn ngữ cấp cao. Trong ASM biến đóng vai trò như trong ngôn ngữ cấp cao. Mỗi biến có một loại dữ liệu và nó được gán một địa chỉ bộ Mỗi biến có một loại dữ liệu và nó được gán một địa chỉ bộ nhớ sau khi dịch chương trình. Bảng sau đây liệt kê các nhớ sau khi dịch chương trình. Bảng sau đây liệt kê các toán tử giả dùng để định nghĩa các kiểu số liệu. toán tử giả dùng để định nghĩa các kiểu số liệu.
PSEUDO-OP PSEUDO-OP
STANDS FOR STANDS FOR
DB DB DW DW
define byte define byte define word (doublebyte) define word (doublebyte)
DD DD
define doubeword (2 từ liên tiếp) define doubeword (2 từ liên tiếp)
DQ DQ
define quadword (4 từ liên tiếp ) define quadword (4 từ liên tiếp )
DT DT
define tenbytes (10 bytes liên tiếp) define tenbytes (10 bytes liên tiếp)
Biên soạn: Lê Minh Triết
3.1. Kiểu byte 3.1. Kiểu byte
Để định nghĩa biến kiểu byte cú pháp như sau: Để định nghĩa biến kiểu byte cú pháp như sau:
NAME NAME
initial_value initial_value
DB DB
Ví dụ : Ví dụ :
ALPHA ALPHA
DB DB
4 4
- Chỉ dẫn này sẽ gán tên ALPHA cho một byte nhớ trong - Chỉ dẫn này sẽ gán tên ALPHA cho một byte nhớ trong
bộ nhớ mà giá trị ban đầu của nó là 4. bộ nhớ mà giá trị ban đầu của nó là 4.
- Nếu giá trị của byte là không xác định thì đặt dấu chấm - Nếu giá trị của byte là không xác định thì đặt dấu chấm
hỏi ( ?) vào giá trị ban đầu. hỏi ( ?) vào giá trị ban đầu.
Ví dụ : Ví dụ :
BYT BYT
DB DB
? ?
Đối với biến kiểu byte vùng giá trị nó lưu trữ được là từ Đối với biến kiểu byte vùng giá trị nó lưu trữ được là từ -128 đến 127 đối với số có dấu và 0 đến 255 đối với số -128 đến 127 đối với số có dấu và 0 đến 255 đối với số không dấu . không dấu .
Biên soạn: Lê Minh Triết
3.2. Kiểu word 3.2. Kiểu word
Định nghĩa một biến kiểu Word như sau: Định nghĩa một biến kiểu Word như sau:
NAME NAME
DW DW
initial_value initial_value
Ví dụ : Ví dụ :
WRD WRD
DW DW
-2 -2
Có thể dùng dấu ? để thay thế cho biến từ có Có thể dùng dấu ? để thay thế cho biến từ có giá trị không xác định. Vùng giá trị của biến giá trị không xác định. Vùng giá trị của biến từ là -32768 đến 32767 đối với số có dấu và 0 từ là -32768 đến 32767 đối với số có dấu và 0 đến 56535 đối với số không dấu . đến 56535 đối với số không dấu .
Biên soạn: Lê Minh Triết
3.3 Mảng (arrays) 3.3 Mảng (arrays)
Mảng là một loạt các byte nhớ hoặc word nhớ liên tiếp Mảng là một loạt các byte nhớ hoặc word nhớ liên tiếp nhau. Ví dụ để định nghĩa 1 mảng 3 byte là B_ARRAY, nhau. Ví dụ để định nghĩa 1 mảng 3 byte là B_ARRAY, giá trị ban đầu là 10h, 20h và 30h ta có thể viết : giá trị ban đầu là 10h, 20h và 30h ta có thể viết :
B_ARRAY B_ARRAY
DB DB
10h,20h,30h 10h,20h,30h
B_ARRAY là tên được gán cho byte đầu tiên B_ARRAY là tên được gán cho byte đầu tiên B_ARRAY+1 là tên của byte thứ hai B_ARRAY+1 là tên của byte thứ hai B_ARRAY+2 là tên của byte thứ ba B_ARRAY+2 là tên của byte thứ ba
Nếu ASM gán địa chỉ offset là 0200h cho mảng B_ARRAY Nếu ASM gán địa chỉ offset là 0200h cho mảng B_ARRAY
thì nội dung bộ nhớ sẽ như sau : thì nội dung bộ nhớ sẽ như sau : ADDRESS ADDRESS 200h 200h 201h 201h 202h 202h
SYMBOL SYMBOL B_ARRAY B_ARRAY B_ARRAY+1 B_ARRAY+1 B_ARRAY+2 B_ARRAY+2
CONTENTS CONTENTS 10h 10h 20h 20h 30h 30h
Biên soạn: Lê Minh Triết
Chỉ dẫn sau đây sẽ định nghĩa một mảng 4 phần Chỉ dẫn sau đây sẽ định nghĩa một mảng 4 phần
tử có tên là W_ARRAY: tử có tên là W_ARRAY: W_ARRAY W_ARRAY
DW 1000,40,29887,329 DW 1000,40,29887,329
Giả sử mảng bắt đầu tại 0300h, bộ nhớ như sau: Giả sử mảng bắt đầu tại 0300h, bộ nhớ như sau:
SYMBOL SYMBOL W_ARRAY W_ARRAY W_ARRAY+2 W_ARRAY+2 W_ARRAY+4 W_ARRAY+4 W_ARRAY+6 W_ARRAY+6
ADDRESS ADDRESS 300h 300h 302h 302h 304h 304h 306h 306h
CONTENTS CONTENTS 1000d 1000d 40d 40d 29887d 29887d 329d 329d
Biên soạn: Lê Minh Triết
Byte thấp và byte cao của một word Byte thấp và byte cao của một word
Đôi khi chúng ta cần truy xuất tới byte thấp và Đôi khi chúng ta cần truy xuất tới byte thấp và
byte cao của một biến Word. byte cao của một biến Word.
Giả sử chúng ta định nghĩa : Giả sử chúng ta định nghĩa :
WORD1 WORD1
DW 1234h DW 1234h
Byte thấp của WORD1 chứa 34h Byte thấp của WORD1 chứa 34h
Còn byte cao của WORD1 chứa 12h Còn byte cao của WORD1 chứa 12h
Ký hiệu địa chỉ của byte thấp là WORD1 Ký hiệu địa chỉ của byte thấp là WORD1
Còn ký hiệu địa chỉ của byte cao là WORD1+1 . Còn ký hiệu địa chỉ của byte cao là WORD1+1 .
Biên soạn: Lê Minh Triết
Chuỗi các ký tự ( character strings) Chuỗi các ký tự ( character strings)
Một mảng các mã ASCII Một mảng các mã ASCII
có thể được định nghĩa bằng có thể được định nghĩa bằng
DW 41h,42h,43h DW 41h,42h,43h
một chuỗi các ký tự . một chuỗi các ký tự . LETTERS LETTERS Ví dụ : Ví dụ : tương đương với tương đương với LETTERS LETTERS
DW ‘ABC ’ DW ‘ABC ’
Bên trong một chuỗi , ASM sẽ phân biệt chữ hoa và chữ Bên trong một chuỗi , ASM sẽ phân biệt chữ hoa và chữ thường . Vì vậy chuỗi ‘abc’ sẽ được chuyển thành 3 bytes : thường . Vì vậy chuỗi ‘abc’ sẽ được chuyển thành 3 bytes : 61h, 62h và 63h. 61h, 62h và 63h.
Ta cũng có thể tổ hợp các ký tự và các số trong một định Ta cũng có thể tổ hợp các ký tự và các số trong một định
nghĩa. nghĩa. Ví dụ : Ví dụ :
‘HELLO’, 0AH, 0DH, ‘$’ ‘HELLO’, 0AH, 0DH, ‘$’
MSG DB MSG DB tương đương với tương đương với
MSG DB 48H,45H,4CH,4Ch,4FH,0AH,0DH,24H MSG DB 48H,45H,4CH,4Ch,4FH,0AH,0DH,24H
Biên soạn: Lê Minh Triết
3.4 Các hằng ( constants) 3.4 Các hằng ( constants)
Trong một chương trình các hằng có thể được đặt tên nhờ chỉ dẫn Trong một chương trình các hằng có thể được đặt tên nhờ chỉ dẫn
EQU (equates). Cú pháp của EQU là : EQU (equates). Cú pháp của EQU là :
NAME NAME LF LF
EQU EQU EQU EQU
constant constant 0AH 0AH
Ví dụ : Ví dụ : sau khi có khai báo trên thì LF được dùng thay cho 0Ah trong chương sau khi có khai báo trên thì LF được dùng thay cho 0Ah trong chương trình. Vì vậy ASM sẽ chuyễn các lệnh : trình. Vì vậy ASM sẽ chuyễn các lệnh :
MOV MOV MOV MOV
DL,0Ah DL,0Ah DL,LF DL,LF
và và thành cùng một mã máy. thành cùng một mã máy.
Cũng có thể dùng EQU để định nghĩa một chuỗi Cũng có thể dùng EQU để định nghĩa một chuỗi
‘TYPE YOUR NAME ’ ‘TYPE YOUR NAME ’
EQU EQU PROMPT PROMPT Ví dụ: Ví dụ: Sau khi có khai báo này, thay cho Sau khi có khai báo này, thay cho
MSG MSG
DB DB
‘TYPE YOUR NAME ’ ‘TYPE YOUR NAME ’
chúng ta có thể viết chúng ta có thể viết
MSG MSG
DB DB
PROMPT PROMPT
Biên soạn: Lê Minh Triết
3.5. Các lệnh cơ bản 3.5. Các lệnh cơ bản
CPU 8086 có rất nhiều lệnh, trong chương CPU 8086 có rất nhiều lệnh, trong chương này, chúng ta sẽ xem xét 7 lệnh đơn giản này, chúng ta sẽ xem xét 7 lệnh đơn giản của 8086 mà chúng thường được dùng của 8086 mà chúng thường được dùng với các thao tác di chuyển số liệu và thực với các thao tác di chuyển số liệu và thực hiện các phép toán số học. hiện các phép toán số học.
Trong phần sau đây, WORD1 và WORD2 Trong phần sau đây, WORD1 và WORD2 là các biến kiểu word, BYTE1 và BYTE2 là các biến kiểu word, BYTE1 và BYTE2 là các biến kiểu byte . là các biến kiểu byte .
Biên soạn: Lê Minh Triết
3.5.1 Lệnh MOV và XCHG 3.5.1 Lệnh MOV và XCHG
Lệnh MOV dùng để chuyển số liệu giữa các thanh ghi, giữa Lệnh MOV dùng để chuyển số liệu giữa các thanh ghi, giữa 1 thanh ghi và 1 vị trí nhớ hoặc để di chuyển trực tiếp 1 thanh ghi và 1 vị trí nhớ hoặc để di chuyển trực tiếp một số đến một thanh ghi hoặc một vị trí nhớ. một số đến một thanh ghi hoặc một vị trí nhớ.
Cú pháp của lệnh MOV là : Cú pháp của lệnh MOV là :
MOV Destination , Source MOV Destination , Source
Ví dụ : Ví dụ :
MOV AX,WORD1 MOV AX,WORD1
; lấy nội dung của WORD1 đưa vào thanh ghi AX ; lấy nội dung của WORD1 đưa vào thanh ghi AX
MOV AX,BX MOV AX,BX
; AX lấy nội dung của BX, BX không thay đổi ; AX lấy nội dung của BX, BX không thay đổi
MOV AH,’A’ MOV AH,’A’
; AX lấy giá trị 41h ; AX lấy giá trị 41h
Biên soạn: Lê Minh Triết
! Chú ý lệnh MOV ! Chú ý lệnh MOV
Lệnh Mov không làm ảnh hưởng thanh ghi cờ hiệu Lệnh Mov không làm ảnh hưởng thanh ghi cờ hiệu Không thể chuyển dữ liệu trực tiếp giữa 2 toán hạng mà Không thể chuyển dữ liệu trực tiếp giữa 2 toán hạng mà
phải dùng 1 thanh ghi trung gian phải dùng 1 thanh ghi trung gian Ví dụ: Chuyển dữ liệu 16bit từ Var1 vào Var2 Ví dụ: Chuyển dữ liệu 16bit từ Var1 vào Var2 AX,Var1 AX,Var1 Var2,AX Var2,AX
Mov Mov Mov Mov
Không thể chuyển trực tiếp 1 hằng vào 1 thanh ghi đoạn, Không thể chuyển trực tiếp 1 hằng vào 1 thanh ghi đoạn,
muốn chuyển ta phải dùng 1 thanh ghi trung gian muốn chuyển ta phải dùng 1 thanh ghi trung gian Ví dụ: Muốn chuyển giá trị B800h vào thanh ghi DS Ví dụ: Muốn chuyển giá trị B800h vào thanh ghi DS
Mov Mov Mov Mov
AX,0B800h AX,0B800h DS,AX DS,AX
Không thề chuyển trực tiếp giữa hai thanh ghi đoạn Không thề chuyển trực tiếp giữa hai thanh ghi đoạn
Biên soạn: Lê Minh Triết
Lệnh XCHG Lệnh XCHG
Lệnh XCHG ( Exchange) dùng để trao đổi nội Lệnh XCHG ( Exchange) dùng để trao đổi nội dung của 2 thanh ghi hoặc của một thanh ghi và dung của 2 thanh ghi hoặc của một thanh ghi và một ô nhớ. một ô nhớ.
Ví dụ : XCHG AH,BL Ví dụ : XCHG AH,BL
XCHG AX,WORD1 XCHG AX,WORD1
; trao đổi nội dung của thanh ghi AX và biến ; trao đổi nội dung của thanh ghi AX và biến WORD1. WORD1.
Không thể dùng lệnh này với các thanh ghi đoạn Không thể dùng lệnh này với các thanh ghi đoạn
Biên soạn: Lê Minh Triết
3.5.2 Lệnh ADD, SUB, INC, DEC 3.5.2 Lệnh ADD, SUB, INC, DEC
Lệnh ADD và SUB được dùng để cộng và trừ nội dung Lệnh ADD và SUB được dùng để cộng và trừ nội dung của 2 thanh ghi, của một thanh ghi và một vị trí nhớ, hoặc của 2 thanh ghi, của một thanh ghi và một vị trí nhớ, hoặc cộng (trừ) một số với một thanh ghi hoặc một vị trí nhớ. cộng (trừ) một số với một thanh ghi hoặc một vị trí nhớ.
Cú pháp: Cú pháp:
ADD ADD
Destination , Source Destination , Source
SUB SUB
Destination , Source Destination , Source
Ví dụ : Ví dụ :
ADD ADD
WORD1, AX WORD1, AX
ADD ADD SUB SUB
BL , 5 BL , 5 AX,DX AX,DX
; AX=AX-DX ; AX=AX-DX
Không thể cộng trực tiếp thanh ghi đoạn Không thể cộng trực tiếp thanh ghi đoạn
Biên soạn: Lê Minh Triết
Lệnh ADD, SUB Lệnh ADD, SUB
Không được phép cộng hoặc trừ trực tiếp Không được phép cộng hoặc trừ trực tiếp
giữa 2 vị trí nhớ. giữa 2 vị trí nhớ.
Để giải quyết vấn đề này người ta phải di chuyển Để giải quyết vấn đề này người ta phải di chuyển byte (word) nhớ đến một thanh ghi sau đó mới byte (word) nhớ đến một thanh ghi sau đó mới cộng hoặc trừ thanh ghi này với một byte (word) cộng hoặc trừ thanh ghi này với một byte (word) nhớ khác. nhớ khác.
Ví dụ: Ví dụ:
MOV MOV
AL, BYTE2 AL, BYTE2
ADD ADD
BYTE1, AL BYTE1, AL
Biên soạn: Lê Minh Triết
Lệnh INC, DEC Lệnh INC, DEC
Lệnh INC (incremrent) để cộng 1 vào nội dung thanh ghi Lệnh INC (incremrent) để cộng 1 vào nội dung thanh ghi
hoặc một vị trí nhớ. hoặc một vị trí nhớ.
Lệnh DEC (decrement) để giảm bớt 1 khỏi một thanh ghi Lệnh DEC (decrement) để giảm bớt 1 khỏi một thanh ghi
hoặc 1 vị trí nhớ. hoặc 1 vị trí nhớ.
Cú pháp: Cú pháp:
INC INC
Destination Destination
DEC Destination DEC Destination
Ví dụ : Ví dụ :
INC WORD1 INC WORD1
INC INC
AX AX
DEC BL DEC BL
Biên soạn: Lê Minh Triết
3.5.3 Lệnh NEG ( negative) 3.5.3 Lệnh NEG ( negative)
Lệnh NEG để đổi dấu của một thanh ghi hoặc Lệnh NEG để đổi dấu của một thanh ghi hoặc
một vị trí nhớ. một vị trí nhớ. Cú pháp : Cú pháp :
NEG NEG
destination destination
Công dụng để thực hiện phép trừ 1 hằng với 1 Công dụng để thực hiện phép trừ 1 hằng với 1 toán hạng (hằng không thể đứng trước). Ví dụ: toán hạng (hằng không thể đứng trước). Ví dụ:
SUB SUB
100,AL ; ASM không cho 100,AL ; ASM không cho
phép nên ta viết lại như sau: phép nên ta viết lại như sau: AL,100 AL,100 AL AL
SUB SUB NEG NEG
Biên soạn: Lê Minh Triết
3.6 Chuyển ngôn ngữ cấp cao 3.6 Chuyển ngôn ngữ cấp cao thành ngôn ngữ ASM thành ngôn ngữ ASM
Giả sử A, B là 2 biến word. Anh/chị chuyển các mệnh đề sau ra ngôn Giả sử A, B là 2 biến word. Anh/chị chuyển các mệnh đề sau ra ngôn
ngữ ASM. ngữ ASM. 1.6.1 Mệnh đề B=A 1.6.1 Mệnh đề B=A
MOV MOV MOV MOV
AX,A AX,A B,AX B,AX
; đưa A vào AX ; đưa A vào AX ; đưa AX vào B ; đưa AX vào B
1.6.2 Mệnh đề A=5-A 1.6.2 Mệnh đề A=5-A
MOV MOV SUB SUB MOV MOV cách khác : NEG cách khác : NEG ADD ADD
; đưa 5 vào AX ; đưa 5 vào AX ; AX=5-A ; AX=5-A ; A=5-A ; A=5-A ;A=-A ;A=-A ;A=5-A ;A=5-A
AX,5 AX,5 AX,A AX,A A,AX A,AX A A A,5 A,5 1.6.3 Mệnh đề A=B-2*A 1.6.3 Mệnh đề A=B-2*A
MOV MOV SUB SUB SUB SUB MOV MOV
AX,B AX,B AX,A AX,A AX,A AX,A A,AX A,AX
;Ax=B ;Ax=B ;AX=B-A ;AX=B-A ;AX=B-2*A ;AX=B-2*A ;A=B-2*A ;A=B-2*A
Biên soạn: Lê Minh Triết
3.7 Cấu trúc của một 3.7 Cấu trúc của một
chương trình hợp ngữ chương trình hợp ngữ
Một chương trình ngôn ngữ máy bao gồm: Một chương trình ngôn ngữ máy bao gồm:
mã (code) mã (code)
số liệu (data) số liệu (data)
ngăn xếp (stack). ngăn xếp (stack).
Mỗi một phần chiếm một đoạn bộ nhớ. Mỗi một phần chiếm một đoạn bộ nhớ. Mỗi một đoạn chương trình là được Mỗi một đoạn chương trình là được chuyển thành một đoạn bộ nhớ bởi ASM. chuyển thành một đoạn bộ nhớ bởi ASM.
Biên soạn: Lê Minh Triết
3.7.1 3.7.1
Các kiểu bộ nhớ Các kiểu bộ nhớ (memory models) (memory models)
Độ lớn của mã và số liệu trong một chương trình được Độ lớn của mã và số liệu trong một chương trình được quy định bởi chỉ dẫn MODEL nhằm xác định kiểu bộ quy định bởi chỉ dẫn MODEL nhằm xác định kiểu bộ nhớ dùng với chương trình. nhớ dùng với chương trình. Cú pháp của chỉ dẫn MODEL như sau : Cú pháp của chỉ dẫn MODEL như sau : .MODEL .MODEL
memory_model memory_model
Bảng sau cho thấy các kiểu bộ nhớ : Bảng sau cho thấy các kiểu bộ nhớ :
MODEL
DESCRITION
TINY SMALL MEDIUM COMPACT LARGE HUGE
Code, data nằm trong 1 đoạn Code nằm trong 1 đoạn, data nằm trong 1 đoạn Code nhiều hơn 1 đoạn , data trong 1 đoạn Code trong 1 đoạn, data nhiều hơn 1 đọan Code, data lớn hơn 1 đoạn, array không quá 64KB Code, data lớn hớn 1 đoạn, array lớn hơn 64KB
Biên soạn: Lê Minh Triết
3.7.2 Đoạn số liệu 3.7.2 Đoạn số liệu
Đoạn số liệu của chương trình chưá các khai báo biến, Đoạn số liệu của chương trình chưá các khai báo biến, khai báo hằng...Để bắt đầu đoạn số liệu chúng ta dùng khai báo hằng...Để bắt đầu đoạn số liệu chúng ta dùng chỉ dẫn DATA với cú pháp như sau : chỉ dẫn DATA với cú pháp như sau :
.DATA .DATA
;khai báo tên các biến , hằng và mảng ;khai báo tên các biến , hằng và mảng
Ví dụ : Ví dụ :
.DATA .DATA
WORD1 WORD1
DW 2 ; gán 2 vào word1 DW 2 ; gán 2 vào word1
WORD2 WORD2
DW 5 DW 5
MSG MSG
DB DB
‘THIS IS A MESSAGE ’ ‘THIS IS A MESSAGE ’
MASK MASK
EQU 10010010B ; hằng EQU 10010010B ; hằng
Biên soạn: Lê Minh Triết
3.7.3 Đoạn ngăn xếp 3.7.3 Đoạn ngăn xếp
Mục đích của việc khai báo đoạn ngăn xếp Mục đích của việc khai báo đoạn ngăn xếp là dành một vùng nhớ (vùng stack) để lưu là dành một vùng nhớ (vùng stack) để lưu trữ cho stack. trữ cho stack. Cú pháp: Cú pháp:
.STACK .STACK
size size
100h 100h
nếu không khai báo size thì 1KB được dành nếu không khai báo size thì 1KB được dành cho vùng stack. cho vùng stack. .STACK .STACK ;dành 256 bytes (=100h) cho vùng stack ;dành 256 bytes (=100h) cho vùng stack
Biên soạn: Lê Minh Triết
3.7.4 Đoạn mã 3.7.4 Đoạn mã
Bắt đầu đoạn mã chưá các lệnh của chương trình: Bắt đầu đoạn mã chưá các lệnh của chương trình:
.CODE .CODE
Bên trong đoạn mã các lệnh thường được tổ chức thành thủ tục Bên trong đoạn mã các lệnh thường được tổ chức thành thủ tục
(procedure), có cấu trúc như sau: (procedure), có cấu trúc như sau:
PROC PROC
name name ;thân của thủ tục ;thân của thủ tục name name
ENDP ENDP
Cấu trúc của 1 chương trình, phần CODE là thủ tục có tên MAIN: Cấu trúc của 1 chương trình, phần CODE là thủ tục có tên MAIN:
.MODELSMALL .MODELSMALL .STACK 100h .STACK 100h .DATA .DATA .CODE .CODE MAIN MAIN
MAIN MAIN
END END
; định nghĩa số liệu tại đây ; định nghĩa số liệu tại đây PROC PROC ;thân của thủ tục MAIN ;thân của thủ tục MAIN ENDP ENDP ; các thủ tục khác nếu có ; các thủ tục khác nếu có MAIN MAIN
Biên soạn: Lê Minh Triết
3.8 Các lệnh vào ra 3.8 Các lệnh vào ra
Lệnh INT (interrupt) Lệnh INT (interrupt)
Để gọi các chương trình con của BIOS và DOS Để gọi các chương trình con của BIOS và DOS có thể dùng lệnh INT với cú pháp như sau : có thể dùng lệnh INT với cú pháp như sau :
INT interrupt_number INT interrupt_number
ở đây interrupt_number là một số mà nó chỉ ở đây interrupt_number là một số mà nó chỉ định một routine. định một routine.
Ví dụ: Ví dụ:
INT 16h INT 16h
; gọi routine thực hiện việc nhập số liệu từ ; gọi routine thực hiện việc nhập số liệu từ Keyboard. Keyboard.
Biên soạn: Lê Minh Triết
3.8.1 Lệnh INT 21h 3.8.1 Lệnh INT 21h
INT 21h dùng để gọi một số lớn các các hàm INT 21h dùng để gọi một số lớn các các hàm (function) của DOS. Tuỳ theo giá trị mà chúng ta (function) của DOS. Tuỳ theo giá trị mà chúng ta đặt vào thanh ghi AH, INT 21h sẽ gọi chạy một đặt vào thanh ghi AH, INT 21h sẽ gọi chạy một routine tương ứng . routine tương ứng .
Trong phần này ta sẽ quan tâm đến 2 hàm: Trong phần này ta sẽ quan tâm đến 2 hàm:
ROUTINE ROUTINE
FUNCTION NUMBER FUNCTION NUMBER 1 1 2 2
Nhập từ bàn phím một ký tự Nhập từ bàn phím một ký tự Xuất ra màn hình 1 ký tự Xuất ra màn hình 1 ký tự
Biên soạn: Lê Minh Triết
FUCNTION 1 : FUCNTION 1 : Nhập từ bàn phím một ký tự Nhập từ bàn phím một ký tự
Input : AH=1 Input : AH=1 Output: AL= mã ASCII của ký tự vừa nhập Output: AL= mã ASCII của ký tự vừa nhập AL=0 nếu không nhấn phím AL=0 nếu không nhấn phím
Để gọi routine này thực hiện các lệnh sau: Để gọi routine này thực hiện các lệnh sau: MOV AH,1 ; input key function MOV AH,1 ; input key function INT 21h ; AL chứa mã ASCII của ký tự INT 21h ; AL chứa mã ASCII của ký tự
vừa nhập và hiển thị ra màn hình vừa nhập và hiển thị ra màn hình
Biên soạn: Lê Minh Triết
FUNCTION 2 : FUNCTION 2 : Xuất ra màn hình 1 ký tự Xuất ra màn hình 1 ký tự
Input : AH=2 Input : AH=2
DL= mã ASCII của ký tự cần xuất DL= mã ASCII của ký tự cần xuất
Output: AL= mã ASCII của ký tự cần xuất Output: AL= mã ASCII của ký tự cần xuất
Ví dụ: Ví dụ:
MOV AH,2 MOV AH,2
MOV DL,’?’ ; ký tự ‘?’ MOV DL,’?’ ; ký tự ‘?’
INT 21H ; hiển thị ký tự ‘?’ INT 21H ; hiển thị ký tự ‘?’
Nếu DL chưá ký tự điều khiển thì khi gọi INT 21h, Nếu DL chưá ký tự điều khiển thì khi gọi INT 21h, ký tự điều khiển sẽ được thực hiện ký tự điều khiển sẽ được thực hiện
Biên soạn: Lê Minh Triết
ASCII code (Hex) ASCII code (Hex)
FUNCTION FUNCTION
7 7
beep beep
8 8 9 9 A A D D
b.space – nhập b.phím 1 ký tự 0 h.thị b.space – nhập b.phím 1 ký tự 0 h.thị tab – xuất một chuỗi ký tự ra mhình tab – xuất một chuỗi ký tự ra mhình line feed - nhập chuỗi từ bàn phím line feed - nhập chuỗi từ bàn phím carriage return (Enter) carriage return (Enter)
Biên soạn: Lê Minh Triết
3.9 Chương trình ví dụ: chương trình đọc một ký 3.9 Chương trình ví dụ: chương trình đọc một ký tự từ bàn phím và in nó trên đầu dòng mới tự từ bàn phím và in nó trên đầu dòng mới
; hàm xuất 1 ký tự
; thực hiện line feed
AH,2 AH,2 DL,’?’ DL,’?’ 21H 21H
; đưa ký tự vào DL ; xuất ký tự
AH,1 AH,1
AH,4CH ; hàm thoát về DOS ; exit to DOS 21H
.MODEL SMALL .MODEL SMALL .STACK 100H .STACK 100H .CODE .CODE MAIN PROC MAIN PROC ; display dấu nhắc ; display dấu nhắc MOV MOV MOV MOV INT INT ; nhập 1 ký tự ; nhập 1 ký tự ; hàm đọc ký tự MOV ; hàm đọc ký tự MOV INT 21H ; ký tự được đưa vào AL INT 21H ; ký tự được đưa vào AL ; cất ký tự trong BL MOV ; cất ký tự trong BL MOV
BL,AL BL,AL
; nhảy đến dòng mới AH,2 MOV DL,0DH ; ký tự carriage return MOV ; thực hiện c.r. 21H INT MOV DL,0AH ; ký tự line feed 21H INT ; xuất ký tự DL,BL MOV INT 21H ; trở về DOS MOV INT MAIN ENDP MAIN END
Biên soạn: Lê Minh Triết
3.10 Xuất một chuỗi ký tự 3.10 Xuất một chuỗi ký tự
Trong chương trình trên đây ta đã dùng INT Trong chương trình trên đây ta đã dùng INT
21H hàm 2 và 4 để đọc và xuất một ký tự. 21H hàm 2 và 4 để đọc và xuất một ký tự.
Hàm 9 ngắt 21H có thể dùng để xuất một chuỗi Hàm 9 ngắt 21H có thể dùng để xuất một chuỗi
ký tự. ký tự.
Input : DX=địa chỉ của chuỗi Input : DX=địa chỉ của chuỗi
Chuỗi kết thúc bằng dấu ‘$’ Chuỗi kết thúc bằng dấu ‘$’
Ký tự $ ở cuối chuỗi sẽ không được in lên màn Ký tự $ ở cuối chuỗi sẽ không được in lên màn hình. Nếu chuỗi có chứa ký tự điều khiển thì hình. Nếu chuỗi có chứa ký tự điều khiển thì chức năng tương ứng sẽ thực hiện. chức năng tương ứng sẽ thực hiện.
Biên soạn: Lê Minh Triết
Chương trình in lên màn hình chuỗi “HELLO!”. Chương trình in lên màn hình chuỗi “HELLO!”.
Chuỗi HELLO được định nghĩa như sau: Chuỗi HELLO được định nghĩa như sau: ‘HELLO!$’ ‘HELLO!$’
MSG DB MSG DB
Lệnh LEA (Load Effective Address) nạp địa chỉ Lệnh LEA (Load Effective Address) nạp địa chỉ
LEA destnation , source LEA destnation , source
Ngắt 21h, hàm số 9 sẽ xuất một chuỗi ký tự ra Ngắt 21h, hàm số 9 sẽ xuất một chuỗi ký tự ra màn hình với điều kiện địa chỉ của biến chuỗi phải màn hình với điều kiện địa chỉ của biến chuỗi phải ở trên DX . Có thể thực hiện điều này bởi lệnh : ở trên DX . Có thể thực hiện điều này bởi lệnh :
LEA DX,MSG LEA DX,MSG
; đưa địa chỉ offset của biến MSG vào DX ; đưa địa chỉ offset của biến MSG vào DX
Biên soạn: Lê Minh Triết
PRINT STRING PROGRAM PRINT STRING PROGRAM
SMALL SMALL 100H 100H
.MODEL .MODEL .STACK .STACK .DATA .DATA
MSG MSG
DB DB
‘HELLO!$’ ‘HELLO!$’
PROC PROC
.CODE .CODE MAIN MAIN ; initialize DS ; initialize DS
AX,@DATA AX,@DATA DS,AX DS,AX
MOV MOV MOV MOV ; display message ; display message
DX,MSG DX,MSG AH,9 AH,9 21H 21H
LEA LEA MOV MOV INT INT ; return to DOS ; return to DOS MOV MOV INT INT
AH,4CH AH,4CH 21H 21H ENDP ENDP
MAIN MAIN END MAIN END MAIN
Biên soạn: Lê Minh Triết
CASE COVERT PROGRAM CASE COVERT PROGRAM
SMALL SMALL 100H 100H
EQU EQU EQU EQU
‘Nhap vao mot ky tu thuong:$’ ‘Nhap vao mot ky tu thuong:$’ 0DH,0AH,’Ky tu vua nhap viet hoa la :’ 0DH,0AH,’Ky tu vua nhap viet hoa la :’ ?,’$’ ; định nghĩa biến CHAR có giá trị ban đầu chưa xác định ?,’$’ ; định nghĩa biến CHAR có giá trị ban đầu chưa xác định
0DH 0DH 0AH 0AH DB DB DB DB DB DB
.MODEL .MODEL .STACK .STACK .DATA .DATA CR CR LF LF TB1 TB1 TB2 TB2 CHAR CHAR
PROC PROC
.CODE .CODE MAIN MAIN ; INITIALIZE DS ; INITIALIZE DS
AX,@DATA AX,@DATA DS,AX DS,AX
MOV MOV MOV MOV
;PRINT PROMPT USER ;PRINT PROMPT USER
DX,TB1 DX,TB1
; lấy thông điệp số 1 ; lấy thông điệp số 1
LEA LEA MOV AH,9 MOV AH,9 21H INT 21H INT
; xuất nó ra màn hình ; xuất nó ra màn hình
;nhập vào một ký tự thường và đổi nó thành ký tự hoa ;nhập vào một ký tự thường và đổi nó thành ký tự hoa
MOV AH,1 MOV AH,1 21H INT 21H INT AL,20H SUB AL,20H SUB MOV CHAR, AL MOV CHAR, AL
; nhập vào 1 ký tự ; nhập vào 1 ký tự ; cất nó trong AL ; cất nó trong AL ; đổi thành chữ hoa và cất nó trong AL ; đổi thành chữ hoa và cất nó trong AL ; cất ký tự trong biến CHAR ; cất ký tự trong biến CHAR
; xuất ký tự trên dòng tiếp theo ; xuất ký tự trên dòng tiếp theo DX, TB2 DX, TB2
; lấy thông điệp thứ 2 ; lấy thông điệp thứ 2
21H ; xuất chuỗi 2, vì TB2 0 kết thúc bởi ký tự $ nên tiếp tục xuất ký tự có trong biến CHAR 21H ; xuất chuỗi 2, vì TB2 0 kết thúc bởi ký tự $ nên tiếp tục xuất ký tự có trong biến CHAR
LEA LEA MOV AH,9 MOV AH,9 INT INT ;dos exit ;dos exit
21H 21H
; dos exit ; dos exit
ENDP ENDP
MOV AH,4CH MOV AH,4CH INT INT MAIN MAIN END MAIN END MAIN
Biên soạn: Lê Minh Triết
Yêu cầu nhập 1 ký tự, sau đó thay đổi ký Yêu cầu nhập 1 ký tự, sau đó thay đổi ký tự đã nhập thành ký tự đi liền trước theo tự đã nhập thành ký tự đi liền trước theo thứ tự ASCII và in ra màn hình thứ tự ASCII và in ra màn hình
Biên soạn: Lê Minh Triết
CASE PREVIOUS PROGRAM CASE PREVIOUS PROGRAM
SMALL SMALL 100H 100H
EQU EQU EQU EQU
‘Nhap vao 1 ky tu:$’ ‘Nhap vao 1 ky tu:$’ 0DH,0AH,’Ky tu lien truoc no la :’ 0DH,0AH,’Ky tu lien truoc no la :’ ?,’$’ ; định nghĩa biến CHAR có giá trị ban đầu chưa xác định ?,’$’ ; định nghĩa biến CHAR có giá trị ban đầu chưa xác định
0DH 0DH 0AH 0AH DB DB DB DB DB DB
.MODEL .MODEL .STACK .STACK .DATA .DATA CR CR LF LF MSG1 MSG1 MSG2 MSG2 CHAR CHAR
PROC PROC
.CODE .CODE MAIN MAIN ; INITIALIZE DS ; INITIALIZE DS
AX,@DATA AX,@DATA DS,AX DS,AX
MOV MOV MOV MOV
;PRINT PROMPT USER ;PRINT PROMPT USER
DX,MSG1 DX,MSG1
; lấy thông điệp số 1 ; lấy thông điệp số 1
LEA LEA MOV AH,9 MOV AH,9 21H INT 21H INT
; xuất nó ra màn hình ; xuất nó ra màn hình
;nhập vào một ký tự thường và đổi nó thành ký tự hoa ;nhập vào một ký tự thường và đổi nó thành ký tự hoa
MOV AH,1 MOV AH,1 21H INT 21H INT AL DEC AL DEC MOV CHAR, AL MOV CHAR, AL
; nhập vào 1 ký tự ; nhập vào 1 ký tự ; cất nó trong AL ; cất nó trong AL ; ; ; cất ký tự trong biến CHAR ; cất ký tự trong biến CHAR
; xuất ký tự trên dòng tiếp theo ; xuất ký tự trên dòng tiếp theo DX, MSG2 DX, MSG2
; lấy thông điệp thứ 2 ; lấy thông điệp thứ 2
21H ; xuất chuỗi 2, vì MSG2 0 kết thúc bởi ký tự $ nên tiếp tục xuất ký tự có trong biến CHAR 21H ; xuất chuỗi 2, vì MSG2 0 kết thúc bởi ký tự $ nên tiếp tục xuất ký tự có trong biến CHAR
LEA LEA MOV AH,9 MOV AH,9 INT INT ;dos exit ;dos exit
21H 21H
; dos exit ; dos exit
ENDP ENDP
MOV AH,4CH MOV AH,4CH INT INT MAIN MAIN END MAIN END MAIN
Biên soạn: Lê Minh Triết
3.1 Ví dụ về lệnh nhảy 3.1 Ví dụ về lệnh nhảy
Để hình dung được lệnh nhảy làm việc như thế nào chúng ta hãy viết Để hình dung được lệnh nhảy làm việc như thế nào chúng ta hãy viết
chương trình in ra toàn bộ tập các ký tự IBM . chương trình in ra toàn bộ tập các ký tự IBM .
SMALL SMALL 100H 100H
PROC PROC
.MODEL .MODEL .STACK .STACK .CODE .CODE MAIN MAIN
AH,2 AH,2 CX,256 CX,256 DL,0 DL,0
; hàm xuất ký tự ; hàm xuất ký tự ; số ký tự cần xuất ; số ký tự cần xuất ; DL giữ mã ASCII của ký tự NUL ; DL giữ mã ASCII của ký tự NUL
;display character ;display character
MOV MOV MOV MOV MOV MOV PRINT_LOOP : PRINT_LOOP : INT INT INC INC DEC DEC JNZ JNZ
21H 21H DL DL CX CX PRINT_LOOP PRINT_LOOP
;nhảy đến print_loop nếu CX# 0 ;nhảy đến print_loop nếu CX# 0
;DOS EXIT ;DOS EXIT MOV MOV INT INT
AH,4CH AH,4CH 21H 21H
MAINENDP MAINENDP
END MAIN END MAIN
Biên soạn: Lê Minh Triết
Nhảy có dấu Nhảy có dấu
SYMBOL SYMBOL JG/JNLE JG/JNLE
CONDITION FOR JUMPS CONDITION FOR JUMPS ZF=0 and SF=OF ZF=0 and SF=OF
JGE/JNL JGE/JNL
JL/JNGE JL/JNGE
DESCRITION DESCRITION jump if greater than jump if greater than jump if not less than or equal to jump if not less than or equal to jump if greater than or equal to SF=OF jump if greater than or equal to SF=OF jupm if not less or equal to jupm if not less or equal to jump if less than jump if less than jump if not greater or equal jump if not greater or equal
SF<>OF SF<>OF
JLE/JNG JLE/JNG
jump if less than or equal ZF=1 or SF<>OF jump if less than or equal ZF=1 or SF<>OF jump if not greater jump if not greater
Biên soạn: Lê Minh Triết
Lệnh CMP ( Compare) Lệnh CMP ( Compare)
Các lệnh nhảy thường lấy kết qủa của lệnh Các lệnh nhảy thường lấy kết qủa của lệnh Compare như là điều kiện. Cú pháp của lệnh CMP Compare như là điều kiện. Cú pháp của lệnh CMP là : là :
CMP destination, source CMP destination, source
Lệnh này so sánh toán hạng nguồn và toán hạng Lệnh này so sánh toán hạng nguồn và toán hạng đích bằng cách tính hiệu Dest - Src. Kết qủa không đích bằng cách tính hiệu Dest - Src. Kết qủa không được cất giữ . Lệnh CMP giống như lệnh SUB, chỉ được cất giữ . Lệnh CMP giống như lệnh SUB, chỉ khác: lệnh CMP toán hạng đích không thay đổi. khác: lệnh CMP toán hạng đích không thay đổi.
Biên soạn: Lê Minh Triết
bấm y bấm y
“Good “Good
thông thông
báo báo
hay hay
ta ta
Hiển thị câu hỏi “Is if after 12 noon (Y/N)? và chờ ta bấm một phím, Hiển thị câu hỏi “Is if after 12 noon (Y/N)? và chờ ta bấm một phím, afternoon!”, Y Y nếu afternoon!”, nếu còn bấm n hay N (hay bất kỳ phím) thông báo “Good morning!” còn bấm n hay N (hay bất kỳ phím) thông báo “Good morning!”
IsAfternoon: ;Không gõ y hay Y
100h 100h
DX,GoodAfternoonMsg
.MODEL SMALL .MODEL SMALL .STACK .STACK .DATA .DATA
LEA JMP DisplayGreeting
DB DB
IsMorning:
‘Is it after 12 noon (Y/N)?$ ‘Is it after 12 noon (Y/N)?$ LABEL BYTE LABEL BYTE
LEA
DX,GoodMorningMsg
TimePrompt TimePrompt GoodMorningMsg GoodMorningMsg DB DB 0Dh,0Ah, ‘Good morning!’,0Dh,0Ah,’$’ 0Dh,0Ah, ‘Good morning!’,0Dh,0Ah,’$’
GoodAfternoonMsg GoodAfternoonMsg LABEL BYTE LABEL BYTE
DB DB 0Dh,0Ah, ‘Good afternoon!’,0Dh,0Ah,’$’ 0Dh,0Ah, ‘Good afternoon!’,0Dh,0Ah,’$’
.CODE .CODE
DisplayGreenting: MOV AH, 09h INT
21h
MOV AX,4C00h 21h INT Begin
END
Begin: Begin:
;Nhập một ký tự chứa vào AL ;Nhập một ký tự chứa vào AL
; Ký tự đã gõ là y? ; Ký tự đã gõ là y?
MOV MOV MOV MOV LEA LEA MOV MOV INT INT MOV MOV INT INT CMP CMP JZ JZ CMP CMP JNZ JNZ AX, @DATA AX, @DATA DS, AX DS, AX DX,TimePrompt DX,TimePrompt AH, 09h AH, 09h 21h 21h AH, 01h AH, 01h 21h 21h AL, ‘y’ AL, ‘y’ IsAfternoon ; Đúng, nhảy tới IsAfternoon IsAfternoon ; Đúng, nhảy tới IsAfternoon ;Ký tự gõ là Y? AL, ‘Y’ ;Ký tự gõ là Y? AL, ‘Y’ ;Không nhảy tới IsMorning ;Không nhảy tới IsMorning IsMorning IsMorning Biên soạn: Lê Minh Triết
Diễn dịch lệnh nhảy có điều kiện Diễn dịch lệnh nhảy có điều kiện
Ví dụ trên đây về lệnh CMP cho phép lệnh Ví dụ trên đây về lệnh CMP cho phép lệnh nhảy sau nó chuyển điều khiển đến nhãn nhảy sau nó chuyển điều khiển đến nhãn BELOW các lệnh BELOW các lệnh
CMP CMP JG JG
AX,BX AX,BX BELOW BELOW
có nghĩa là nếu AX>BX thì nhảy đến nhãn có nghĩa là nếu AX>BX thì nhảy đến nhãn BELOW BELOW
Biên soạn: Lê Minh Triết
Mặc dù lệnh CMP được thiết kế cho các Mặc dù lệnh CMP được thiết kế cho các lệnh nhảy. Nhưng lệnh nhảy có thể đứng lệnh nhảy. Nhưng lệnh nhảy có thể đứng trước 1 lệnh khác, chẳng hạn : trước 1 lệnh khác, chẳng hạn :
DEC DEC JL JL
AX AX THERE THERE có nghĩa là nếu AX trong diễn dịch có dấu có nghĩa là nếu AX trong diễn dịch có dấu < 0 thì điều khiển được chuyển cho < 0 thì điều khiển được chuyển cho THERE THERE
Biên soạn: Lê Minh Triết
3.11 Lệnh JMP 3.11 Lệnh JMP
Lệnh JMP ( jump) là lệnh nhảy không điều kiện. Lệnh JMP ( jump) là lệnh nhảy không điều kiện.
Cú pháp: Cú pháp:
JMP JMP
destination destination
Trong đó destination là một nhãn ở trong Trong đó destination là một nhãn ở trong
cùng 1 đọan với lệnh JMP. cùng 1 đọan với lệnh JMP.
Lệnh JMP dùng để khắc phục hạn chế của các Lệnh JMP dùng để khắc phục hạn chế của các lệnh nhảy có điều kiện (không quá 126 bytes kể lệnh nhảy có điều kiện (không quá 126 bytes kể từ vị trí của lệnh nhảy có điều kiện) từ vị trí của lệnh nhảy có điều kiện)
Biên soạn: Lê Minh Triết
Ví dụ chúng ta có đoạn chương Ví dụ chúng ta có đoạn chương trình sau : trình sau :
TOP: TOP:
; nếu CX>0 tiếp tục lặp ; nếu CX>0 tiếp tục lặp
; thân vòng lặp ; thân vòng lặp DEC DEC JNZ JNZ MOV MOV
CX CX TOP TOP AX,BX AX,BX
giả sử thân vòng lặp chứa nhiều lệnh mà nó vượt khỏi 126 bytes trước giả sử thân vòng lặp chứa nhiều lệnh mà nó vượt khỏi 126 bytes trước lệnh JNZ TOP . Có thể giải quyết tình trạng này bằng các lệnh sau : lệnh JNZ TOP . Có thể giải quyết tình trạng này bằng các lệnh sau : TOP: TOP:
; nếu CX>0 tiếp tục lặp ; nếu CX>0 tiếp tục lặp
CX CX BOTTOM BOTTOM EXIT EXIT
; thân vòng lặp ; thân vòng lặp DEC DEC JNZ JNZ JMP JMP BOTTOM: BOTTOM: JMP JMP
TOP TOP
EXIT: EXIT:
MOV MOV
AX,BX AX,BX
Biên soạn: Lê Minh Triết
3.12 Cấu trúc rẽ nhánh 3.12 Cấu trúc rẽ nhánh
Trong ngôn ngữ cấp cao cấu trúc rẽ nhánh Trong ngôn ngữ cấp cao cấu trúc rẽ nhánh cho phép một chương trình rẽ nhánh đến cho phép một chương trình rẽ nhánh đến những đoạn khác nhau tuỳ thuộc vào các những đoạn khác nhau tuỳ thuộc vào các điều kiện . Trong phần này chúng ta sẽ xem điều kiện . Trong phần này chúng ta sẽ xem xét 3 cấu trúc xét 3 cấu trúc
a. IF-THEN a. IF-THEN
b. IF_THEN_ELSE b. IF_THEN_ELSE
c. CASE c. CASE
Biên soạn: Lê Minh Triết
a. IF-THEN a. IF-THEN
Cấu trúc IF-THEN có thể diễn đạt như sau : Cấu trúc IF-THEN có thể diễn đạt như sau :
IF condition is true IF condition is true THEN THEN
execute true branch statements execute true branch statements
END IF END IF
Ví dụ : Thay thế giá trị trên AX bằng giá trị tuyết đối của nó Ví dụ : Thay thế giá trị trên AX bằng giá trị tuyết đối của nó
IF AX<0 IF AX<0 THEN THEN
replace AX by -AX replace AX by -AX
END-IF END-IF
Có thể mã hoá như sau : Có thể mã hoá như sau : ; if AX<0 ; if AX<0
CMP CMP JNL JNL
AX,0 AX,0 END_IF END_IF
; no, exit ; no, exit
;then ;then
NEG NEG
AX AX
; yes, đổi dấu ; yes, đổi dấu
END_IF : END_IF :
Biên soạn: Lê Minh Triết
b. IF_THEN_ELSE b. IF_THEN_ELSE
Có thể mã hoá như sau : Có thể mã hoá như sau :
IF condition is true IF condition is true
MOV MOV
AH,2 AH,2 ; chuẩn bị xuất ký tự ; chuẩn bị xuất ký tự
;if ;if
;AL<=BL? ;AL<=BL?
THEN THEN execute true branch statements execute true branch statements ELSE ELSE execute false branch statements execute false branch statements
AL<=BL AL<=BL CMP CMP JNBE JNBE
AL,BL AL,BL ELSE_ ELSE_
; nếu không nhỏ hơn hay = BL ; nếu không nhỏ hơn hay = BL
;then ;then
END_IF END_IF Ví dụ : giả sử AL và BL chứa ASCII code Ví dụ : giả sử AL và BL chứa ASCII code của 1 ký tự. Hãy xuất ra màn hình ký tự của 1 ký tự. Hãy xuất ra màn hình ký tự trước (theo thứ tự ký tự ). Thuật toán trước (theo thứ tự ký tự ). Thuật toán
MOV MOV JMP JMP
DL,AL DL,AL DISPLAY DISPLAY
ELSE_: ELSE_:
DL,BL DL,BL
MOV MOV DISPLAY: DISPLAY:
IF AL<= BL IF AL<= BL THEN THEN display AL display AL ELSE ELSE display character in BL display character in BL
INT INT
21H 21H
END_IF END_IF
END_IF : END_IF :
Biên soạn: Lê Minh Triết
c. CASE c. CASE
Case là một cấu trúc rẽ nhánh nhiều Case là một cấu trúc rẽ nhánh nhiều hướng. Cấu trúc của CASE như sau : hướng. Cấu trúc của CASE như sau : CASE expression CASE expression
AX,0 AX,0 NEGATIVE NEGATIVE ZERO ZERO positive positive
;test AX ;test AX ;AX<0 ;AX<0 ;AX=0 ;AX=0 ;AX>0 ;AX>0
value_1 : Statements_1 value_1 : Statements_1 value_2 : Statements_2 value_2 : Statements_2 … … value_n : Statements_n value_n : Statements_n
Có thể mã hoá như sau : Có thể mã hoá như sau : ; case AX ; case AX CMP CMP JL JL JE JE JG JG NEGATIVE: NEGATIVE:
MOV MOV JMP JMP
BX,-1 BX,-1 END_CASE END_CASE
Ví dụ : Nếu AX < 0 thì đặt -1 vào BX Ví dụ : Nếu AX < 0 thì đặt -1 vào BX Nếu AX = 0 thì đặt 0 vào BX Nếu AX = 0 thì đặt 0 vào BX Nếu AX > 0 thì đặt 1 vào BX Nếu AX > 0 thì đặt 1 vào BX
ZERO: ZERO:
Thuật toán : Thuật toán :
CASE CASE
MOV MOV JMP JMP
BX,0 BX,0 END_CASE END_CASE
BX,1 BX,1 END_CASE END_CASE
AX AX < 0 put -1 in BX < 0 put -1 in BX = 0 put 0 in BX = 0 put 0 in BX > 0 put 1 in BX > 0 put 1 in BX
POSITIVE: POSITIVE: MOV MOV JMP JMP END_CASE : END_CASE :
Biên soạn: Lê Minh Triết
Rẽ nhánh với tổ hợp các điều kiện Rẽ nhánh với tổ hợp các điều kiện
Đôi khi tình trạng rẽ nhánh trong các Đôi khi tình trạng rẽ nhánh trong các lệnh IF ,CASE cần một tổ hợp các lệnh IF ,CASE cần một tổ hợp các điều kiện dưới dạng : điều kiện dưới dạng :
Condition_1 Condition_1
AND AND
Condition_2 Condition_2
Condition_1 Condition_1
OR OR
Condition_2 Condition_2
Biên soạn: Lê Minh Triết
Ví dụ về điều kiện AND : Ví dụ về điều kiện AND :
Đọc 1 ký tự và nếu là ký tự hoa thì in ra MH. Đọc 1 ký tự và nếu là ký tự hoa thì in ra MH.
Thuật toán : Thuật toán : Read a character ( into AL) Read a character ( into AL) IF ( ‘A’<= character ) AND ( charater <= ‘Z’) IF ( ‘A’<= character ) AND ( charater <= ‘Z’)
THEN THEN display character display character
END_IF END_IF
Biên soạn: Lê Minh Triết
Ví dụ về điều kiện AND : Ví dụ về điều kiện AND : Đọc 1 ký tự và nếu là ký tự hoa thì in ra MH. Đọc 1 ký tự và nếu là ký tự hoa thì in ra MH.
; read a character ; read a character MOV AH,1 MOV AH,1 21H INT 21H INT
; character in AL ; character in AL
; IF ( ‘A’<= character ) AND ( charater <= ‘Z’) ; IF ( ‘A’<= character ) AND ( charater <= ‘Z’)
CMP AL,’A’ CMP AL,’A’ JNGE END_IF JNGE END_IF CMP AL,’Z’ CMP AL,’Z’ JNLE END_IF JNLE END_IF
; char >=‘A’? ; char >=‘A’? ;no, exit ;no, exit ; char <=‘Z’? ; char <=‘Z’? ; no exit ; no exit
; then display it ; then display it
MOV DL,AL MOV DL,AL MOV AH,2 MOV AH,2 21H 21H INT INT
END_IF : END_IF :
Biên soạn: Lê Minh Triết
Ví dụ về điều kiện OR : Đọc một ký tự , nếu ký tự đó là ‘Y’ hoặc ‘y’ Ví dụ về điều kiện OR : Đọc một ký tự , nếu ký tự đó là ‘Y’ hoặc ‘y’ in nó lên màn hình , ngược lại thì kết thúc chương trình . in nó lên màn hình , ngược lại thì kết thúc chương trình . thì thì
;IF ( chr =‘y’ ) OR ( chr = ‘Y’) ;IF ( chr =‘y’ ) OR ( chr = ‘Y’)
Thuật toán Thuật toán Read a charcter ( into AL) Read a charcter ( into AL) IF ( chr =‘Y’) OR ( chr=‘y’) IF ( chr =‘Y’) OR ( chr=‘y’)
THEN THEN dispplay it dispplay it
ELSE ELSE
; chr =‘y’? ; chr =‘y’? CMP AL,’y’ CMP AL,’y’ THEN ;=, in Chr THEN ;=, in Chr JE JE CMP AL,’Y’ ; chr =‘Y’? CMP AL,’Y’ ; chr =‘Y’? THEN ;=, in Chr THEN ;=, in Chr JE JE ELSE_ ;<> , terminate JMP ELSE_ ;<> , terminate JMP THEN : THEN :
terminate the program terminate the program
END_IF END_IF
MOV DL,AL MOV DL,AL MOV AH,2 MOV AH,2 21H INT 21H INT END_IF JMP END_IF JMP
ELSE_: ELSE_:
MOV AH,4CH MOV AH,4CH INT INT
21h 21h
Code Code ;read a character ;read a character MOV AH,1 MOV AH,1 21H 21H INT INT ; character in AL ; character in AL
END_IF : END_IF :
Biên soạn: Lê Minh Triết
3.13 Cấu trúc lặp 3.13 Cấu trúc lặp
Một vòng lặp gồm nhiều lệnh được Một vòng lặp gồm nhiều lệnh được lặp lại, số lần lặp phụ thuộc điều kiện. lặp lại, số lần lặp phụ thuộc điều kiện.
a. Vòng FOR a. Vòng FOR b. Vòng WHILE b. Vòng WHILE c. Vòng REPEAT c. Vòng REPEAT
Biên soạn: Lê Minh Triết
a. Vòng FOR a. Vòng FOR
Lệnh LOOP có thể dùng để thực hiện vòng FOR. Lệnh LOOP có thể dùng để thực hiện vòng FOR. Cú pháp : Cú pháp :
LOOP LOOP
destination_label destination_label
Số đếm cho vòng lặp là thanh ghi CX mà ban đầu nó Số đếm cho vòng lặp là thanh ghi CX mà ban đầu nó được gán 1 giá trị nào đó . Khi lệnh LOOP được thực hiện được gán 1 giá trị nào đó . Khi lệnh LOOP được thực hiện CX sẽ tự động giảm đi 1. Nếu CX chưa bằng 0 thì vòng CX sẽ tự động giảm đi 1. Nếu CX chưa bằng 0 thì vòng lặp được thực hiện tiếp tục. Nếu CX=0 lệnh sau lệnh LOOP lặp được thực hiện tiếp tục. Nếu CX=0 lệnh sau lệnh LOOP được thực hiện được thực hiện Dùng lệnh LOOP , vòng FOR có thể thực hiện như sau : Dùng lệnh LOOP , vòng FOR có thể thực hiện như sau :
; gán cho cho CX số lần lặp ; gán cho cho CX số lần lặp TOP: TOP: ; thân của vòng lặp ; thân của vòng lặp LOOP TOP LOOP TOP
Biên soạn: Lê Minh Triết
Ví dụ : Dùng vòng lặp in ra 1 Ví dụ : Dùng vòng lặp in ra 1 hàng 80 dấu ‘*’ hàng 80 dấu ‘*’
MOV CX,80 MOV CX,80 MOV AH,2 MOV AH,2 MOV DL,’*’ MOV DL,’*’
; CX chưá số lần lặp ; CX chưá số lần lặp ; hàm xuất ký tự ; hàm xuất ký tự ;DL chưá ký tự ‘*’ ;DL chưá ký tự ‘*’
TOP: TOP:
INT 21h INT 21h LOOP TOP LOOP TOP
; in dấu ‘*’ ; in dấu ‘*’ ; lặp 80 lần ; lặp 80 lần
Lưu ý rằng vòng FOR cũng như lệnh LOOP thực Lưu ý rằng vòng FOR cũng như lệnh LOOP thực hiện ít nhất là 1 lần. Do đo nếu ban đầu CX=0 thì hiện ít nhất là 1 lần. Do đo nếu ban đầu CX=0 thì vòng lặp sẽ thực hiện lặp đến 65535 lần. Để vòng lặp sẽ thực hiện lặp đến 65535 lần. Để tránh tình trạng này, lệnh JCXZ (Jump if CX is tránh tình trạng này, lệnh JCXZ (Jump if CX is zero) phải được dùng trước vòng lặp. zero) phải được dùng trước vòng lặp.
Biên soạn: Lê Minh Triết
Lệnh JXCZ có cú pháp như sau : Lệnh JXCZ có cú pháp như sau : JCXZ destination_label JCXZ destination_label
chuyển cho chuyển cho Nếu CX=0 điều khiển được Nếu CX=0 điều khiển được destination_label. Các lệnh sau đây sẽ đảm bảo destination_label. Các lệnh sau đây sẽ đảm bảo vòng lặp không thực hiện nếu CX=0 vòng lặp không thực hiện nếu CX=0
JCXZ SKIP JCXZ SKIP
TOP : TOP :
; thân vòng lặp ; thân vòng lặp LOOP TOP LOOP TOP
SKIP : SKIP :
Biên soạn: Lê Minh Triết
b. Vòng WHILE b. Vòng WHILE
Vòng WHILE phụ thuộc vào 1 điều kiện. Nếu điều kiện Vòng WHILE phụ thuộc vào 1 điều kiện. Nếu điều kiện thực hiện vòng WHILE. Vì vậy nếu điều kiện sai thực hiện vòng WHILE. Vì vậy nếu điều kiện sai
đúng thì đúng thì thì vòng WHILE không thực hiện gì cả . thì vòng WHILE không thực hiện gì cả . Ví dụ : Viết đoạn mã đếm số ký tự được nhập vào trên Ví dụ : Viết đoạn mã đếm số ký tự được nhập vào trên cùng một hàng . cùng một hàng .
MOV DX,0 MOV DX,0 AH,1 MOV AH,1 MOV 21h 21h INT INT
; DX để đếm số ký tự ; DX để đếm số ký tự ;hàm đọc 1 ký tự ;hàm đọc 1 ký tự ; đọc ký tự vào AL ; đọc ký tự vào AL
WHILE_: WHILE_:
; có phải là ký tự CR? ; có phải là ký tự CR?
CMP CMP JE JE INC INC INT INT JMP WHILE_ JMP WHILE_
AL,0DH AL,0DH END_WHILE ; đúng , thoát END_WHILE ; đúng , thoát ;tăng DX lên 1 ;tăng DX lên 1 DX DX ; đọc ký tự ; đọc ký tự 21h 21h ; lặp ; lặp
END_WHILE : END_WHILE :
Biên soạn: Lê Minh Triết
c. Vòng REPEAT c. Vòng REPEAT
Cấu trúc REPEAT: Cấu trúc REPEAT:
repeat repeat until until
statements statements condition condition
Trong cấu trúc repeat mệnh đề được thi hành đồng thời điều Trong cấu trúc repeat mệnh đề được thi hành đồng thời điều
kiện được kiểm tra. Nếu điều kiện đúng thì vòng lặp kết thúc. kiện được kiểm tra. Nếu điều kiện đúng thì vòng lặp kết thúc. Ví dụ : Viết đoạn mã đọc vào các ký tự cho đến khi gặp ký tự trống . Ví dụ : Viết đoạn mã đọc vào các ký tự cho đến khi gặp ký tự trống .
MOV MOV
AH,1 AH,1
; đọc ký tự ; đọc ký tự
REPEAT: REPEAT:
INT INT
21h 21h
; ký tự trên AL ; ký tự trên AL
;until ;until
‘ ‘
; AL=‘ ‘? ; AL=‘ ‘?
CMP CMP JNE JNE
AL,’ AL,’ REPEAT REPEAT
Lưu ý: REPEAT tiến hành ít nhất 1 lần, trong khi đó WHILE có thể Lưu ý: REPEAT tiến hành ít nhất 1 lần, trong khi đó WHILE có thể không tiến hành lần nào nếu từ đầu điều kiện bị sai. không tiến hành lần nào nếu từ đầu điều kiện bị sai.
Biên soạn: Lê Minh Triết
3.14 Lập trình với cấu trúc cấp cao 3.14 Lập trình với cấu trúc cấp cao
Bài toán : Viết chương trình nhắc người dùng Bài toán : Viết chương trình nhắc người dùng gõ vào một dòng văn bản. Đếm số ký tự vừa gõ vào một dòng văn bản. Đếm số ký tự vừa nhập vào và in ra kết quả nhập vào và in ra kết quả
Kết qủa chạy chương trình sẽ như sau : Kết qủa chạy chương trình sẽ như sau : Nhap vao 1 dong ky tu: Nhap vao 1 dong ky tu: SU PHAM SU PHAM So ky tu nhap vao = 7 So ky tu nhap vao = 7
Biên soạn: Lê Minh Triết
WHILE_:
AL,0DH
END_WHILE;
100h 100h
CMP ; có phải là ký tự CR? JE đúng , thoát INC
DX
.MODEL SMALL .MODEL SMALL .STACK .STACK .DATA .DATA
;tăng DX lên 1
Tbao DB Tbao DB Tbao2 DB Tbao2 DB DB DB Sokt Sokt ‘Nhap vao 1 dong ky tu:$’ ‘Nhap vao 1 dong ky tu:$’ 0Dh,0Ah, ‘‘So ky tu ban nhap vao la:’ 0Dh,0Ah, ‘‘So ky tu ban nhap vao la:’ ?,’$’ ?,’$’
INT
21h
.CODE .CODE
; đọc ký tự
JMP
WHILE_
; lặp END_WHILE :
MOV Sokt,DX
Begin: Begin:
DX,Tbao2
LEA MOV AH, 09h INT
21h
MOV MOV MOV MOV LEA LEA MOV MOV INT INT AX, @DATA AX, @DATA DS, AX DS, AX DX,Tbao DX,Tbao AH, 09h AH, 09h 21h 21h
END
MOV AX,4C00h 21h INT Begin Biên soạn: Lê Minh Triết
MOV MOV MOV MOV INT INT DX,0 DX,0 AH,1 AH,1 21h 21h ; DX để đếm số ký tự ; DX để đếm số ký tự ;hàm đọc 1 ký tự ;hàm đọc 1 ký tự ; đọc ký tự vào AL ; đọc ký tự vào AL
3.14 Lập trình với cấu trúc cấp cao 3.14 Lập trình với cấu trúc cấp cao
Bài toán : Viết chương trình nhắc người dùng Bài toán : Viết chương trình nhắc người dùng gõ vào một dòng văn bản. Trên 2 dòng tiếp gõ vào một dòng văn bản. Trên 2 dòng tiếp theo in ra ký tự viết hoa đầu tiên và ký tự viết theo in ra ký tự viết hoa đầu tiên và ký tự viết hoa cuối cùng theo thứ tự alphabetical. Nếu hoa cuối cùng theo thứ tự alphabetical. Nếu người dùng gõ vào một ký tự thường, máy sẽ người dùng gõ vào một ký tự thường, máy sẽ thông báo ‘No capitals’ thông báo ‘No capitals’
Kết qủa chạy chương trình sẽ như sau : Kết qủa chạy chương trình sẽ như sau : Type a line of text : Type a line of text : TRUONG DAI HOC SU PHAM TRUONG DAI HOC SU PHAM First capital = A First capital = A Last capital = U Last capital = U
Biên soạn: Lê Minh Triết
Để giải bài toán này ta dùng kỹ thuật lập Để giải bài toán này ta dùng kỹ thuật lập trình TOP-DOWN, nghĩa là chia nhỏ bài trình TOP-DOWN, nghĩa là chia nhỏ bài toán thành nhiều bài toán con. Có thể toán thành nhiều bài toán con. Có thể chia bài toán thành 3 bài toán con như chia bài toán thành 3 bài toán con như sau : sau :
1. Xuất 1 chuỗi ký tự ( lời nhắc) 1. Xuất 1 chuỗi ký tự ( lời nhắc) 2. Đọc và xử lý 1 dòng văn bản 2. Đọc và xử lý 1 dòng văn bản 3. In kết qủa 3. In kết qủa
Biên soạn: Lê Minh Triết
Bước 1: Hiện dấu nhắc . Bước 1: Hiện dấu nhắc .
Bước này có thể mã hoá như sau : Bước này có thể mã hoá như sau :
; hàm xuất chuỗi ; hàm xuất chuỗi
MOV AH,9 MOV AH,9 LEA DX,PRMOPT ;lấy địa chỉ chuỗi vào DX LEA DX,PRMOPT ;lấy địa chỉ chuỗi vào DX INT 21H INT 21H
; xuất chuỗi ; xuất chuỗi
Dấu nhắc có thể mã hoá như sau trong đoạn số liệu . Dấu nhắc có thể mã hoá như sau trong đoạn số liệu . PROMPT DB PROMPT DB
‘Type a line of text:’,0DH,0AH,’$’ ‘Type a line of text:’,0DH,0AH,’$’
Biên soạn: Lê Minh Triết
Bước 2 : Đọc và xử lý một Bước 2 : Đọc và xử lý một dòng văn bản dòng văn bản
Đọc các ký tự từ bàn phím , tìm ra ký tự đầu và ký tự cuối , nhắc nhở người dùng Đọc các ký tự từ bàn phím , tìm ra ký tự đầu và ký tự cuối , nhắc nhở người dùng nếu ký tự gõ vào không phải là ký tự hoa. nếu ký tự gõ vào không phải là ký tự hoa.
Có thể biễu diễn bước này bởi thuật toán sau : Có thể biễu diễn bước này bởi thuật toán sau :
Read a character Read a character WHILE character is not a carrige return DO WHILE character is not a carrige return DO IF character is a capital (*) IF character is a capital (*)
THEN THEN
IF character precedes first capital IF character precedes first capital
Then Then
first capital= character first capital= character
End_if End_if IF character follows last character IF character follows last character
Then Then
last character = character last character = character
End_if End_if
END_IF END_IF
Read a character Read a character
Trong đó dòng (*) có nghĩa là điều kiện để ký tự là hoa là điều kiện AND Trong đó dòng (*) có nghĩa là điều kiện để ký tự là hoa là điều kiện AND
END_WHILE END_WHILE
IF ( ‘A’<= character ) AND ( character <= ‘Z’) IF ( ‘A’<= character ) AND ( character <= ‘Z’)
Biên soạn: Lê Minh Triết
MOV MOV INT INT AH,1 AH,1 21H 21H ; đọc ký tự ; đọc ký tự ; ký tự trên AL ; ký tự trên AL CHECK_LAST: CHECK_LAST: ; nếu ký tự là sau biến LAST ( giá trị ban đầu là ; nếu ký tự là sau biến LAST ( giá trị ban đầu là
WHILE : WHILE : ;trong khi ký tự gõ vào không phải là CR thì ;trong khi ký tự gõ vào không phải là CR thì
‘@’: ký tự trước A) ‘@’: ký tự trước A) CMP CMP JNG JNG thực hiện thực hiện
AL,LAST ; char > LAST ? AL,LAST ; char > LAST ? ; <= ; <= END_IF END_IF ;thì ký tự cuối cùng = ký tự ;thì ký tự cuối cùng = ký tự ; CR? ; CR?
MOV MOV LAST, AL ;LAST = character LAST, AL ;LAST = character CMP CMP JE JE AL,0DH AL,0DH END_WHILE ;yes, thoát END_WHILE ;yes, thoát
; nếu ký tự là hoa ; nếu ký tự là hoa
; char >=‘A’? ; char >=‘A’?
;end_if ;end_if END_IF : END_IF : ; đọc một ký tự ; đọc một ký tự CMP CMP JNGE JNGE AL,’A’ AL,’A’ END_IF END_IF
; ký tự trên AL ; ký tự trên AL ;không phải ký tự hoa thì nhảy đến END_IF ;không phải ký tự hoa thì nhảy đến END_IF
21H 21H WHILE_ ; lặp WHILE_ ; lặp ; char <= ‘Z’? ; char <= ‘Z’?
CMP CMP JNLE JNLE
AL,’Z’ AL,’Z’ END_IF END_IF ; không phải ký tự hoa thì nhảy đến END_IF ; không phải ký tự hoa thì nhảy đến END_IF
INT INT JMP JMP END_WHILE: END_WHILE: Các biến FIRST và LAST định nghĩa như sau: Các biến FIRST và LAST định nghĩa như sau: ‘[ $‘ FIRST ‘[ $‘ FIRST ‘@ $ ’ LAST ‘@ $ ’ LAST DB DB DB DB ;‘[‘ là ký tự sau Z ;‘[‘ là ký tự sau Z ;‘@’ là ký tự trước A ;‘@’ là ký tự trước A ; thì ; thì ; nếu ký tự nằm trước biến FIRST (giá trị ban ; nếu ký tự nằm trước biến FIRST (giá trị ban
đầu là‘[‘ : ký tự sau Z ) đầu là‘[‘ : ký tự sau Z )
CMP
CMP
JNL
JNL AL,FISRT ; char
; thì ký tự viết hoa đầu tiên = ký tự ; thì ký tự viết hoa đầu tiên = ký tự
MOV MOV FIRST,AL FIRST,AL ;FIRST=chr. ;FIRST=chr.
;end_if ;end_if
Biên soạn: Lê Minh Triết
MOV MOV INT INT
; đọc ký tự ; đọc ký tự AH,1 AH,1 ; ký tự trên AL 21H ; ký tự trên AL 21H ;trong khi ký tự gõ vào không phải là CR ;trong khi ký tự gõ vào không phải là CR
thì thực hiện thì thực hiện
CMP CMP JE JE
AL,0DH ; CR? AL,0DH ; CR? END_IF ; thoát END_IF ; thoát
;Xet ktu in hoa ;Xet ktu in hoa
; char >=‘A’? ; char >=‘A’?
; char <= ‘Z’? ; char <= ‘Z’?
CMP CMP JNGE JNGE CMP CMP JNLE JNLE
AL,’A’ AL,’A’ END_IF END_IF AL,’Z’ AL,’Z’ END_IF ; không phải END_IF ; không phải
ký tự hoa thì nhảy đến END_IF ký tự hoa thì nhảy đến END_IF
; nếu thỏa thì ; nếu thỏa thì
;Thong bao ra MH la kt in hoa ;Thong bao ra MH la kt in hoa
Else_: Else_:
;Thong bao ra MH o la kt in hoa ;Thong bao ra MH o la kt in hoa
END_IF : END_IF :
Biên soạn: Lê Minh Triết
Bước 3 : In kết qủa Bước 3 : In kết qủa
Thuật toán Thuật toán
IF no capital were typed IF no capital were typed THEN THEN
display ‘No capital’ display ‘No capital’
ELSE ELSE
display first capital and last capital display first capital and last capital
END_IF END_IF
Bước 3 sẽ phải in ra các thông báo : Bước 3 sẽ phải in ra các thông báo : NOCAP_MSG nếu không phải chữ in NOCAP_MSG nếu không phải chữ in CAP1_MSG chữ in đầu tiên CAP1_MSG chữ in đầu tiên CAP2_MSG chữ in cuối cùng CAP2_MSG chữ in cuối cùng
Chúng được định nghĩa như sau trong đoạn số liệu . Chúng được định nghĩa như sau trong đoạn số liệu . DB DB DB DB DB DB DB DB DB DB
0DH,0AH,‘No capitals $’ 0DH,0AH,‘No capitals $’ 0DH,0AH, ‘First capital= ’ 0DH,0AH, ‘First capital= ’ ‘[ $ ’ ‘[ $ ’ 0DH,0AH,‘Last capital=’ 0DH,0AH,‘Last capital=’ ‘@ $’ ‘@ $’
NOCAP_MSG NOCAP_MSG CAP1_MSG CAP1_MSG FIRST FIRST CAP2_MSG CAP2_MSG LAST LAST
Biên soạn: Lê Minh Triết
Bước 3 có thể mã hoá như sau : Bước 3 có thể mã hoá như sau :
AH,9 AH,9
; hàm xuất ký tự ; hàm xuất ký tự
;in kết quả ;in kết quả MOV MOV
; IF không có chữ hoa nào được nhập thì FIRST =‘[’ ; IF không có chữ hoa nào được nhập thì FIRST =‘[’
FIRST,’[’ FIRST,’[’
; FIRST=‘[’ ? ; FIRST=‘[’ ? ; không , in kết qủa ; không , in kết qủa
CMP CMP JNE CAPS JNE CAPS
;THEN ;THEN
LEA DX,NOCAP_MSG LEA DX,NOCAP_MSG INT 21H INT 21H
CAPS: CAPS:
LEA DX,CAP1_MSG LEA DX,CAP1_MSG INT 21H INT 21H LEA DX,CAP2_MSG LEA DX,CAP2_MSG INT 21H INT 21H
; end_if ; end_if
Biên soạn: Lê Minh Triết
Chương trình có thể viết như sau: Chương trình có thể viết như sau: SMALL SMALL 100h 100h
0DH,0AH, ‘No capitals $’ 0DH,0AH, ‘No capitals $’
‘[ $’ ‘[ $’
‘Type a line of text’, 0DH, AH, ‘$’ ‘Type a line of text’, 0DH, AH, ‘$’ DB DB 0DH,0AH, ‘First capital=’ 0DH,0AH, ‘First capital=’ DB DB ‘Last capital = ’ ‘Last capital = ’ DB DB
‘@ $’ ‘@ $’
PROC PROC
.MODEL .MODEL .STACK .STACK .DATA .DATA PROMPT DB PROMPT DB NOCAP_MSG NOCAP_MSG CAP1_MSG DB CAP1_MSG DB FIRST FIRST CAP2_MSG DB CAP2_MSG DB LAST LAST .CODE .CODE MAIN MAIN ; khởi tạo DS ; khởi tạo DS
MOV AX,@DATA MOV AX,@DATA MOV DS,AX MOV DS,AX
; in dấu nhắc ; in dấu nhắc
; hàm xuất chuỗi ; hàm xuất chuỗi
MOV AH,9 MOV AH,9 LEA LEA INT INT
DX,PROMPT ;lấy địa chỉ chuỗi vào DX DX,PROMPT ;lấy địa chỉ chuỗi vào DX ; xuất chuỗi ; xuất chuỗi 21H 21H
Biên soạn: Lê Minh Triết
;đọc và xử lý 1 dòng văn bản ;đọc và xử lý 1 dòng văn bản ; đọc ký tự AH,1 ; đọc ký tự AH,1 ; ký tự trên AL ; ký tự trên AL 21H 21H
MOV MOV INT INT
WHILE : WHILE : ;trong khi ký tự gõ vào không phải là CR thì thực hiện ;trong khi ký tự gõ vào không phải là CR thì thực hiện
; CR? ; CR?
AL,0DH AL,0DH END_WHILE ;yes, thoát END_WHILE ;yes, thoát
AL,’A’ AL,’A’
CMP CMP JE JE ; nếu ký tự là hoa ; nếu ký tự là hoa CMP CMP JNGE END_IF JNGE END_IF CMP CMP JNLE JNLE
AL,’Z’ AL,’Z’ END_IF END_IF
; char >=‘A’? ; char >=‘A’? ;0 phải K.tự hoa, nhảy đến END_IF ;0 phải K.tự hoa, nhảy đến END_IF ; char <= ‘Z’? ; char <= ‘Z’? ; 0 phải k.tự hoa, nhảy đến END_IF ; 0 phải k.tự hoa, nhảy đến END_IF
; thì ; thì ; nếu ký tự nằm trước biến FIRST ; nếu ký tự nằm trước biến FIRST
; char < FIRST ? ; char < FIRST ?
CMP CMP JNL JNL
AL,FISRT AL,FISRT CHECK_LAST ; >= CHECK_LAST ; >=
; thì ký tự viết hoa đầu tiên = ký tự ; thì ký tự viết hoa đầu tiên = ký tự FIRST,AL FIRST,AL
MOV MOV
; FIRST=character ; FIRST=character
;end_if ;end_if
Biên soạn: Lê Minh Triết
CHECK_LAST: CHECK_LAST: ; nếu ký tự là sau biến LAST ; nếu ký tự là sau biến LAST
CMP CMP JNG JNG
AL,LAST AL,LAST END_IF END_IF
; char > LAST ? ; char > LAST ? ; <= ; <=
;thì ký tự cuối cùng = ký tự ;thì ký tự cuối cùng = ký tự
MOV LAST, AL MOV LAST, AL
;LAST = character ;LAST = character
;end_if ;end_if END_IF : END_IF : ; đọc một ký tự ; đọc một ký tự
21H 21H
INT INT JMP WHILE_ JMP WHILE_
; ký tự trên AL ; ký tự trên AL ; lặp ; lặp
END_WHILE: END_WHILE:
Biên soạn: Lê Minh Triết
;in kết quả ;in kết quả MOV AH,9 MOV AH,9
; hàm xuất ký tự ; hàm xuất ký tự
; IF không có chữ hoa nào được nhập thì FIRST =‘[‘ ; IF không có chữ hoa nào được nhập thì FIRST =‘[‘
CMP FIRST,’[‘ CMP FIRST,’[‘ JNE CAPS JNE CAPS
; FIRST=‘[‘ ? ; FIRST=‘[‘ ? ; không , in kết qủa ; không , in kết qủa
;Then ;Then
LEA DX,NOCAP_MSG LEA DX,NOCAP_MSG INT 21H INT 21H
CAPS: CAPS:
LEA DX,CAP1_MSG LEA DX,CAP1_MSG INT 21H INT 21H LEA DX,CAP2_MSG LEA DX,CAP2_MSG INT 21H INT 21H ; end_if ; end_if ; dos exit ; dos exit
MOV AH,4CH MOV AH,4CH INT 21h INT 21h MAIN ENDP MAIN ENDP END END
MAIN MAIN
Biên soạn: Lê Minh Triết
Bài tập1: Bài tập1:
Viết chương trình nhập vào 2 số (0-9), tính tổng, Viết chương trình nhập vào 2 số (0-9), tính tổng,
hiệu 2 số đó. hiệu 2 số đó.
Bài tập2: Bài tập2:
Nhập vào 1 số nguyên n, không dấu (1-9) Nhập vào 1 số nguyên n, không dấu (1-9) Tính tổng=1+2+..+N Tính tổng=1+2+..+N
Bài tập3: Bài tập3:
Nhập vào 1 dãy số Vd: 23145. Đếm số ký số có Nhập vào 1 dãy số Vd: 23145. Đếm số ký số có
trong dãy Vd: Day co 5 ky so. trong dãy Vd: Day co 5 ky so.
Bài tập4: Bài tập4:
Nhập vào 1 ký tự hoa ( ‘A’<=giả sử <= ‘Z’). Nhập vào 1 ký tự hoa ( ‘A’<=giả sử <= ‘Z’).
In dãy ký tự từ đó đến Z In dãy ký tự từ đó đến Z
Biên soạn: Lê Minh Triết
Mul desc Mul desc
Desc là thanh ghi bất kỳ, nhân với giá trị Desc là thanh ghi bất kỳ, nhân với giá trị
trong thanh ghi AL trong thanh ghi AL Kết quả lưu vào AX Kết quả lưu vào AX AAM AAM AH,AL AH,AL
Biên soạn: Lê Minh Triết

