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 = CHECK_LAST; >=

; 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