CÁC LỆNH HỢP NGỮ
Nhắc lại phương pháp định địa chỉ
Tức thời (trực hằng)
Thanh ghi
Địa chỉ toán hạng là tổng nội dung thanh ghi và độ dời
Tương đối
Địa chỉ trong lệnh là địa chỉ ô nhớ của toán hạng
Chỉ số (dịch chuyển)
Thanh ghi chứa địa chỉ ơ nhớ của tốn hạng
Gián tiếp ơ nhớ
Địa chỉ trong lệnh là địa chỉ ơ nhớ của tốn hạng
Gián tiếp qua thanh ghi
Toán hạng trong thanh ghi
Trực tiếp
Toán hạng trong lệnh
Tổng nội dung PC và độ dời
Stack
Thanh ghi SP chứa địa chỉ ơ nhớ của tốn hạng
Thanh ghi CPU 8086
14 thanh ghi 16 bit
5 nhóm
Thanh ghi đoạn
Thanh ghi con trỏ
IP (instruction pointer), SP (stack pointer),
BP (base pointer)
Thanh ghi chỉ số
CS (code segment), DS (data segment),
SS (stack segment), ES (extra segment)
SI (source index), DI (Destination index)
Thanh ghi đa dụng
Thanh ghi cờ
Thanh ghi đa dụng
AX Accumulator register
BX Base register
Sử dụng cho vịng lặp
DX Data register
Thanh ghi duy nhất có thể sử dụng chỉ số
CX Counter register
Sử dụng cho tính tốn và xuất nhập
Sử dụng cho xuất nhập và các lệnh nhân chia
Các thanh ghi đa dụng có thể “chia nhỏ” thành 2
thanh ghi 8-bit (cao và thấp)
AH,AL,BH,BL,CH,CL,DH,DL
Thanh ghi cờ (Flag)
Flags Register
Tắt
OF
DF
IF
TF
SF
ZF
AF
PF
CF
Tên
Overflow
Direction
Interrupt
Trap
Sign
Zero
Auxiliary Carry
Parity
Carry
bit n
11
10
9
8
7
6
4
2
0
“Mơ tả”
Tràn số có dấu
Hướng xử lý chuỗi
Cho phép ngắt
CPU thực hiện từng bước
Kiểm tra kết quả là số âm
Kiểm tra kết quả bằng 0
Kiểm tra số bit 1 chẵn
Tràn số không dấu
Ảnh hưởng các lệnh đến cờ
Tại 1 thời điểm CPU chỉ thực hiện 1 lệnh, kết quả
cờ phản ánh tình trạng CPU sau khi thực hiện lệnh
INSTRUCTION
AFFECTS FLAGS
MOV/XCHG
Không ảnh hưởng cờ
ADD/SUB
Tất cả
INC/DEC
Tất cả trừ CF
NEG
Tất cả
Ví dụ:
ADD AX, BX (trong đó giả sử AX=BX=0FFFFh)
Thay đổi các cờ???
SUB AL,BL ( trong đó AL=BL=80h)
Lệnh nhập xuất chuỗi kí tự
INT 21h
function number
09
routine
Xuất chuỗi kí tự
Input : AH=09
DX= địa chỉ chuỗi ký tự kết thúc bằng $
Output: chuỗi hiện ra màn hình
Lệnh LEA ( Load Effective Address )
Lấy địa chỉ offset của biến vào thanh ghi
LEA destination, source
LEA DX,MSG ; đưa địa chỉ MSG vào DX
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 .
Assembler sẽ chuyển @DATA thành địa chỉ.
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 :’
CHAR DB ?,’$’ ;
.CODE
MAIN PROC
; initialize ds
MOV AX,@DATA
MOV DS,AX
;print prompt user
LEA DX,MSG1 ; MOV AH,9
INT 21H ;
;input char to AL
MOV AH,1 ;
INT 21H ;
;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 cho đến dấu
;$, lúc này có cả kí tự hoa
;dos exit
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
Lệnh sử dụng stack
PUSH
POP
Cú pháp: PUSH source
source: thanh ghi, bộ nhớ hay hằng 16-bit để lưu
vào stack
Cú pháp: POP dest
dest: thanh ghi, bộ nhớ để lưu kết quả
Cặp thanh ghi xác định đỉnh stack
SS:SP
Lệnh sử dụng stack (tiếp theo)
Qui tắc vào sau ra trước:
1
2
3
POP CX
POP BX
POP AX
3
2
1
PUSHA
PUSH AX
PUSH BX
PUSH CX
Lưu theo thứ tự giá trị của tất cả các thanh ghi
AX,BX,CX,DX,SP,BP,SI,DI vào stack
POPA
Lấy ra giá trị trong stack vào các thanh ghi
AX,BX,CX,DX,SP,BP,SI,DI theo thứ tự ngược lại
Lệnh XLAT
Translate
“Dịch” giá trị trong AL thành giá trị mới trong bảng
tại vị trí xác định theo độ dời bằng 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 chỉ bảng dữ liệu
AL chứa byte cần đổi
‘Output’:
AL chứa giá trị tìm thấy trong bảng tại địa chỉ BX+AL
Lệnh XLAT (tiếp theo)
Ví dụ: đổi số thập phân <16 ra kí tự HEXA
Khai báo bảng kí tự
Bangkytu DB ‘0123456789ABCDEF’
Thực hiện
MOV AL, 10
;Nhập số cần đổi vào AL ví dụ =10
;thực hiện đổi
MOV BX, offset Bangkytu
;lấy địa chỉ bảng dữ liệu
XLAT
;AL chứa kí tự ‘A’
Làm thế nào để nhập vào một số 1 chữ số
trong khi hàm 01 của INT 21h chỉ nhập kí tự?
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
FOR
WHILE
REPEAT
Ví dụ về 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 của kí tự NUL
PRINT_LOOP :
; nhãn thực hiện vòng lặp
INT 21H
; thực hiện xuất kí tự
INC DL
; tăng DL lên kí tự tiếp theo
DEC CX
; đếm giảm số kí tự chưa in
JNZ PRINT_LOOP
;nhảy đến PRINT_LOOP nếu CX<>0
;DOS EXIT
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
Nhảy có điều kiện
Cú pháp: Jxxx destination_label
Nếu điều kiện được thỏa mãn thì nhảy
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
xxx là viết tắt của điều kiện
destination_label là nhãn để nhảy đến
Thanh ghi cờ
Phạm vi nhảy
Không quá 126 bytes
Các lệnh nhảy có dấu
SYMBOL
DESCRITION
JG/JNLE
jump if greater than
jump if not less than or equal to
JGE/JNL
jump if greater than or equal to
jump if not less or equal to
JL/JNGE
jump if less than
jump if not greater or equal
JLE/JNG
jump if less than or equal
jump if not greater
CONDITION
ZF=0 and SF=OF
SF=OF
SF<>OF
ZF=1 or SF<>OF
Các lệnh nhảy không dấu
SYMBOL
DESCRITION
JA/JNBE jump if above
CONDITION
CF=0 and ZF=0
jump if not below or equal
JAE/JNB jump if above or equal
CF=0
jump if not below or equal
JB/JNAE jump if below
CF=1
jump if not above or equal
JBE/JNA jump if below or equal
jump if not above
CF=1 or ZF=1
Các lệnh nhảy 1 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
JNP/JPO
jump if parity odd
PF=0
Lệnh CMP
Thường dùng so sánh để lấy điều kiện
Cú pháp:
CMP destination, source
Thực hiện phép trừ destination – source để tính cờ và 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 là
tùy diễn dịch của 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 nhất trong AX và
BX vào CX; biết AX, BX chứa số có dấu?
Lệnh JMP
Nhảy không điều kiện
Cú pháp: JMP destination
Nhảy trong đ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 hơn 126 bytes
DEC CX
JNZ BOTTOM
JMP EXIT
BOTTOM:
JMP TOP
EXIT:
MOV AX,BX