Gi¸o tr×nh VI xö lý TỔng quan về CÁc bộ VI xử LÝ CỦa intel


CHƯƠNG 5: MỘT SỐ VẤN ĐỀ NÂNG CAO



tải về 0.85 Mb.
trang5/6
Chuyển đổi dữ liệu23.08.2016
Kích0.85 Mb.
#25990
1   2   3   4   5   6

CHƯƠNG 5: MỘT SỐ VẤN ĐỀ NÂNG CAO


5.1. LẬP TRÌNH XỬ LÝ SỐ NGUYÊN

5.2. CẤU TRÚC DỮ LIỆU MẢNG

Trong lập trình với một số ngôn ngữ bậc cao, ta đã xét đến một số loại cấu trúc dữ liệu, trong đó có kiểu dữ liệu mảng. Kiểu cấu trúc này có ưu điểm là chỉ cần sử dụng một tên cho nhiều phần tử khác nhau. Các phần tử này được truy nhập thông qua các chỉ số.

5.2.1. Khai báo mảng.

Để khai báo các mảng, thông thường người ta sử dụng theo cách sau:

a/ Mảng 1 chiều



Ví dụ:

A DB 54,66,87,0,42

Khai báo mảng 1 chiều, trong đó mỗi phần tử cử mảng là một giá trị kiểu Byte. Giả sử địa chỉ offset gán cho A bằng 0100h, mảng này sẽ được phân bố trong bộ nhớ như sau:


Địa chỉ OFFSET

Tên các phần tử

Giá trị khởi tạo

0100h

0101h


0102h

0103h


0104h

A

A+1


A+2

A+3


A+4

54

66

87



0

42


b/ Mảng 2 chiều



..............................................





Ví dụ:

B DW 10,20,30

DW 50,60,70

DW 90,100,110

Với mảng hai chiều thì thứ tự của các phần tử trong bộ nhớ được bố trí theo thứ tự phần tử đầu của hàng dưới đứng ngay sau phần tử đầu hàng trên và được lưu trữ tuần tự.

5.2.2. Sử dụng mảng.

Vì các phần tử của mảng được phân bố tuần tự và địa chỉ của các phần tử này trong bộ nhớ sát nhau. Vì vậy khi truy nhập đến một phần tử nào đó, ta chỉ cần biết điạ chỉ đầu, sau đó cộng với độ dịch chuyển.

- Mảng 1 chiều: độ dịch chuyển=i*S

- Mảng 2 chiều: độ dịch chuyển=i*j*S

Trong đó:

i,j là chỉ số của mảng theo hàng (i) và theo cột (j)

S độ dài của mỗi phần tử (kiểu byte: S=1;kiểu Word: S=2)

Để truy nhập đến một phần tử của mảng bằng các lệnh, ta có thể sử dụng một số chế độ của các toán hạng trong lệnh như:

Chế độ gián tiếp thanh ghi.

Chế độ địa chỉ cơ sở

Chế độ địa chỉ chỉ số

Chế độ địa chỉ chỉ số cơ sở

Để hoán chuyển hai phần tử của mảng. Ví dụ phần tử thứ 3 và thứ 5 trong mảng A, ta có thể thực hiện theo mẫu sau:

MOV AX,A+2 ;AX =A[3]

XCHG A+4,AX ;AX =A[5], A[5]=A[3]

MOV A+2,AX ;A[3]=A[5]



Ví dụ: Sắp xếp một mảng theo thứ tự tăng dần

title ct


.MODEL Small

.STACK 100h

.DATA

A DB 31H,39H,37H,35H,33H ;khai bao mang 1 chieu



.CODE

main PROC

MOV AX,@DATA

MOV DS,AX

LEA SI,A ;SI tro toi dia chi offset cua mang

MOV BX,5 ;so phan tu cua mang can sap xep

CALL SELECT ;sap xep

MOV AH,4Ch

INT 21h

main ENDP



select proc

push bx


push cx

push dx


push si

dec bx ;giam BX di 1

je end_sort ;BX=0, ket thuc

mov dx,si ;chep offset cua mang

;for n-1 do

sort15:


mov si,dx ;SI tro toi mang

mov cx,bx ;so lan so sanh

mov di,si ;DI tro toi phan tu max

mov al,[di] ;AL chua phan tu lon nhat

;xac dinh phan tu lon nhat con lai

find_big:

inc si ;SI tro toi pha tu tiep theo

cmp [si],al ;> phan tu lon nhat

jng next ;khong, tiep tuc

mov di,si ;dung, tro den no

mov al,[di] ;AL chua phan tu lon nhat

next:


loop find_big ;lap den khi hoan thanh

;doi cho phan thu lon nhat voi phan tu cuoi cung

call swap ;doi cho phan tu cuoi cung

dec dx ;n=n-1

jne sort15 ;n>0, lap tiep

end_sort:

pop si

pop dx


pop cx

pop bx


ret

select endp

;doi cho hai phan tu trong mang

swap PROC

PUSH AX

MOV AL,[SI]



