Nếu không thì tiếp tục thực hiện lệnh tiếp theo JNZ == jump if not zero. Điều kiện[r]
(1)(2)Nhắc lại phương pháp định địa chỉ
Tức thời (trực hằng)
Toán hạng lệnh
Thanh ghi
Toán hạng ghi
Trực tiếp
Địa lệnh địa ô nhớ toán hạng
Gián tiếp qua ghi
Thanh ghi chứa địa ô nhớ tốn hạng
Gián tiếp nhớ
Địa lệnh địa ô nhớ toán hạng
Chỉ số (dịch chuyển)
Địa toán hạng tổng nội dung ghi độ dời
Tương đối
Tổng nội dung PC độ dời
(3)Thanh ghi CPU 8086
14 ghi 16 bit nhóm
Thanh ghi đoạn
CS (code segment), DS (data segment),
SS (stack segment), ES (extra segment) Thanh ghi trỏ
IP (instruction pointer), SP (stack pointer),
BP (base pointer) Thanh ghi số
SI (source index), DI (Destination index)
(4)Thanh ghi đa dụng
AX Accumulator register
Sử dụng cho tính tốn xuất nhập
BX Base register
Thanh ghi sử dụng số
CX Counter register
Sử dụng cho vòng lặp
DX Data register
Sử dụng cho xuất nhập lệnh nhân chia
Các ghi đa dụng “chia nhỏ” thành
(5)Thanh ghi cờ (Flag)
Flags Register
Tắt Tên bit n “Mô tả”
OF Overflow 11 Tràn số có dấu
DF Direction 10 Hướng xử lý chuỗi
IF Interrupt Cho phép ngắt
TF Trap CPU thực bước
SF Sign Kiểm tra kết số âm
ZF Zero Kiểm tra kết
AF Auxiliary Carry
PF Parity Kiểm tra số bit chẵn
(6)Ảnh hưởng lệnh đến cờ
Tại thời điểm CPU thực lệnh, kết cờ
phản ánh tình trạng CPU sau thực lệnh INSTRUCTION AFFECTS FLAGS
MOV/XCHG Không ảnh hưởng cờ
ADD/SUB Tất
INC/DEC Tất trừ CF
NEG Tất
Ví dụ:
ADD AX, BX (trong giả sử AX=BX=0FFFFh)
(7)(8)(9)Lệnh nhập xuất chuỗi kí tự
INT 21h
function number routine
09 Xuất chuỗi kí tự
Input : AH=09
DX= địa chuỗi ký tự kết thúc $
Output: chuỗi hình
Lệnh LEA ( Load Effective Address )
Lấy địa offset biến vào ghi LEA destination, source
(10)Program Segment Prefix ( PSP ) Chứa thông tin chương trình để hệ thống truy xuất 256 byte
Làm thay đổi DS, ES
MOV AX,@DATA
MOV DS,AX
@DATA tên đoạn số liệu DATA
(11)Chương trình nhập ký tự thường đổi thành ký tự hoa
TITLE PGM3: CASE COVERT PROGRAM MODEL SMALL
.STACK 100H DATA
CR EQU 0DH LF EQU 0AH
MSG1 DB ‘enter a lower case letter:$’
MSG2 DB 0DH,0AH,’in upper case it is :’
(12).CODE
MAIN PROC ; initialize ds
MOV AX,@DATA MOV DS,AX
;print prompt user
LEA DX,MSG1 ; MOV AH,9 INT 21H ;
(13);sub to convert SUB AL,20H ;
MOV CHAR, AL ; cất vào biến CHAR
;promt user
LEA DX, MSG2 ; MOV AH,9
INT 21H ;vì MSG khơng có dấu $ nên tiếp tục dấu
;$, lúc có kí tự hoa
;dos exit
MOV AH,4CH INT 21H
(14)Lệnh sử dụng stack
PUSH
Cú pháp: PUSH source
source: ghi, nhớ hay 16-bit để lưu vào stack
POP
Cú pháp: POP dest
dest: ghi, nhớ để lưu kết
(15)Lệnh sử dụng stack (tiếp theo) Qui tắc vào sau trước:
PUSH AX POP CX
PUSH BX POP BX
PUSH CX POP AX
PUSHA
Lưu theo thứ tự giá trị tất ghi AX,BX,CX,DX,SP,BP,SI,DI vào stack
POPA
Lấy giá trị stack vào ghi
(16)Lệnh XLAT
Translate
“Dịch” giá trị AL thành giá trị bảng vị trí xác định theo độ dời AL
Ứng dụng để chuyển đổi số liệu
Cú pháp: XLAT (khơng có tốn hạng)
‘Input’:
BX chứa địa bảng liệu AL chứa byte cần đổi
‘Output’:
(17)Lệnh XLAT (tiếp theo)
Ví dụ: đổi số thập phân <16 kí tự HEXA
Khai báo bảng kí tự
Bangkytu DB ‘0123456789ABCDEF’
Thực
MOV AL, 10 ;Nhập số cần đổi vào AL ví dụ =10
;thực đổi
MOV BX, offset Bangkytu ;lấy địa bảng liệu
XLAT ;AL chứa kí tự ‘A’
Làm để nhập vào số chữ số
(18)Các lệnh điều khiển
Lệnh nhảy
Có điều kiện
Không điều kiện
Biểu diễn ngôn ngữ cấp cao
Cấu trúc rẽ nhánh
IF
CASE
Compound condition
Cấu trúc lặp
(19)Ví dụ lệnh nhảy
TITLE PGR3-1: CHARACTER DISPLAY MODEL SMALL
STACK 100H CODE
MAIN PROC
MOV AH,2 ; hàm xuất kí tự
MOV CX,256 ; số kí tự cần xuất 0-255
MOV DL,0 ; DL mã ASCII kí tự NUL
PRINT_LOOP : ; nhãn thực vòng lặp INT 21H ; thực xuất kí tự
INC DL ; tăng DL lên kí tự DEC CX ; đếm giảm số kí tự chưa in
JNZ PRINT_LOOP ;nhảy đến PRINT_LOOP CX<>0 ;DOS EXIT
MOV AH,4CH INT 21H
MAIN ENDP
(20)Nhảy có điều kiện
Cú pháp: Jxxx destination_label
xxx viết tắt điều kiện
destination_label nhãn để nhảy đến
Nếu điều kiện thỏa mãn nhảy
Nếu khơng tiếp tục thực lệnh JNZ == jump if not zero
Điều kiện
Thanh ghi cờ
(21)Các lệnh nhảy có dấu
SYMBOL DESCRITION CONDITION
JG/JNLE jump if greater than
jump if not less than or equal to ZF=0 and SF=OF JGE/JNL jump if greater than or equal to
jump if not less or equal to SF=OF JL/JNGE jump if less than
jump if not greater or equal SF<>OF JLE/JNG jump if less than or equal
jump if not greater
(22)Các lệnh nhảy không dấu
SYMBOL DESCRITION CONDITION
JA/JNBE jump if above
jump if not below or equal CF=0 and ZF=0
JAE/JNB jump if above or equal
jump if not below or equal CF=0
JB/JNAE jump if below
jump if not above or equal CF=1
JBE/JNA jump if below or equal jump if not above
(23)Các lệnh nhảy cờ
SYMBOL DESCRITION CONDITION
JE/JZ jump if equal
jump if equal to zero ZF=1
JNE/JNZ jump if not equal
jump if not zero ZF=0
JC jump if carry CF=1
JNC jump if no carry CF=0
JO jump if overflow OF=1
JNO jump if not overflow OF=0
JS jump if sign negative SF=1
JNS jump if non-negative sign SF=0
JP/JPE jump if parity even PF=1
(24)Lệnh CMP
Thường dùng so sánh để lấy điều kiện
Cú pháp: CMP destination, source
Thực phép trừ destination – source để tính cờ từ
đó xác định điều kiện cho lệnh nhảy
Việc sử dụng lệnh nhảy có dấu hay khơng dấu
tùy diễn dịch lập trình viên Ví dụ: AX=7FFFh, BX=8000h
CMP AX,BX CMP AX,BX
JA lon_hon ;không nhảy JG lon_hon ;nhảy
Viết đoạn chương trình lấy số lớn AX
(25)Lệnh JMP
Nhảy không điều kiện
Cú pháp: JMP destination
Nhảy đoạn CS
Khắc phục phạm vi nhảy có điều kiện TOP:
; thân vòng lặp DEC CX
JNZ TOP MOV AX,BX
TOP:
; thân vòng lặp dài 126 bytes DEC CX
JNZ BOTTOM JMP EXIT
BOTTOM: JMP TOP EXIT:
(26)Biểu diễn ngôn ngữ cấp cao
Cấu trúc IF – THEN – END IF
IF (condition is true) THEN
execute true branch statements END IF
Ví dụ:
; if AX<0
CMP AX,0
JNL END_IF ; no , exit ;then
(27)Biểu diễn ngôn ngữ cấp cao (tt)
Cấu trúc IF – THEN – ELSE – END IF
IF condition is true THEN
exec true branch statements ELSE
exec false branch statements END_IF
IF AL<= BL THEN
display AL ELSE
display character in BL END_IF
MOV AH,2 ; prepare ;if AL<=BL
CMP AL,BL ;AL<=BL?
(28)Biểu diễn ngôn ngữ cấp cao (tt)
Cấu trúc CASE
CASE expression
value_1 : Statements_1 value_2 : Statements_2
value_n : Statements_n
CASE AX
< put -1 in BX = put in BX > put in BX
; case AX
CMP AX,0 ;test AX JL NEGATIVE ;AX<0 JE ZERO ;AX=0
(29) Rẽ nhánh với tổ
hợp điều kiện Condition_1 AND
Condition_2 Condition_1 OR
Condition_2
Read a character ( into AL) IF ( ‘A’<= character ) AND ( charater <= ‘Z’) THEN
display character END_IF
;read a character MOV AH,2
INT 21H ; character in AL
; IF ( ‘A’<= character ) AND ( charater <= ‘Z’)
CMP AL,’A’ ; char >=‘A’? JNGE END_IF ; no, exit
CMP AL,’Z’ ; char <=‘Z’? JNLE END_IF ; no exit
; then display it
MOV DL,AL MOV AH,2 INT 21H END_IF:
(30)Biểu diễn ngôn ngữ cấp cao (tt)
Rẽ nhánh với tổ
hợp điều kiện Condition_1 AND
Condition_2 Condition_1 OR
Condition_2
Read a character ( into AL) IF ( character =‘Y’) OR
( character=‘y’) THEN dispplay it ELSE
terminate the program
;read a character MOV AH,2
INT 21H ; character in AL ; IF ( character =‘y’ ) OR ( charater = ‘Y’)
CMP AL,’y’ ; char =‘y’?
(31)Biểu diễn ngôn ngữ cấp cao (tt)
Cấu trúc lặp FOR
LOOP destination_label
Lặp CX khác
Số đếm ghi CX giảm
Mẫu thực lệnh LOOP
MOV CX,20 ; gán cho cho CX số lần lặp 20 TOP:
… ; thân vòng lặp
LOOP TOP
(32)Cấu trúc lặp FOR (tt)
LOOP ln thực lần
CX = lặp FFFFh lần
Tránh lệnh JCXZ (Jump if CX is Zero)
MOV CX,… ; gán cho cho CX số lần lặp JCXZ SKIP
TOP:
… ; thân vòng lặp
LOOP TOP SKIP:
(33)Biểu diễn ngôn ngữ cấp cao (tt)
Cấu trúc lặp WHILE
Kiểm tra lặp điều kiện
MOV DX,0 ; DX để đếm skt MOV AH,1 ; hàm nhập kí tự INT 21h ; kí tự AL
WHILE_:
CMP AL,0DH ; kt=CR JE END_WHILE ; đúng, thoát INC DX ; DX tăng INT 21h ; đọc kt tiếp JMP WHILE_ ; lặp
END_WHILE :
Ví dụ:
Đếm số kí tự nhập 1 hàng (cho
(34)Biểu diễn ngôn ngữ cấp cao (tt)
Cấu trúc lặp REPEAT…UNTIL
Thực công việc kiểm tra điều kiện, điều kiện
vẫn sai lặp lại
Ví dụ viết đoạn mã nhập vào kí tự gặp
kí tự khoảng trắng
MOV AH,1 ; đọc kí tự REPEAT_:
INT 21h ; kí tự AL
;until