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


CHƯƠNG 6: LIÊN KẾT ASSEMBLY VỚI NGÔN NGỮ BẬC CAO



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

CHƯƠNG 6: LIÊN KẾT ASSEMBLY VỚI NGÔN NGỮ BẬC CAO


6.1. LẬP TRÌNH MÃ LỆNH MÃ MÁY

Một chương trình viết bằng hợp ngữ (Assembly) thường là dài và khó hơn, nhưng lại thực hiện nhanh hơn một chương trình tương tự viết bằng ngôn ngữ bậc cao (Turbo PASCAL, C++,...). Vì vậy, để một chương trình viết kết hợp về tốc độ của hợp ngữ và tính dễ hiểu, ngắn gọn của ngôn ngữ lập trình bậc cao, các lập trình viên thường viết một số Modul chương trình cần đến việc xử lý nhanh bằng hợp ngữ, các

lục phân) trực tiếp vào trong chương trình taij vị trí bất kỳ (có thể trong thủ tục, hàm hoặc chương trình chính). Phương pháp này được thực hiện bởi thủ tục INLINE.

6.1.1. Cú pháp

INLINE(val/val/val/.../val);

Trong đó: val: Là các giá trị và phải được phân cách bằng dấu “ / ”

Các giá trị có thể là dạng thập phân, thập lục phân hoặc nhị phân. Các giá trị này chính là các lệnh mã máy thực hiện thao tác nào đó.

Các giá trị thuộc kiểu dữ liệu 8 bit sẽ tạo ra 1byte mã lệnh hoặc dữ liệu, các giá trị thuộc kiểu dữ liệu 16 bit sẽ tạo ra 2 byte mã lệnh hoặc dữ liệu.

6.1.2 Thực hiện

Khi gặp phát biểu INLINE, PASCAL sẽ chuyển các giá trị trong đó sang các mã máy tương ứng và máy sẽ trực tiếp thực hiện. Chương trình dịch sẽ không phải tốn nhiều thời gian cho việc dịch lệnh. Vì vậy, việc thực hiện lệnh được nhanh hơn.



6.1.3 Một số chú ý.

  • Các giá trị nếu được biểu diễn dưới dạng thập lục phân thì phải có dấu “ $ ” đứng trước.

  • Có thể ghép các biến của PASCAL vào vị trí các giá trị thích hợp bằng cách trước tên biến sử dụng dấu “ < ”

  • Các phát biểu INLINE có thể viết tách ra hoặc gộp lại

  • Nếu phát biểu INLINE nội dung của một hàm nào đó thì giá trị trả lại của hàm phải tuân thủ quy định sau:

Kiểu dữ liệu

Giá trị trả lại

Byte

Boolean


Char

Liệt kê (8 bít)

Shortint


AL

Word

Integer


Liệt kê (16 bít)

AX

Longint

DX: AX

Real

DX:BX:AX

6.1.4 Ví dụ

  1. Viết một chương trình sử dụng phát biểu INLINE thực hiện tính tổng hai số.

Giải:

Program thu;

Uses crt;

Var so1,so2:integer;

(*---------------------------------------------*)

Function sum(num1:integer;num2:integer):integer;

Begin

Inline($8B/$46/

$03/$46/

$89/$46/$FE); {[BP-2] <--AX}

End; {Gia tri tra lai chuyen qua ngan xep}

(*--------------------------------------------*)

Begin

Clrscr;


Write('So thu nhat: ');Readln(so1);

Write('So thu hai: ');Readln(so2);

Writeln('Tong cua hai so la: ',sum(so1,so2));

Readln;


End.

  1. Viết chương trình sử dụng phát biểu INLINE thực hiện việc hiển thị một ký tự ra màn hình đồ hoạ.

Giải:

Program man_hinh;

Begin

Inline($B4/$00/ {MOV AH,00 ;Ham lap che do man hinh}



$B0/$12/ {MOV AL,12h ;Che do 640*480*16}

$CD/$10); {INT 10h ;Lap che do}

Inline($B4/$0B/ {MOV AH,0Bh ;lap mau nen va vien }

$B7/$00/ {MOV BH,0 ;Trang man hinh 0 }

$B3/$03/ {MOV BL,0 ;mau vien va nen}

$CD/$10); {INT 10h ;Dat mau}

