Lập trỡnh xử lý số nguyờn

Một phần của tài liệu Tài liệu Đề cương vi xử lý (Trang 75 - 83)

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 KT ASSEMBLY VI CÁC NGễN NG BC CAO

Một phần của tài liệu Tài liệu Đề cương vi xử lý (Trang 75 - 83)

Tải bản đầy đủ (PDF)

(94 trang)