Bài tập 2. Đọc ngày, tháng, năm của hệ thống, xuất ra màn hình kết quả theo định dạng: HOM NAY LA: dd:mm:yyyy
--------------------
Các bước
-
Xuất câu thông báo bằng hàm 9, ngắt 21
-
Đọc ngày, tháng, năm bằng hàm 2Ah, ngắt 21, ngày nằm trên DL, tháng nằm trên DH, năm nằm
trên CX
-
Đổi ngày (hệ 16) trên DL sang hệ 10, in ra màn
hình
-
In dấu “:”
-
Đổi tháng (hệ 16) trên DH sang hệ 10, in ra màn
hình
-
In dấu “:”
-
Đổi năm (hệ 16) trên CX sang hệ 10, in ra màn
hình.
--------------------
// Xuất câu thông báo
bằng hàm 9, ngắt 21
//nhập chuỗi vào offset 300
E300 “HOM NAY LA: $”
//gõ lệnh “ a” để nhập mã hợp ngữ
//gán offset của chuỗi kí tự “HOM NAY LA:” tới
thanh ghi DX
MOV DX, 300
//gọi hàm 9h của ngắt 21 để in ra màn hình chuỗi
kí tự trên
MOV AH, 9
INT 21
//gọi hàm 2Ah, ngắt 21 để đọc ngày, tháng, năm của
hệ thống
//ngày để trên DL, tháng để trên DH, năm để trên
CX
MOV AH, 2A
INT 21
//cất CX và DX
vào STACK, để giữ giá trị trên CX, DX đã đọc được,
//vì các thao tác tiếp theo sẽ làm thay đổi giá
trị của CX, DX
PUSH
CX
PUSH DX
//xuất ngày
//đổi ngày trên DL đang ở hệ 16 sang hệ 10 và
xuất,
//thực hiện bằng cách chia ngày
cho 10
//thương nằm trên AL, số dư nằm trên AH
//viết [thương + số dư] chính là kết quả ở hệ 10
//ví dụ: có một số hệ 16 là 13h, 13h/10 = 1 dư 9,
nghĩa là ngày 19.
//xóa thanh ghi AX
XOR AX, AX
//chuyển ngày từ DL sang AL (số bị chia phải nằm
trên AX)
MOV AL, DL
//số chia để trên CL, giá trị là 10
MOV CL, A
//lấy AX/CL, nghĩa là lấy ngày/10, thương để trên AL,
//số dư để trên AH
DIV CL
//cất AX vào STACK, để giữ lại kết quả của phép
chia vừa thực hiện
PUSH AX
//Xuất AL và AH dạng ASCII, đây chính là 2 số chỉ ngày
//Xuất AL
//xóa sạch DX
XOR DX, DX
//chuyển AL sang DL
MOV DL, AL
//chuyển DL sang dạng ASCII
ADD DL, 30
//hàm 2 ngắt 21 để xuất kí tự
MOV AH, 2
INT 21
//xuất AH
//xóa DX
XOR DX, DX
// lấy kết quả của phép chia đã cất trong STACK,
để xuất số dư nằm trên AH
POP DX
//xóa CX
XOR
CX, CX
//gán số lần dịch phải vào biến CL, dịch phải 8
bit
MOV CL, 8
//dịch phải DX 8 bit
SHR DX, CL
//chuyển DL sang mã ASCII
ADD DL, 30
//gọi hàm 2, ngắt 21 để xuất kí tự
MOV AH, 2
INT 21
//xuất dấu “:” mã ASCII là 3A
MOV DL, 3A
MOV AH, 2
INT 21
//xuất tháng
//xóa sạch AX
XOR AX, AX
//lấy tháng trong
STACK (do lệnh PUSH DX, tháng lưu trong DH) ra AX
POP AX
//gán số lần dịch phải
vào biến CL, dịch phải 8 bit
MOV CL, 8
//dịch phải AX 8 bit
SHR AX, CL
//gán 10 vào CL
MOV CL, A
//chia AL cho 10
DIV CL
//cất AX vào STACK, để lần lượt xuất thương và số dư đang nằm trên AX
PUSH AX
//xuất thương trên AL
//xóa DX
XOR DX, DX
//chuyển thương qua DL
MOV DL, AL
//chuyển DL sang mã ASCII
ADD DL, 30
//gọi hàm 2, ngắt 21 để xuất
MOV AH, 2
INT 21
//xuất số dư trên AH
//xóa DX
XOR DX, DX
//lấy thương + số dư trong STACK ra DX
POP DX
//số lần dịch phải là 8
MOV CL, 8
//dịch phải DX, 8 bit
SHR DX, CL
//chuyển DL sang mã ASCII
ADD DL, 30
//gọi hàm 2, ngắt 21 để xuất
MOV AH, 2
INT 21
//xuất năm dạng yyyy
--------------
Chia giá trị năm hệ 16 (ví dụ trên CX) cho 10
rồi viết ngược các số dư
Ví dụ: 2014 chia cho
10, các số dư sẽ là 4102. Cất các số dư vào stack, rồi lấy ra lại sẽ là 2014.
---------------
//xuất dấu “:” mã ASCII là 3A
MOV DL, 3A
MOV AH, 2
INT 21
//lấy giá trị năm đã
được cất (PUSH CX) trong STACK ra AX
POP AX
//xóa CX, để đặt biến
đếm
XOR CX, CX
//thực hiện phép chia
với số chia 16-bit
//số bị chia để trên
DX:AX
//số chia để trên BX
//thương để trên AX
//số dư để trên DX
//xóa DX, vì giá trị
năm chứa trên AX là đủ
XOR DX, DX
//gán số chia vào BX
MOV BX, A
//chia AX cho 10
DIV BX
//cất số dư trên DX vào STACK
PUSH DX
//tăng biến đếm lên 1
INC CX
//kiểm tra xem thương trên AX đã bằng 0 chưa?
CMP AX, 0
//nếu chưa bằng không, thực hiện chia tiếp, nhảy
tới XOR DX, DX
JNE (offset của lệnh XOR DX, DX) ví
dụ: JNE 165
//thực hiện chia xong (thương bằng 0)
//lấy giá trị trong STACK ra và in
//gọi hàm 2
MOV AH, 2
//lấy giá trị trong STACK ra DX
POP DX
//đổi sang mã ASCII
ADD DX, 30
//gọi ngắt 21
INT 21
//lặp lại lệnh POP DX. Lặp CX lần
LOOP (offset của lệnh POP DX) ví dụ:
LOOP 175
---------------------
2014/4/1