Inline($B4/$02/ {MOV AH,02 ;Ham dat vi tri con tro}

$B7/$00/ {MOV BH,00 ;Trang so 0}

$B6/$0C/ {MOV DH,0ch ;Toa do y}

$B2/$28/ {MOV DL,28h ;Toa do X}

$CD/$10); {INT 10h ;Dat con tro}

Inline($B4/$09/ {MOV AH,09 ;Ham ghi ky tu}

$B0/$41/ {MOV AL,01 ;Ma ASCII cua ky tu}

$B3/$04/ {MOV BL,04 ;Mau cua ky tu }

$B9/$01/$00/{MOV CX,01 ;So lan lap lai ky tu}

$CD/$10); {INT 10h ;Ghi ky tu}

Readln;

End.


6.2. LẬP TRÌNH MÃ LỆNH GỢI NHỚ

6.2.1 Cú pháp

PASCAL hỗ trợ một lệnh chèn đoạn mã lệnh gợi nhớ (MNEMONIC) của hợp ngữ vào bất cứ vị trí nào cần thiết trong chương trình. Cú pháp thực hiện như sau:

ASM

{Khối các lệnh hợp ngữ}



END;

Trong đó:

ASM, END là từ khoá cho biết vị trí bắt đầu và kết thúc của đoạn mã

{Khối các lệnh hợp ngữ} là các mã lệnh gợi nhớ của hợp ngữ.



6.2.2 Thực hiện

Khi chương trình dịch của PASCAL gặp từ khoá ASM trong dòng lệnh thì nó sẽ chuyển dòng lệnh ASSEMBLY vào và dịch với việc quy chiếu biến PASCAL ra dạng tương ứng của ASSEMBLY để thực hiện.

Nếu biến kiểu Integer thì chương trình dịch sẽ quy chiếu sang dạng DW của Assembly.

6.2.3 Một số chú ý.


  • Lời chú thích, chú giải cần phải có với mỗi lệnh hợp ngữ và phải tuân thủ theo quy định của PASCAL.

  • Các lệnh nhảy của Assembly có thể nhảy ra ngoài phần lệnh ngôn ngữ PASCAL hoặc đoạn lệnh bên trong phần lệnh hợp ngữ, nhưng lệnh nhảy của PASCAL không thể nhảy đến nhãn trong phần lệnh hợp ngữ.

  • Các nhãn (nếu có) trong phần lệnh của Assembly phải có dấu '@' đứng trước.

  • Các lệnh hợp ngữ phải kết hợp chính xác, tránh hiện tượng treo máy.

6.2.4 Ví dụ

Viết một chương trình thực hiện việc đưa ra số nhỏ nhất và lớn nhất trong hai số.


LỜI GIẢI


Thuật toán tìm số nhỏ nhất: Thuật toán tìm số lớn nhất:



Mã lệnh:

Program min_max;

Uses crt;

Var


so1,so2:integer;

{*---------------------------------------------*}

Function min(num1:integer;num2:integer):integer;

Var


tg:integer;

BEGIN


ASM

MOV AX,num1 {AX:=num1}

CMP AX,num2 {If AX>num2 then}

JNG @END_If

MOV AX,num2 {AX:=num2}

@END_If: {tg:=AX}

MOV tg,AX

END;


min:=tg;

END;


{*---------------------------------------------*}

Function max(num1:integer;num2:integer):integer;

LABEL END_IF;

Begin


ASM

MOV AX,num1 {AX:=num1}

