[Công nghệ Thông tin] -- [Web] -- [Công nghệ phần mềm] -- [PhoThong] -- [Đăng ký các khóa học] -- [Langbiang's Portfolio] -- [Học viên cũ] -- [10.000 giờ]
--------------- <> -----------------
---  KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM --->>>  CÁC KHÓA HỌC...
---  Nhận làm website, web app, chạy quảng cáo, digital marketing --->>>  LIÊN HỆ...

Tìm kiếm trong Blog

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