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
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
<Tờn mảng> <Kiểu> <Danh sỏch cỏc giỏ trị khởi tạo> 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 A A+1 54 66
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 73
0102h 0103h 0104h A+2 A+3 A+4 87 0 42 b/ Mảng 2 chiều
<tờn mảng> <kiểu> <Cỏc giỏ trị hàng 1> <kiểu> <Cỏc giỏ trị hàng 2> ... <kiểu> <Cỏc giỏ trị hàng 3> 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]
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 74
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
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 75
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.
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 76
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 đổi 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
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 77
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
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 78
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
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 79
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
Giỏo trỡnh VI XỬ Lí http://www.ebook.edu.vn
Bộ mụn Kỹ thuật mỏy tớnh – Khoa CNTT – ĐHSPKT_HY Trang 80
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
Chương 6. LIấN KẾT ASSEMBLY VỚI CÁC NGễN NGỮ BẬC CAO