CMP AX,num2 {If AX

JNL END_IF {Begin}

MOV AX,num2 {AX:=num2}

MOV num1,AX {END}

END;

END_IF:


max:=num1; {Gia tri tra lai cua ham}

END;


(*--------------------------------------------*)

Begin


Clrscr;

Write('So thu nhat:');Readln(so1);

Write('So thu hai:');Readln(so2);

Write('So nho nhat la: ',min(so1,so2));

Write('So lon nhat la: ',max(so1,so2));

Readln;


END.

6.3. NGẮT VÀ LẬP TRÌNH NGẮT TRONG CÁC NGÔN NGỮ BẬC CAO

ASSEMBLY là một ngôn ngữ lập trình tác động trực tiếp tới các thành phần phần cứng. Các thành phần phần cứng này có thể tác động bằng địa chỉ cổng, song cũng có thể tác động bằng các ngắt.

Việc tác động bằng ngắt đã được qui định cho từng thiết bị ngoại vi cũng như các thành phần khác trong máy tính. Hệ điều hành đã qui định chúng trong các ngắt mềm.



6.3.1. Khái niệm về ngắt

Ngắt là quá trình CPU tạm thời ngừng hoạt động hiện tại khi có một yêu cầu ngắt gọi đến để chuyển sang thực hiện chương trình con phục vụ ngắt tương ứng. Sau khi thực hiện xong thì quay trở lại thực hiện tiếp công việc đang dở trên.



6.3.2. Phân loại ngắt




Hình 3: Phân loại các ngắt.

1/ Ngắt cứng là ngắt do các thành phần phần cứng gây ra.

- Ngắt trong: Là các ngắt xảy ra ngay bên trong CPU.

- Ngắt ngoài: Là các ngắt do các thành phần phần cứng khác gây ra.

+ Ngắt có cấm (Maskable Interrupt) là các ngắt chỉ được thực hiện khi cờ IF được thiết lập (IF=1)

+ Ngắt không cấm (Non Maskable Interrupt) là các ngắt có thể thực hiện được ngay cả khi cờ IF không được thiết lập.

2/ Ngắt mềm là các ngắt nằm bên trong chương trình phần mềm.

- Ngắt của người sử dụng là các ngắt được viết ra bởi những chương trình của người sử dụng.

- Ngắt hệ thống là các ngắt nằm bên trong các chương trình của BIOS hoặc hệ điều hành (ví dụ: DOS)

+ Ngắt DOS là các ngắt nằm bên trong chương trình của DOS trong Module vào/ra (IO.SYS)

+ Ngắt BIOS là các ngắt nằm bên trong chương trình của BIOS.

6.3.3. Giới thiệu về một số ngắt

6.3.3.1.Cách thực hiện ngắt trong một số ngôn ngữ lập trình



1.Gọi ngắt trong ASSEMBLY

Một số ngắt thông thường cể các tham số đầu vào.Phô thuộc vào các tham số này,chương trình sẽ thực hiện giải quyết và đưa ra các tham số đầu ra.

Các tham số đầu vào là các giá trị chuyển tới các thanh ghi hoặc ô nhớ nào đã Các tham đầu ra là các giá trị nhận được sau khi hàm này xử lý xong.

Để gọi ngắt trong ASSEMBLY ta có thể thực hiện theo mẫu sau:

- Chuyển các tham số đầu vào

- Gọi ngắt INT

- Xử lý các tham số đầu ra

Ví dụ: MOV AH,01h ;Nhập vào một kí tự

INT 21h ;Kí tự nằm trong AL

MOV DL,AL ;Lấy từ AL sang DL

INT 21h ;Hiển thị

2.Gọi ngắt trong PASCAL

Việc gọi ngắt trong PASCAL cũng được thực hiện theo mẫu trên.Song phải theo một số quy định sau:



  • Các lệnh được sử dụng là các lệnh của PASCAL. Lệnh gán tương đương với lệnh MOV trong ASSEMBLY

  • Nếu sử dụng hệ đếm thập lục phân,thì phải cài đặt dấu ‘$’ đứng trước mỗi số đó.

  • Muốn tác động trực tiếp tới các thanh ghi của bộ vi xử lý,ta phải sử dụng biến có kiểu là REGISTERS. kiểu này được quy định trong UNIT DOS như sau:

+ Kiểu REGISTERS được khai báo trong UNIT DOS:

TYPE


REGISTERS=RECORD

CASE integer OF

0:(AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags:word);

1:(AL,AH,BL,BH,CL,CH,DL,DH:Byte);

END;

+ Các thanh ghi của bộ vi xử lý được quy định bằng các tên biến. Muốn truy nhập đến các biến này, ta phải quy định về kiểu bản ghi. Ví dụ: R là biến kiểu REGISTERS



=>R.AH:=$01; hoặc with R do AH:=$01;

- Muốn gọi ngắt trong PASCAL, có thể sử dụng thủ tục:

INTR(,);

Ví dụ: R là biến kiểu REGISTERS => INTR($ 10,R);

- Riêng với số hiệu ngắt 21h ta có thể sử dụng thủ tục

MSDOS();

Ví dụ: INTR($21,R); <=>MSDOS(R);

6.3.3.2. Một số ngắt thông dụng



Ngắt 21h: Ngắt chức năng của DOS

Hàm 01h: Vào một kí tự từ bàn phím và hiển thị ra màn hình



Mô tả

Ví dụ minh hoạ

Vào: AH=01h

Ra: AL=Mã ASCII của kí tự nhập vào



MOV AH,01H

INT 21H


MOV ktu,AL

Hàm 02h: In một ký tự ra màn hình văn bản

Vào AH=02h

DL= mã ASCII của kí tự nhập vào

Ra Không


MOV AH,02H ;In ra màn hình

MOV DL,’A’ ; chữ ’A’

INT 21H


Hàm 08h: Vào một kí tự từ bàn phím,không hiển thị kí tự ra màn hình

Vào AH=01h

Ra AL= mã ASCII của kí tự nhập vào



MOV AH,08H

INT 21H


MOV ktu,AL

Hàm 09h: In một chuỗi kí tự ra màn hình

Vào AH=09h

DS:DX=Con trỏ đến chuỗi kết thúc bằng ‘$’

Ra Không


MOV AH,09H

LEA DX,chuỗi

INT 21H


Hàm 4Ch: Kết thúc chương trình.EXE

Vào: AH=4Ch

Ra : Không



MOV AH,4CH

INT 21H


Hàm 2Ah: Xác định ngày tháng

Vào: AH=2Ah

Ra : AL=ngày trong tuần(0-6)

CX=năm(1980-2099)

DH=tháng(1-12)

DL=ngày(1-31)


R.AH:=$2A

INTR($21,R)

Ngay-tuan:=R.AL;

Nam:=R.CX;

Thang:=R.DH;

Ngay:=R.DL;



Hàm 2Bh: Đặt ngày tháng (Đặt lại ngày hệ thống)

Vào : AH= 2Bh

CX=năm(1980-2099)

DH=tháng(1-12)

DL= ngày(1-31)

Ra : AL=0 nếu ngày hợp lệ;

AL=FFh nếu ngày không hợp lệ



R.AH:=$2B;

Nam:=R.CX;

Thang:=R.DH;

Ngay:=R.DL;

INTR($21,R);

IF R>AL=0 then write(‘OK!’);

Else write(‘Not OK!’);


Hàm 2Ch: Xác định thời gian hệ thống

Vào: AH=2Ch

Ra : CH=giờ(0-23)

CL=phút(0-59)

DH=giây(0-59)

DL=phần trăm giây(0-99)


R.AH:=$2C;

NTR($21,R);

Gio:=R.CH;

Phut:=R.CL;

Giay:=R.DH;

Phan_tram:=R.DL




Hàm 2Dh: Đặt thời gian (Đặt lại thời gian hệ thống)

Vào: AH=2Dh

CH=giờ(0-23)

CL=phút(0-59)

DH=giây(0-59)

DL=phần trăm giây(0-99)

Ra: AL=0 nếu thời gian hợp lệ

AL=FFh nếu thời gian không hợp lệ


R.AH:=$2D;

R.CH:=gio;

R.CL:=phut;

R.DH:=giay;

R.DL:=phan_tram;

INTR($21,R);

If R.AL=0 then write(‘OK!’)

Else write(‘Not OK!’);



Hàm 30h: Xác định số phiên bản của DOS

Vào : AH=30h

Ra : BX=0000h

CX=0000h

AL=số trước dấu phẩy

AH=số sau dấu phẩy


R.AH:=30H

INTR($21,R);

Ver1:=R.AL;

Ver2:=R.AH;

Write(‘MS_DOS Version ‘,ver1,’,’,ver2)


Hàm 36h: Xác định dung lượng còn trống trên đĩa

Vào :AH=36h

DL=ổ đĩa(0_mặc định;1_A;1_B;...)

Ra : BX=Số liên cung chưa dùng

CX=Số byte/cung

DX=Số liên cung / đĩa

AX=FFFFh nếu ổ đĩa không hợp lệ=số cung/liên cung(hợp lệ)



R.AH:=36H;

R.DL:=1;


INTR($21,R);

Free_cyl:=R.BX;

Bps:=R.CX; {byte per sector}

Cpd:=R.DX; {cylinder per dick}

If AX=$FFFF then write(‘No Dick’)

Else spc:=R.AX; {sector per cylinder);



Ngắt 10h: Ngắt màn hình

Hàm 00h: Chọn chế độ hiển thị cho màn hình



Vào: AH=0h

AL=chế độ

03h:Text 80*25*16

12h:Grapt 640*480*16

13h: Grapt 320*200*256

Ra : Không



R.AH:=0h;

R.AL:=mode;

INTR($10,R);


Hàm 02h: Dịch chuyển Con trỏ

Vào: AH=02h

BH=trang số

DH=hàng

DL=cột


Ra : Không

R.AH:=02h;

R.BH:=trang;

R.DH:=hang;

R.DL:=cot;

INTR($10,R)


Hàm 06h: Cuốn màn hình hay cửa sổ lên một số dòng xác định

Vào: AH=06h

AL=số dòng cuốn(=0;toàn bộ)

BH=thuộc tính của dòng trống

CH,DL=dòng,cột góc trên trái

DL,DL=dòng,cột góc dưới phải

Ra: Không



R.AH:=06h;

R.AL:=so_dong;

R.BH:=thuoc_tinh;

R.CH:=dong1;R.CL=cot1;

R.DH:=dong2;R.DL=cot2;

INTR($10,R);



Hàm 07h: Cuốn màn hình hay cửa sổ xuống một dòng xác định

Vào : AH=07h

AL=số dòng cuốn(=0;toàn bộ)

BH=thuôc tính các dòng trống

CH,CL=dong,cột góc dưới phải

Ra : Không


R.AH:=07h;

R.AL:=so_dong;

R.BH:=thuoc_tinh;

R.CH:=dong1;R.CL=cot1;

R.DH:=dong2;R.DL=cot2;

INTR($10,R);



Hàm 09h: Hiển thị kí tự với thuộc tính tại vị trí Con trỏ

Vào: AH=09h

AL=mã ASCII của kí tự

BH=trang số

BL=thuộc tính(text); màu(graph)

CX=số lần viết kí tự

Ra :Không



R.AH:=09h;

R.AL:=kitu;

R.BH:=0; {trang so 0}

R.BL:=mau;

R.CX=solan;

INTR($10,R);



Ngắt 16h: Ngắt bàn phím

Hàm 00h: Đọc kí tự từ bàn phím



Vào : AH=00h

Ra :AH=mã quét của phím

AL=mã ASCII của kí tự


R.AH:=00h;

INTR($16,R);

R.AH:=ma_scan;

R.AL:=ma_ascii;



Hàm 02h: Lấy các cờ bàn phím

Vào : AH=02h

Ra : AL=các cờ

Bit 7: insert; bit 6:capslock; bit 5:numlock; bit 4:scrollock


R.AH:=00h;

INTR($16,R);

R.AH:=ma_scan;

R.AL:=ma_ascii;



Ngắt 33h: Ngắt con chuột

Hàm 00h: Khởi tạo chuột



Vào : AX=00h

Ra : AX=FFFFh không nhận chuột



R.AX:=00h;

INTR($33,R);

if R.AX=FFFFh then

WRITE('Khong khoi tao duoc chuot!');



Hàm 01h: Hiện trỏ chuột

Vào : AX=01h

Ra : Không



R.AX:=01h;

INTR($33,R);



Hàm 02h: ẩn trỏ chuột

Vào : AX=02h

Ra : Không



R.AX:=02h;

INTR($33,R);



Hàm 03h: Trạng thái nhấn chuột

Vào : AX=03h

Ra : CX,DX=toạ độ ảo của chuột.

BX=trạng thái nút chuột nhấn

bit 0: Nút trái

bit 1: Nút phải

bit 2: Nút giữa



R.AX:=03h;

INTR($33,R);

X=R.CX shl 3+1;

Y=R.DX shl 3+1;

if (R.BX and 1)=1 then

WRITE('Phim trai chuot!!!');





Hình 1.2. So sánh pipeline và tuần tự 5

Bảng xác định chế độ địa chỉ toán hạng bằng các trường MOD và R/M 21

CHƯƠNG 2: CÁC BỘ VI XỬ LÝ TIÊN TIẾN CỦA INTEL 30

2.5. BỘ ĐỒNG XỬ LÝ TOÁN 80X87 46

CHƯƠNG 3: CẤU TRÚC LẬP TRÌNH ASSEMBLY 48

CHƯƠNG 4: CÁC CẤU TRÚC LẬP TRÌNH 64

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

CHƯƠNG 6: LIÊN KẾT ASSEMBLY VỚI NGÔN NGỮ BẬC CAO 96

LỜI GIẢI 100






Khoa CNTT Trang KTMT


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