Kham bit dau tren AX - in gia tri he 10



Bài tập 3. Khám bit dấu trên AX,

-          Nếu giá trị dương: in dấu “+” và giá trị hệ 10 của AX.

-         Nếu giá trị âm: in dấu “-” và giá trị hệ 10 của AX.

----------------------
Các bước:
-         Thực hiện Test AX với 8000 (thực tế là thực hiện phép AND)
-         Khám cờ ZF: nếu ZF = 1 thì AX là số dương
o       Gọi hàm 2, in dấu +
o       Đổi AX ra hệ 10, in ra màn hình
-         Ngược lại (ZF = 0) thì AX là số âm
o       Gọi hàm 2, in dấu –
o       Bù 2 AX (NEG AX)
o       Đổi AX sang hệ 10 rồi in.
-----------------------
//chuyển giá trị AX, sang BX, vì AX cần sử dụng trong việc xuất dấu
            MOV BX, AX
//kiểm tra bit cực trái của BX là 0 hay 1
//dùng hàm TEST BX với một mặt nạ (ví dụ: 8000)
//thực tế TEST là phép toán AND trên bit, ảnh hưởng đến cờ ZF
            TEST BX, 8000
//nếu BX dương, bit cực trái sẽ là 0, cờ ZF mang giá trị 0
//nhảy tới đoạn mã:  xuất dấu + và chuyển BX sang hệ 10 rồi in ra kết quả           
            JZ (offset của phần in dấu +, đổi BX sang hệ 10, in giá trị), ví dụ: 112
//ngược lại, tức là ZF mang giá trị 1, thực hiện xuất dấu -,
//lấy bù 2 của BX
//đổi BX sang hệ 10, in giá trị)
//gọi hàm 2
            MOV AH, 2
//gán mã ASCII của dấu “-” vào DL
            MOV DL, 2D
//gọi ngắt 21 để in dấu “-”
            INT 21
//bù 2 BX để chuyển BX về giá trị nguyên thủy)
            NEG BX
//nhảy tới đoạn mã chuyển BX sang hệ 10, rồi in giá trị
            JMP (offset của đoạn mã chuyển BX sang hệ 10, rồi in giá trị), ví dụ: 118
//xuất dấu +
//gọi hàm 2
            MOV AH, 2
//gán mã ASCII của dấu “+” vào DL
            MOV DL, 2B
//gọi ngắt 21
            INT 21
//gán lại giá trị trong BX sang AX
            MOV AX, BX
//chuyển AX sang hệ 10, và in kết quả
//xóa CX để thiết lập biến đếm
            XOR CX, CX
//xóa DX để chắc chắn số bị chia chỉ có ở AX
            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 11C
//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 12C
------------------
2014/4/4