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
Chia sẻ với bạn bè của bạn: