Tải bản đầy đủ (.pdf) (34 trang)

Bài giảng Kiến trúc máy tính - Chương 6: Các lệnh hợp ngữ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (698.23 KB, 34 trang )

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


×