Doc va xuat ngay thang nam bang hop ngu



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