Professional Documents
Culture Documents
Ass Tham Khao 1
Ass Tham Khao 1
II. Mảng một chiều : là một dãy thứ tự các phần tử có cùng một kiểu.
1. Khai báo :
Mảng kí tự : ví dụ : MSG DB ‘abcdef’
Mảng số : ví dụ : AW DW 10, 20, 30, 40, 50, 60
Trong đó địa chỉ của biến mảng gọi là địa chỉ cơ sở (base). Địa chỉ các phần tử là offset.
Chú ý : Ta có thể định nghĩa một mảng có các phần tử giống nhau nhờ vào toán tử
DUP, ví dụ : khai báo sau
repeat DB 100 DUP(0) có nghĩa là khai báo một mảng 100 phần tử, có
giá trị khởi tạo bằng 0.
2. Các chế độ địa chỉ
Chế độ địa chỉ thanh ghi : trong chế độ này offset của toán hạng chứa trong
thanh ghi đóng vai trò như một con trỏ trỏ đến các ô nhớ. Thanh ghi dùng được là BX,
DI, SI. Ví dụ : SI chứa địa chỉ offset 0100h có giá trị 1234h khi đó khi thi hành lệnh sau
MOV AX, [SI] CPU sẽ kiểm tra địa chỉ từ nhớ (word) tại DS: 0100h sau đó
chuyển giá trị 1234h của ô nhớ này cho AX. Chú ý điều này khác với lệnh MOV AX, SI
Chế độ địa chỉ cơ sở (base) và địa chỉ chỉ số (index) : trong chế độ này địa chỉ
offset của các toán hạng nhận được bằng cách cộng một độ dịch với nội dung của thanh
ghi. Các thanh ghi sẽ là BX, BP, SI, DI. Nếu ta dùng thanh ghi BX, SI, DI thì DS sẽ
chứa địa chỉ segment, còn nếu dùng BP thì SS sẽ chứa địa chỉ segment.
Ví dụ : giả sử W là một mảng word, BX chứa giá trị 4. Khi đó MOV AX, W[BX] sẽ
chuyển nội dung phần tử có địa chỉ W + 4 vào AX, đây là phần tử thứ 3 trong mảng
Chế độ địa chỉ trực tiếp : khi đó địa chỉ của toán hạng sẽ được ghi tường minh
dưới dạng thanh_ghi_ segment : [thanh_ghi_pointer] . Xem ví dụ sau :
MOV AX, ES : [SI] nếu SI chứa địa chỉ 0100h thì địa chỉ toán hạng trong
trường hợp này là ES: 0100h.
III. Mảng hai chiều :
1. Khai báo : tương tự như mảng một chiều, xem ví dụ sau :
A DB 10, 20, 30, 40
DB 50, 60, 70, 80
DB 90, 100, 110, 120 sẽ khai báo một mảng A có 3 hàng x 4 cột
Chú ý : nếu mảng A có N phần tử trên mỗi hàng và mỗi phần tử có kích thước S byte
thì địa chỉ hàng thứ i (tinh tu 0) sẽ bắt đầu tại vị trí : A + i * N * S .
2. Các chế độ địa chỉ : gần như tương tự như trường hợp một chiều
Ví dụ : giả sử W là một mảng byte, BX chứa giá trị 2 và SI chứa 4. Khi đó lệnh sau
MOV AX, W[BX][SI] sẽ chuyển nội dung phần tử có địa chỉ W + 2 + 4 vào
AX, lệnh trên cũng tương đương như lệnh MOV AX, W[BX + SI]
IV. Bài tập về mảng :
1. Cài đặt chương trình sắp xếp lại mảng theo thứ tự tăng dần với số phần tử n nhập vào từ bàn
phím và n < 256.
2. Giả thiết rằng có một record kiểu mảng như sau :
BANGDIEM DB ‘ngọc lan ‘, 10 , 8 , 8 , 10
DB ‘kiều nga ‘, 8 , 8 , 9 , 10
DB ‘thu hiền ‘, 9 , 8 , 10 , 10
DB ‘ngọc thuý ‘, 8 , 7 , 8, 10
DB ‘thanh hằng ‘, 10 , 8 , 6, 10
trong đó mỗi tên chiếm 12 bytes. Hãy viết chương trình in ra tên của mỗi học sinh cùng với số
điểm trung bình của cô ta (làm tròn)
HD bài 1.
Giả sử ta có một mảng A kiểu DW gồm 5 phần tử như sau
.DATA
A DW 10, 50 , 30 , 20 , 40 ; có 5 phần tử
Khi đó chương trình sắp xếp mảng tăng dần như sau :
Giải thuật sắp xếp bằng hai vòng for Cài đặt bằng hợp ngữ
int temp; // biến trung gian LEA SI, A ; lấy phần tử A[0]
for (int i = 0; i < 5; i++) MOV CX , 5 ; số phần tử của mảng
for (int j = i; j < 5; j ++) FOR_I :
if (A[i] >= A[j]) { PUSH CX
temp = A[i]; // hoán đổi vị trí MOV DI, SI
FOR_J :
A[i] = A[j]; // A[i], A[j]
MOV AX, [DI] ;Lấy gtrị A[j]
A[j] = temp;
CMP [SI], AX ;Ktra A[i],A[j]
} JLE CONTINUE_J ;Nếu A[i] >= A[j]
XCHG [SI], AX ; Hdoi A[i],A[j]
MOV [DI], AX
CONTINUE_J:
ADD DI, 2
LOOP FOR_J ; vòng lặp j
POP CX
ADD SI, 2
LOOP FOR_I ; vòng lặp i
HD bài 2. Để tính được điểm trung bình của từng sinh viên thì ta phải biết được từng điểm của
sinh viên đó. Ta nên xem BANGDIEM là một mảng hai chìêu, do họ và tên chiếm 12 byte nên
điểm từng môn của sinh viên sẽ ứng với phần tử thứ [12] -> [15] trên từng dòng. Tính tồng
từng phần tử tương tự như bài 1 rồi chia cho 4 để ra điểm trung bình từng sinh viên.
Lưu chuỗi :
1. STOSB : chuyển nội dung của thanh ghi AL đến byte được định bởi ES:DI
Sau đó SI và DI tự động tăng lên 1 nếu cờ DF = 0 hay giảm 1 nếu DF = 1
2. STOSW : tương tự như STOSB nhưng sẽ lưu nội dung của AX và DF sẽ tăng
hoặc giảm 2 đơn vị.
3. Ví dụ minh họa : Đọc và lưu một chuỗi kí tự bằng chức năng AH = 1, ngắt 21H
… ……
; Vào : DI = chứa offset của chuỗi
; Ra : DI = chứa nội dung chuỗi vừa nhập, BX = kích thước chuỗi
CLD ; đặt lại cờ DF theo hướng tăng
XOR BX, BX ; gán BX = 0
MOV AH, 1
INT 21H
while1 :
CMP AL, 0DH ; kí tự xuống dòng
JE end_while1 ; kết thúc nhập
CMP AL, 8H ; ki tự Backspace
JNE else1 ; không phải thì lưu vào chuỗi
DEC DI ; lùi con trỏ 1 kí tự
DEC BX ;
JMP read ; đọc kí tự khác
else1 :
STOSB
INC BX
read :
INT 21H
JMP while1
endwhile :
…………. ; thoát khỏi vòng lặp