(Sơ lược về thanh ghi cờ)

(cid:122) Thanh ghi cờ (Flag)

Bài 3: Lệnh nhảy – Lệnh lặp

(cid:122) 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. (cid:122) Mỗi bit gọi là 1 cờ (có trị 1: set, hoặc 0: clear)

(cid:122) CF (Carry flag) có trị 1 khi có nhớ hoặc mượn từ bit MSB (cid:122) ZF (Zero flag) có trị 1 khi kết quả là 0 (cid:122) SF (Sign flag) có trị 1 khi kết quả là âm (bit MSB là 1)

(cid:122) Cờ điều khiển: IF, DF, TF (cid:122) Cờ trạng thái:

(cid:122) 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)

(cid:122) Định nghĩa:

(cid:122) Thay đổi trật tự thực hiện các lệnh (thay vì tuần tự) (cid:122) Tùy thuộc vào tình huống, phản ánh ở trị các cờ

(cid:122) Các lệnh làm thay đổi cờ

(cid:122) Các lệnh tính toán sẽ thay đổi trị các cờ (cid:122) Lệnh CMP Đích, Nguồn

(Compare: So sánh)

(cid:131) Tương tự lệnh SUB nhưng không làm thay đổi trị đích (cid:131) Cũng thay làm thay đổi cờ (cid:131) Nếu Đích = Nguồn, ZF = 1 (cid:131) Nếu Đích > Nguồn, SF = 0, CF = 0 (cid:131) Nếu Đích < Nguồn, SF = 1, CF = 1

(cid:131) VD: MOV AL, 10

(cid:122) (Các thanh ghi sắp xếp theo chức năng)

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

CMP AL, 90h ; SF = 1, CF = 1

AL,'S'

(cấu trúc IF ... THEN ...) (đi sau các lệnh làm thay đổi cờ) (cid:122) Lệnh nhảy không điều kiện:

(cid:122) Các lệnh nhảy: Y AL = ‘s’

JMP Nhãn_đích

(cid:122) Lệnh nhảy theo điều kiện

(tùy thuộc tr/thái th/ghi cờ) nếu thỏa nhảy đến Nhãn.

DX,OFFSET Sang

Gán Chào Chiều

LàSáng: Gán Chào Sáng

Jxx Nhãn_đích (cid:131) (cid:131) Nhảy theo kết quả không dấu: JB, JA (cid:131) Nhảy theo kết quả có dấu: JL, LG (cid:131) Nhảy theo giá trị cờ:

JE (nhảy nếu bằng: Equal), JZ (nhảy nếu ZF=1) : ZF=1,

AH,9 ; hiển thị S hoặc C, chung INT 21h 21H

;Hien thi cau hoi ;Nhap tra loi AH,1 MOV INT 21H ;Kiem tra tra loi la 'S' hay 's' ;Neu dung nhay den LaSang AL,'s' CMP JE LaSang CMP JE LaSang ;Tra loi khac 'S' hay 's' ;Lay dia chi cau chao buoi chieu va hien thi MOV DX,OFFSET Chieu JMP Hienthi ;Tra loi la 'S' hay 's' ;Lay dia chi cau chao buoi sang va hien thi LaSang: MOV ;Hien thi cau chao Hienthi: MOV INT ;Ve DOS

(cid:122) Xem VD (trang 56) Chú ý: không có cấu trúc IF ... THEN ... ELSE

HiểnThị: Hiển thị Sáng

1

Lệnh lặp (Loop)

(cid:131) Vòng lặp thường kết thúc bằng 1 lệnh nhảy

(cid:122) VD trang 58

Các lệnh nhảy lặp: (cid:122) LOOP Nhãn

(cid:131) Biến đếm của vòng lặp sẽ là CX (cid:131) Phải khởi gán cho CX (số lần lặp) (cid:131) Sẽ giảm CX và kiểm tra nếu CX<>0 thì quay lại Nhãn

(xem VD trang 58)

(cid:131) Nếu muốn tạo 2 vòng lặp lồng nhau, dùng lệnh PUSH / POP

I = 256

(xem VD trang 58)

....

... .CODE MOV AH, 2 MOV CX, 256 MOV DL, 0 PrintLoop: INT 21H INC DL LOOP PrintLoop

I = I – 1 Y

... .CODE MOV AH, 2 MOV CX, 256 MOV DL, 0 PrintLoop: INT 21H INC DL DEC CX JNZ PrintLoop ...

...

(cid:131) LOOPE / LOOPZ

MOV CX, 5

Ngoai:

Tiếp tục lặp khi CX <> 0 và ZF = 1 (Hoặc kết thúc lặp khi .... )

(cid:131) LOOPNE / LOOPNZ

PUSH CX ...

MOV CX, 10

.CODE

Trong: ... LOOP Trong

POP CX LOOP Ngoai

Tiếp tục lặp khi CX <> 0 và ZF = 0 (Hoặc kết thúc lặp khi .... ) VD: Nhập 1 chuỗi ký tự dài tối đa 128 hoặc kết thúc bằng Enter (cid:131) (cid:131) MOV CX, 128 (cid:131) KeyLoop: (cid:131) MOV AH, 1 INT 21H (cid:131) (cid:131) CMP AL, 0Dh ; Ký tự vừa bấm là Enter (cid:131) 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

CX,4

I <> 0

BatDau: Nhập 1 ký tự (vào AL)

Bài tập

(cid:122) Lý thuyết: 3.1 đến 3.4 (thảo luận nhóm) (cid:122) Thực hành: 3.5 đến 3.13 (kiểm tra thực hành)

T AL < ‘0’

T AL > ‘9’

(Hướng dẫn: Mã ASCII

‘0’ < AL < ‘9’

8 : quay lui, back space 10 : xuống dòng, line feed, new line) 27 : phím ESC)

NhapLai: Thông báo SAI

AH,9 DX,OFFSET BaoSai1 21H BatDau AH,9 DX,OFFSET BaoSai2 21H

T CX <> 0

;Nhap so lan lap vao CX MOV ;Vong lap nhap ky tu va kiem tra BatDau: ;Nhap 1 ky tu MOV AH,1 INT 21H ;Kiem tra ky tu nhap co phai la so? CMP AL,'0' JB NhapLai CMP AL,'9' JA NhapLai JMP KetThuc NhapLai: MOV MOV INT LOOP MOV MOV INT KetThuc: ...

Thông báo dừng nhập

KetThuc: ... KetThuc: ...

2