XCHG AL,[DI]

MOV [SI],AL

POP AX

RET


swap ENDP

END main


5.3. CẤU TRÚC DỮ LIỆU XÂU KÍ TỰ

Về cơ bản, cấu trúc dữ liệu này là một trường hợp đặc biệt của mảng với các phần tử của mảng là mã ASCII của các kí tự. Vì vậy, các lệnh thao tác với mảng cũng có thể thực hiện cho chuỗi.

Các công việc thực hiện bằng các lệnh thao tác chuỗi có thể sử dụng các chế độ địa chỉ gián tiếp thanh ghi. Tuy nhiên các lệnh thao tác chuỗi có thể tự động điều chỉnh thanh ghi con trỏ và cho phép có những thao tác giữa bộ nhớ với bộ nhớ.

5.3.1. Cờ định hướng

Trong thanh ghi cờ của bộ vi xử lý 8086 có một cờ điều khiển thường sử dụng trong các thao tác với chuỗi kí tự, nó chỉ hướng sắp xếp của chuỗi là tăng hay giảm dần. Cờ này chính là cờ DF.

Nếu cờ DF=0, SI và DI được xử lý theo chiều tăng của các địa chỉ bộ nhớ từ trái qua phải trong chuỗi. Ngược lại, nếu DF=1 thì phép xử lý này sẽ là từ phải sang phải, có nghĩa là theo chiều giảm của các địa chỉ bộ nhớ.

Cờ định hướng có thể thay đổi được bằng lệnh:

+ CLD - CLear Direction flag (xoá cờ hướng)

Lệnh này sẽ gán giá trị 0 cho cờ định hướng.

+ STD - SeT Direction flag (lập cờ hướng)

Lệnh này sẽ thiết lập giá trị 1 cho cờ định hướng.



5.3.2. Lệnh chuyển một chuỗi.

Giả sử đã khai báo 2 biến

st1 DB 'XIN CHAO'

st2 DB 8 DUP (?)

Muốn chuyển nội dung của chuỗi st1 sang chuỗi st2, người ta sử dụng lệnh: MOVSB - MOVement String Byte

Lệnh này sẽ sao chép nội dung của byte được định địa chỉ bởi DS:SI đến byte được định địa chỉ bởi ES:DI. Nội dung của byte nguồn không bị thay đổi. Sau khi một byte được chuyển, cả hai thanh ghi SI và DI đều tự động tăng nếu DF=0 hay giảm đi 1 nếu DF=1.

Ví dụ muốn chuyển 2 byte đầu của st1 đến st2, ta có thể thực hiện:

MOV AX,@DATA

MOV DS,AX ;Khoi tao DS

MOV ES,AX ;va ES

LEA SI,st1 ;SI tro den chuoi nguon

LEA DI,st2 ;DI tro toi chuoi dich

CLD ;Dinh huong tu trai sang phai

MOVSB ;Chuyen byte thu nhat

MOVSB ;chuyen byte thu hai

Vậy, muốn chuyển cả chuỗi thì phải mất nhiều lệnh MOVSB, do đó chương trình có thể rất dài, không cần thiết. Trong trường hợp này, ta có thể sử dụng lệnh khởi tạo REP (REPeat) như sau:

REP MOVSB

Ví dụ chuyển cả chuỗi st1 sang chuỗi st2, ta thực hiện như sau:

MOV AX,@DATA

MOV DS,AX ;Khoi tao DS

MOV ES,AX ;va ES

LEA SI,st1 ;SI tro den chuoi nguon

LEA DI,st2 ;DI tro toi chuoi dich

CLD ;Dinh huong tu trai sang phai

MOV CX,8 ;so ki tu trong chuoi st1

REP MOVSB ;Chuyen ca 8 byte trong st1 sang st2



5.3.3. Lệnh lưu chuỗi

Trong nhiều trường hợp, chúng ta cần phải thực hiện nhập vào một chuỗi, sau đó in chuỗi đó ra màn hình. Muốn thực hiện được điều này, ta phải lưu chuỗi nhập vào vào một biến kiểu chuỗi. Lệnh lưu chuỗi như sau:

Dạng lệnh: STOSB ;STOre String Byte - lưu chuỗi các byte

Lệnh này có tác dụng chuyển nội dung của thanh ghi AL đến byte được định địa chỉ bởi ES:DI. Sau khi lệnh được thực hiện, DI tăng 1 nếu DF=0 hoặc giảm 1 nếu DF=1. Lệnh này không ảnh hưởng đến các cờ.



5.3.4. Lệnh nạp chuỗi

Muốn chuyển một chuỗi kí tự đã được lưu ra màn hình, ta có thể sử dụng hàm 09h của ngắt 21h. Song, hàm này yêu cầu chuỗi phải được kết thúc bằng dấu '$'. Mặt khác, trên thực tế, khi nhập vào ít người quan tâm tới việc phải nhập vào dấu '$' khi kết thúc.

Để giải quyết vấn đề này, ta có thể sử dụng hàm 02h của ngắt 21h kết hợp với lệnh nạp chuỗi.

