Bài giảng Kiến trúc máy tính và hợp ngữ - Bài 3: Lệnh nhảy và lệnh lặp cung cấp cho người học các kiến thức: Sơ lược về thanh ghi cờ, lệnh nhảy, lệnh lặp. Đây là một tài liệu hữu ích dành cho các bạn sinh viên ngành Công nghệ thông tin và những ai quan tâm dùng làm tài liệu học tập và nghiên cứu.
Trang 1Bài 3:
Lệnh nhảy – Lệnh lặp
(Sơ lược về thanh ghi cờ)
zThanh ghi cờ (Flag)
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.
zMỗ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:
zCF (Carry flag) có trị 1 khi có nhớ hoặc mượn từ bit MSB
zZF (Zero flag) có trị 1 khi kết quả là 0
zSF (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)
z (Các thanh ghi sắp xếp theo chức năng)
Lệnh nhảy (Jump)
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
z Các lệnh nhảy:
(cấu trúc IF THEN )
(đi sau các lệnh làm thay đổi cờ)
zLệnh nhảy không điều kiện:
JMP Nhãn_đích
zLệnh nhảy theo điều kiện
Jxx Nhãn_đích
(tùy thuộc tr/thái th/ghi cờ) nếu thỏa nhảy đến Nhãn
Nhảy theo kết quả không dấu: JB, JA
Nhảy theo kết quả có dấu: JL, LG
Nhảy theo giá trị cờ:
JE (nhảy nếu bằng: Equal), JZ (nhảy nếu ZF=1) : ZF=1,
zXem VD (trang 56)
Chú ý: không có cấu trúc IF THEN ELSE
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
;Kiem tra tra loi la 'S' hay 's'
;Neu dung nhay den LaSang CMP AL,'s'
JE LaSang CMP AL,'S'
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 DX,OFFSET Sang
;Hien thi cau chao Hienthi:
MOV AH,9 ; hiển thị S hoặc C, chung INT 21h
;Ve DOS
AL = ‘s’
Gán Chào Chiều
LàSáng:
Gán Chào Sáng
HiểnThị:
Hiển thị Sáng Y
Trang 2Lệnh lặp (Loop)
Vòng lặp thường kết thúc bằng 1 lệnh nhảy
Các lệnh nhảy lặp:
zLOOP Nhãn
Biến đếm của vòng lặp sẽ là CX
Phải khởi gán cho CX (số lần lặp)
Sẽ giảm CX và kiểm tra nếu CX<>0 thì quay lại Nhãn
(xem VD trang 58)
Nếu muốn tạo 2 vòng lặp lồng nhau, dùng lệnh PUSH / POP
(xem VD trang 58)
z VD trang 58
.CODE MOV AH, 2
MOV CX, 256
MOV DL, 0 PrintLoop:
INT 21H INC DL
DEC CX JNZ PrintLoop
.CODE MOV AH, 2
MOV CX, 256
MOV DL, 0 PrintLoop:
INT 21H INC DL
LOOP PrintLoop
I = 256
I <> 0
I = I – 1 Y
MOV CX, 5
Ngoai:
PUSH CX
MOV CX, 10
Trong:
LOOP Trong
POP CX
LOOP Ngoai
(Push / Pop: đưa vào / lấy ra từ Stack)
LOOPE/ LOOPZ Tiếp tục lặp khi CX <> 0 và ZF = 1 (Hoặc kết thúc lặp khi )
LOOPNE/ LOOPNZ 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
CODE
MOV CX, 128
KeyLoop:
MOV AH, 1
INT 21H
CMP AL, 0Dh ; Ký tự vừa bấm là Enter
LOOPNE KeyLoop
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
;Nhap so lan lap vao CX MOV CX,4
;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 AH,9 MOV DX,OFFSET BaoSai1
LOOP BatDau
MOV AH,9 MOV DX,OFFSET BaoSai2
KetThuc:
AL < ‘0’
AL > ‘9’
NhapLai:
Thông báo SAI
BatDau:
Nhập 1 ký tự
(vào AL)
KetThuc:
T
T
‘0’ < AL < ‘9’
CX <> 0 T
KetThuc:
Thông báo dừng nhập
Bài tập
zLý thuyết: 3.1 đến 3.4 (thảo luận nhóm)
zThực hành: 3.5 đến 3.13 (kiểm tra thực hành)
(Hướng dẫn: Mã ASCII
8 : quay lui, back space
10 : xuống dòng, line feed, new line)
27 : phím ESC)