Xem mẫu
- (Sơ lược về thanh ghi cờ)
Bài 3:
z Thanh ghi cờ (Flag)
Lệnh nhảy – Lệnh lặp z Ghi nhận các thông tin điều khiển, trạng thái của
CPU và kết quả thực hiện lệnh sau cùng.
z Mỗi bit gọi là 1 cờ (có trị 1: set, hoặc 0: clear)
z Cờ điều khiển: IF, DF, TF
z Cờ trạng thái:
z CF (Carry flag) có trị 1 khi có nhớ hoặc mượn từ bit MSB
z ZF (Zero flag) có trị 1 khi kết quả là 0
z SF (Sign flag) có trị 1 khi kết quả là âm (bit MSB là 1)
z Các lệnh tính toán đều làm thay đổi cờ.
(Xem thêm chương 2)
Lệnh nhảy (Jump)
z (Các thanh ghi sắp xếp theo chức năng) z Định nghĩa:
z Thay đổi trật tự thực hiện các lệnh (thay vì tuần tự)
z Tùy thuộc vào tình huống, phản ánh ở trị các cờ
z Các lệnh làm thay đổi cờ
z Các lệnh tính toán sẽ thay đổi trị các cờ
z Lệnh CMP Đích, Nguồn (Compare: So sánh)
Tương tự lệnh SUB nhưng không làm thay đổi trị đích
Cũng thay làm thay đổi cờ
Nếu Đích = Nguồn, ZF = 1
Nếu Đích > Nguồn, SF = 0, CF = 0
Nếu Đích < Nguồn, SF = 1, CF = 1
VD: MOV AL, 10 CMP AL, 90h ; SF = 1, CF = 1
Nhập 1 ký tự. Nếu là ‘S’ hoặc ‘s’ thì chào Buổi sáng
Nếu khác thì chào Buổi chiều
;Hien thi cau hoi
;Nhap tra loi
MOV AH,1
INT 21H
;Kiem tra tra loi la 'S' hay 's'
z Các lệnh nhảy: ;Neu dung nhay den LaSang
(cấu trúc IF ... THEN ...) CMP AL,'s' Y AL = ‘s’
JE LaSang
(đi sau các lệnh làm thay đổi cờ) CMP AL,'S'
z Lệnh nhảy không điều kiện: JE LaSang
;Tra loi khac 'S' hay 's'
JMP Nhãn_đích ;Lay dia chi cau chao buoi chieu va hien thi Gán Chào Chiều
z Lệnh nhảy theo điều kiện MOV DX,OFFSET Chieu
Jxx Nhãn_đích JMP Hienthi
;Tra loi la 'S' hay 's'
(tùy thuộc tr/thái th/ghi cờ) nếu thỏa nhảy đến Nhãn.
;Lay dia chi cau chao buoi sang va hien thi
Nhảy theo kết quả không dấu: JB, JA LaSang: LàSáng:
Nhảy theo kết quả có dấu: JL, LG MOV DX,OFFSET Sang Gán Chào Sáng
Nhảy theo giá trị cờ: ;Hien thi cau chao
Hienthi:
JE (nhảy nếu bằng: Equal), JZ (nhảy nếu ZF=1) : ZF=1,
MOV AH,9 ; hiển thị S hoặc C, chung INT 21h HiểnThị:
z Xem VD (trang 56) INT 21H Hiển thị Sáng
Chú ý: không có cấu trúc IF ... THEN ... ELSE ;Ve DOS
1
- Lệnh lặp (Loop)
Vòng lặp thường kết thúc bằng 1 lệnh nhảy z VD trang 58
Các lệnh nhảy lặp: ... ...
z LOOP Nhãn .CODE .CODE
Biến đếm của vòng lặp sẽ là CX MOV AH, 2 MOV AH, 2
Phải khởi gán cho CX (số lần lặp) I = 256 MOV CX, 256 MOV CX, 256
Sẽ giảm CX và kiểm tra nếu CX0 thì quay lại Nhãn MOV DL, 0 MOV DL, 0
(xem VD trang 58) PrintLoop: PrintLoop:
Nếu muốn tạo 2 vòng lặp lồng nhau, dùng lệnh PUSH / POP .... INT 21H INT 21H
(xem VD trang 58)
INC DL INC DL
I=I–1 DEC CX LOOP PrintLoop
JNZ PrintLoop
Y
I 0 ... ...
MOV CX, 5 LOOPE / LOOPZ
Tiếp tục lặp khi CX 0 và ZF = 1
Ngoai: (Hoặc kết thúc lặp khi .... )
PUSH CX LOOPNE / LOOPNZ
Tiếp tục lặp khi CX 0 và ZF = 0
... (Hoặc kết thúc lặp khi .... )
MOV CX, 10 VD: Nhập 1 chuỗi ký tự dài tối đa 128 hoặc kết thúc bằng Enter
Trong: .CODE
MOV CX, 128
...
KeyLoop:
LOOP Trong MOV AH, 1
POP CX INT 21H
LOOP Ngoai CMP AL, 0Dh ; Ký tự vừa bấm là Enter
LOOPNE KeyLoop
(Push / Pop: đưa vào / lấy ra từ Stack)
Nhập 1 ký tự. Nếu là số: từ 0 đến 9 thì dừng
Nếu khác thì Báo nhập lại, tối đa 3 lần
BatDau:
;Nhap so lan lap vao CX
Nhập 1 ký tự
(vào AL)
MOV CX,4
;Vong lap nhap ky tu va kiem tra Bài tập
BatDau:
T ;Nhap 1 ky tu
AL < ‘0’
MOV AH,1 z Lý thuyết: 3.1 đến 3.4 (thảo luận nhóm)
INT 21H
T
;Kiem tra ky tu nhap co phai la so? z Thực hành: 3.5 đến 3.13 (kiểm tra thực hành)
AL > ‘9’ CMP AL,'0'
JB NhapLai (Hướng dẫn: Mã ASCII
CMP AL,'9'
‘0’ < AL < ‘9’
JA NhapLai
8 : quay lui, back space
JMP KetThuc 10 : xuống dòng, line feed, new line)
NhapLai: NhapLai:
Thông báo SAI MOV AH,9 27 : phím ESC)
MOV DX,OFFSET BaoSai1
INT 21H
T LOOP BatDau
CX 0
MOV AH,9
MOV DX,OFFSET BaoSai2
Thông báo dừng nhập INT 21H
KetThuc:
...
KetThuc:
KetThuc:
... ...
2
nguon tai.lieu . vn