Dạng lệnh: LODSB ;LOaD String Byte - Nạp chuỗi byte

Lệnh này chuyển byte tại địa chỉ DS:SI vào AL. Sau lệnh này, SI sẽ được tăng thêm 1 nếu DF=0 hoặc giảm đi 1 nếu DF=1

5.4.2.4. Lệ

DS,AX ;Khoi tao DS

MOV ES,AX ;va ES

LEA DI,st1 ;DI tro den chuoi st1

CLD ;Xu li tu trai sang phai

MOV AL,'A' ;Ki tu can tim

MOVSB ;Duyet Byte dau tien

MOVSB ;Duyet Byte thu hai

5.3.5. Ví dụ:

Nhập vào một chuỗi kí tự, sau đó hiển thị 10 kí tự đầu tiên ra màn hình ở dòng tiếp theo



Chương trình:

title ct


.MODEL Small

.STACK 100h

.DATA

STR DB 80 DUP(0) ;chuoi luu ki tu nhap vao



CRLF DB 13,10,'$' ;xuong dong va ve dau dong

.CODE


main PROC

MOV AX,@DATA

MOV DS,AX ;khoi tao DS

MOV ES,AX ;va ES

LEA DI,STR ;DI tro toi chuoi

CALL READ ;nhap chuoi tu ban phim

MOV AH,09H ;xuong dong

LEA DX,CRLF ;ve dau dong

INT 21H

LEA SI,STR ;SI tro toi chuoi



MOV BX,10 ;so ki tu hien thi

CALL DISP ;hien thi cac ki tu

MOV AH,4Ch

INT 21h


main ENDP

READ PROC NEAR

;Doc va luu chuoi

;Vao: DI chua dia chi offset ua chuoi

;Ra: DI chua dia chi offset cua chuoi

; BX chua so ki tu nhan duoc

PUSH AX

PUSH DI


CLD ;Xu li tu ben trai sang

XOR BX,BX ;BX=0

MOV AH,1 ;Nhap ki tu

INT 21h


WHILE1:

CMP AL,13 ;ki tu nhap la ENTER?

JE END_WHILE ;Dung, thoi nhap

CMP AL,8 ;ki tu nhap la BACKSPACE?

JNE ELSE_ ;Khong, ki tu tiep theo

DEC BX ;dung, xoa ki tu truoc

JMP READ_ ;Nhap tiep

ELSE_:


STOSB ;Luu vao chuoi

INC BX ;chuan bi ki tu tiep

READ_:

INT 21H ;nhap tiep



JMP WHILE1 ;ki tu sau

END_WHILE:

POP DI

POP AX


RET

READ ENDP

DISP PROC NEAR

;Hien thi mot chuoi ki tu

;Vao: SI=offset chuoi

; BX=so cac ki tu can hien thi

PUSH AX

PUSH BX


PUSH DX

PUSH SI


MOV CX,BX ;so lan hien thi

JCXZ EXIT ;bang 0, khong hien thi

CLD ;xu li tu trai sang phai

MOV AH,2 ;chuan bi

TOP:

LODSB ;ki tu trong AL



MOV DL,AL ;chuyen sang DL de hien thi

INT 21h ;hien thi ki tu

LOOP TOP ;Lap lai cho den khi het chuoi

EXIT:


POP SI

POP DX


POP BX

POP AX


RET

DISP ENDP

END main

5.4. LẬP TRÌNH XỬ LÝ SỐ THỰC

5.5. LẬP TRÌNH CHO CÁC BỘ VI XỬ LÝ TIÊN TIẾN

Cấu trúc và bộ lệnh của các bộ vi xử lý thay đổi, dẫn đến phương thức tác động cũng phần nào được thay đổi. Mặc dù các bộ VXL tiên tiến có hỗ trợ cho các chế độ của 8086, song sẽ không thể tận dụng tối đa những đặc tính mới này.

Để có thể sử dụng tối đa công dụng của những bộ VXL tiên tiến, ta cần phải truy nhập bằng các lệnh và sử dụng một số dẫn hướng tuỳ theo qui định của từng loại vi xử lý.

Ví dụ: Bộ VXL 80286 bổ sung một số lệnh như: PUSHA, POPA, Lệnh IMUL với nhiều toán hạng....Ta có thể sử dụng các lệnh này bằng cách: Trước khi sử dụng các lệnh này ta phải đặt dẫn hướng.286 tại 1 dòng, và sau cùng trả lại cho chế độ của 8086 ta đặt dẫn hướng.8086

MOV AL,5

MOV BL,10

ADD AL,BL

.286


PUSHA ;Dat lenh nay trong doan lenh 80286, dung

MOV AL,15H

SUB AL,BL

MOV [BX],10

IMUL AL,[BX],3 ;co the su dung IMUL nhu vay

POPA


.8086

PUSHA ;Dat ngoai doan lenh cua 286 la sai




tải về 0.85 Mb.

Chia sẻ với bạn bè của bạn:
1   2   3   4   5   6




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương