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