các lệnh hợp ngữ

Màu nền
Font chữ
Font size
Chiều cao dòng

.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 ; 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)

 Toán hạng trong lệnh

 Thanh ghi

 Toán hạng trong thanh ghi

 Trực tiếp

 Địa chỉ trong lệnh là địa chỉ ô nhớ của toán hạng

 Gián tiếp qua thanh ghi

 Thanh ghi chứa địa chỉ ô nhớ của toán hạng

 Gián tiếp ô nhớ

 Địa chỉ trong lệnh là địa chỉ ô nhớ của toán hạng

 Chỉ số (dịch chuyển)

 Địa chỉ toán hạng là tổng nội dung thanh ghi và độ dời

 Tương đối

 Tổng nội dung PC và độ dời

 Stack

 Thanh ghi SP chứa địa chỉ ô nhớ của toán hạngThanh ghi CPU 8086

 14 thanh ghi 16 bit

 5 nhóm

 Thanh ghi đoạn

 CS (code segment), DS (data segment),

SS (stack segment), ES (extra segment)

 Thanh ghi con trỏ

 IP (instruction pointer), SP (stack pointer),

BP (base pointer)

 Thanh ghi chỉ số

 SI (source index), DI (Destination index)

 Thanh ghi đa dụng

 Thanh ghi cờThanh ghi đa dụng

 AX Accumulator register

 Sử dụng cho tính toán và xuất nhập

 BX Base register

 Thanh ghi duy nhất có thể sử dụng chỉ số

 CX Counter register

 Sử dụng cho vòng lặp

 DX Data register

 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 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 9 Cho phép ngắt

TF Trap 8 CPU thực hiện từng bước

SF Sign 7 Kiểm tra kết quả là số âm

ZF Zero 6 Kiểm tra kết quả bằng 0

AF Auxiliary Carry 4

PF Parity 2 Kiểm tra số bit 1 chẵn

CF Carry 0 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 routine

09 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 DXProgram 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 ?,‟$‟ ;;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 MAINLệnh sử dụng stack

 PUSH

 Cú pháp: PUSH source

 source: thanh ghi, bộ nhớ hay hằng 16-bit để lưu

vào stack

 POP

 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:SPLệnh sử dụng stack (tiếp theo)

 Qui tắc vào sau ra trước:

 PUSH AX 1 POP CX 3

 PUSH BX 2 POP BX 2

 PUSH CX 3 POP AX 1

 PUSHA

 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ạiLệ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ó toá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

 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

 REPEATVí 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 CX0

 ;DOS EXIT

 MOV AH,4CH

 INT 21H

 MAIN ENDP

 END MAINNhảy có điều kiện

 Cú pháp: Jxxx destination_label

 xxx là viết tắt của điều kiện

 destination_label là nhãn để nhảy đến

 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

 Thanh ghi cờ

 Phạm vi nhảy

 Không quá 126 bytesCá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

SFOF

JLE/JNG jump if less than or equal

jump if not greater

ZF=1 or SFOFCá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

CF=1 or ZF=1Cá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=0Lệ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,BXBiể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

CMP AX,0

JNL END_IF ; no , exit

;then

NEG AX ; yes , change sign

END_IF :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

THEN

display AL

ELSE

display character in BL

END_IF

MOV AH,2 ; prepare

;if AL

CMP AL,BL ;AL

JNBE ELSE_ ; no, display BL

;then

MOV DL,AL

JMP DISPLAY

ELSE_:

MOV DL,BL

DISPLAY:

INT 21H

END_IF :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

= 0 put 0 in BX

> 0 put 1 in BX

; case AX

CMP AX,0 ;test AX

JL NEGATIVE ;AX

JE ZERO ;AX=0

JG positive ;AX>0

NEGATIVE:

MOV BX,-1

JMP END_CASE

ZERO:

MOV BX,0

JMP END_CASE

POSITIVE:

MOV BX,1

JMP END_CASE

END_CASE : 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'

charater

display character

END_IF

;read a character

MOV AH,2

INT 21H ; character in AL

; IF ( „A‟

CMP AL,‟A‟ ; char >=„A‟?

JNGE END_IF ; no, exit

CMP AL,‟Z‟ ; char

JNLE END_IF ; no exit

; then display it

MOV DL,AL

MOV AH,2

INT 21H

END_IF:

Biểu diễn ngôn ngữ cấp cao (tt)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

END_IF

;read a character

MOV AH,2

INT 21H ; character in AL

; IF ( character =„y‟ ) OR ( charater = „Y‟)

CMP AL,‟y‟ ; char =„y‟?

JE THEN ; yes , display it

CMP AL,‟Y‟ ; char =„Y‟?

JE THEN ; yes , display it

JMP ELSE_ ; no , terminate

THEN :

MOV DL,AL

MOV AH,2

INT 21H

JMP END_IF

ELSE_:

MOV AH,4CH

INT 21h

END_IF :Biểu diễn ngôn ngữ cấp cao (tt)

 Cấu trúc lặp FOR

 LOOP destination_label

 Lặp khi CX khác 0

 Số đếm trong thanh ghi CX giảm đi 1

 Mẫu thực hiện lệnh LOOP

MOV CX,20 ; gán cho cho CX số lần lặp là 20

TOP:

... ; thân vòng lặp ở đây

LOOP TOP

... ; các lệnh tiếp theo sau vòng lặpCấu trúc lặp FOR (tt)

 LOOP luôn thực hiện ít nhất 1 lần

 CX = 0  lặp FFFFh lần

 Tránh bằng 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 ở đây

LOOP TOP

SKIP:

... ; các lệnh tiếp theo sau vòng lặpBiểu diễn ngôn ngữ cấp cao (tt)

 Cấu trúc lặp WHILE

 Kiểm tra và lặp chỉ khi điều kiện còn đúng

MOV DX,0 ; DX để đếm skt

MOV AH,1 ; hàm nhập kí tự

INT 21h ; kí tự ở AL

WHILE_:

CMP AL,0DH ; nếu kt=CR

JE END_WHILE ; đúng, thoát

INC DX ; DX tăng 1

INT 21h ; đọc kt tiếp

JMP WHILE_ ; lặp

END_WHILE :

Ví dụ:

Đếm số kí tự

nhập trên cùng

1 hàng (cho

đến khi gặp kí

tự CR)Biểu diễn ngôn ngữ cấp cao (tt)

 Cấu trúc lặp REPEAT...UNTIL

 Thực hiện công việc và kiểm tra điều kiện, nếu điều kiện

vẫn sai thì lặp lại.

 Ví dụ viết đoạn mã nhập vào kí tự cho đến khi gặp

kí tự khoảng trắng .

MOV AH,1 ; đọc kí tự

REPEAT_:

INT 21h ; kí tự ở AL

;until

CMP AL,‟ „ ; AL=„ „?

JNE REPEAT_

... ;các lệnh tiếp theo sau vòng lặp

Bạn đang đọc truyện trên: Truyen2U.Pro

#tong#van