Nhóm l nh lặp

Một phần của tài liệu Giáo trình kiến trúc máy tính và hợp ngữ (Trang 144 - 165)

Vòng lặp là m t đo n ch ng trình đ c thực hi n nhi u lần cho đ n khi th a m t đi u ki n nào đó thì d ng l i, do đó vòng lặp th ng k t thúc bằng m t l nh nhảycó đi u ki n. Tuy nhiên, ngoài các l nh nhảy đã bi t, Intel-8086 còn cung cấp thêm các l nh vòng lặp nh LOOP, LOOPE, LOOPZ, LOOPNE, LOOPNZ… các l nh nàyđ u có cú pháp gi ng nhau.

Cú pháp:

LOOP Đích

Trong đó: Đích có thể là: Immed, Reg, Mem

Công dụng: Tự đ ng giảm CX m t đ n v , n u CX ≠ 0 thì nhảy đ n Đích, ng c l i n u CX = 0 thì không nhảy đ n Đích mà thực hi n l nh ngay sau LOOP. Nói cách khác, vòng lặp LOOP d ng l i khi CX=0. Đây là vòng lặp for có s lần lặp đ c xác đnh trong CX.

Cấu trúc vòng lặp for viết bằng LOOP: MOV CX, n ; n là s lần lặp nhan: ………….. ; Các l nh cần lặp l i …………... LOOP nhan Ví dụ: Đo n l nh in ra màn hình các ký tựt A đ n Z

MOV DL, ‘A’ ; DL ← ‘A’ MOV CX, 26 ; A→Z: 26 ký tự

inkytu: MOV AH, 02h

INT 21h

INC DL ; DL tăng lên 1 để có ký tự k LOOP inkytu

Lặp v i LOOPZ/LOOPE:

Tự đ ng giảm CX m t đ n v , n u CX ≠ 0 và ZF = 1 thì nhảy đ n Đích để thực hi n l nh. Ng c l i, n u CX = 0 hay ZF = 0 thì không nhảy, khi đó l nh vi t sau l nh nhảy đ c thực hi n.

Cấu trúc vòng lặp do … while viết bằng LOOPZ:

MOV CX, n

nhan: <Các l nh cần lập>

LOOPZ nhan

Lặp v i LOOPNZ/LOOPNE:

Tự đ ng giảm CX m t đ n v , n u CX ≠ 0 và ZF = 0 thì nhảy đ n Đích để thực hi n l nh. Ng c l i, n u CX = 0 hay ZF = 1 thì không nhảy, khi đó l nh vi t sau l nhnhảy đ c thực hi n

Cấu trúc vòng lặp do … while viết bằng LOOPNZ:

MOV CX, n

nhan: <Các l nh cần lập>

LOOPNZ nhan

- N u CX=0, vì LOOP giảm CX tr c khi kiểm tra nên khi thực hi n l nh LOOP thì CX = CX–1 = 0–1 = –1 = 0FFFFh. Nh vậy LOOP s thực hi n thêm 65535 lần n a.

- L nh JCXZ nhảy khi CX = 0 th ng đ c dùng để kiểm tra giá tr CX tr c khi thực hi n vòng lặp.

Ví dụ: Nhập mảng A g m 10 ký tự, d ng l i n u gặp phím Enter

MOV SI, 0 ; ch s mảng MOV CX, 10 ; s lần lặp

LAP: MOV AH, 1 ; nhập ký tự INT 21H

MOV A[SI], AL INC SI

CMP AL, 0Dh LOOPNE LAP

Ví dụ: Vi t ch ng trình s dụng hàm 01/21h để nhập chu i ký tự dài t i đa 128

ký tự hoặc k t thúcbằng phím Enter DSEG SEGMENT (adsbygoogle = window.adsbygoogle || []).push({});

chuoi DB 128 DUP(?) DSEG ENDS

CSEG SEGMENT

ASSUME CS: CSEG, DS: DSEG start: MOV AX, DSEG

MOV DS, AX

LEA SI, chuoi ; SI ← đ a ch chu i

MOV CX, 128 ; Chi u dài chu i t i đa (s vòng lặp)

key_in: MOV AH, 01h ; Hàm nhập 1 ký tự INT 21h

MOV [SI], AL ; Cất ký tự vào bi n chu i INC SI

LOOPNE key_in ; hay chưa đủ 128 ký tự thì nhập tiếp MOV AH, 4Ch INT 21h CSEG ENDS END start 6.4. M t s ngắt c a DOS và BIOS 6.4.1. T ng quan v ngắt

M t bí quy t để lập trình thành công và hi u quả cao trên máy tính kiểu IBM PC là vi c s dụng có hi u quả các ch ng trình phục vụ c a BIOS (Basic Input Output System) đ c cài đặt sẳn ngay trong vùng nh ROM-BIOS c a máy tính hay các ch ng trình phục vụ c a h đi u hành DOS. Ngắt m m (hay Ngắt) là cách gọi tên ngắn gọn c a các ch ng trình phục vụ này.

Ngắt m m là ch ng trình mã máy nh phân (chính xác h n là ch ng trình con) đ c thi t k sẳn và t n t i trong b nh c a máy tính nhằm thực hi n các ch c năng đi u khiển phần c ng máy tính m i khi đ c gọi thực hi n. Khi đó, để đi u khiểnphần c ng nào thì ng i lập trình ch cần gọi các ngắt t ng ng để thực hi n công vi c mà không cần phải bi t đ n cấu trúc c a phần c ng là nh th nào, nguyên lý vận hành c a phần c ng đó ra sao…. đây là công vi c rất khó khăn đ i v i ng i làm phầnm m không quen thu c v i phần c ng là nh ng m ch đi n t .

Các ngắt m m đ c xem nh là cầu n i gi a phần c ng và các ngôn ng lập trình (kể cả h đi u hành). Chúng làm vi c trực ti p v i phần c ng và các thi t b ngo i vi, thực hi n nh ng ch c năng c bản nhất c a h th ng nh đọc/ghi t ng byte d li u bàn phím, ra màn hình hoặcđĩa t …

Ngôn ng lập trình (H p ng ) Ngắt DOS

Ngắt ROM BIOS Phần c ng - Ngo i vi

Hình 6.1 trình bày các cách giao ti p v i phần c ng c a ngôn ng lập trình thông qua các ngắt hay trực ti p v i các thi t b phần c ng. Giao ti p trực ti p s khó khăn h n rất nhi u so v i giao ti p thông qua cácNgắt.

Các ngắt c a BIOS luôn sẳn có trong máy tính IBM-PC, còn các ngắt DOS ch t n t i đ i v i h đi u hành DOS. Nghĩa là, n u máy tính IBM-PC đ c cài đặt h đi u hành UNIX thì trên máy đó không t n t i các ngắt DOS. H đi u hành Windows đ c phát triển trên c s c a h đi u hành DOS nên các ngắt DOS vẫn s dụng đ c trên h đi u hành Windows. Tất nhiên có m t vài ngắt DOS không đ c phép s dụng vì để đảm bảo đ an toàn cho vận hành c a h đi u hành Windows. Tài li u này ch gi i thi u nh ng ngắt rất c bản và th ng dùng.

6.4.2. S d ng ngắt trong h p ng

Khi s dụng ngắt cần l u ý m t s y u t sau: - Ch c năng c a ngắt/hàm.

- Tên ngắt/hàm: Dùng s hex t 0h đ n 0FFh

- Tham s vào: Thanh ghi hay b nh do hàm qui đ nh. - Tham s ra: Thanh ghi hay b nh do hàm qui đ nh.

Lệnh gọi 1 ngắt hay 1 hàm:

MOV AH, <tên hàm>

…. ; Khai báo tham số vào (nếu có)

INT <tên ngắt>

…. ; Lưu trữ tham số ra (nếu có)

Ví dụ: Hàm 02h c a ngắt 21h thực hi n vi c in ký tự trong thanh ghi DL ra màn

hình. Nh vậy, khi mu n hiển th ký tự B trên màn hình, ta vi t nh sau đo n l nh nh sau:

MOV AH, 02h ; Chọn hàm 02h

MOV DL, ‘B’ ; DL chứa ký tự cần in ‘B’

INT 21h ; Gọi ngắt thực hiện để in ký tự (adsbygoogle = window.adsbygoogle || []).push({});

Lưu ý: Vi c s dụng thanh ghi DL để ch a ký tự cần in là do hàm 02h qui đ nh,

không thể s dụng thanh ghi khác để thay th .

Các ngắt c a DOS đ c đánh s t 20h đ n 0FFh. Ngắt quan trọng nhất là ngắt 21h –g m nhi u ch c năng (hàm) c a DOS.

INT 20h: Chấm d t ch ng trình và tr v DOS t m t ch ng trình có phần m r ng .COM.

INT 23h: Chặn t h p phím Ctrl- Break

Ng i s dụng có thể chấm d t s m m t ch ng trình bằng cách bấm t h p phím Ctrl-Break. T h p phím nầy làm CPU nhảy t i ch ng trình phục vụ ngắt 23h và sau đó đ n m t th tục c a DOS để k t thúc ch ng trình đang ch y và tr v DOS.N u mu n không cho phép ch ng trình k t thúc s m bằng Ctrl-Break, ta có thể cho ngắt 23h tr đ n m t ch ng trình đặt bi t nào đó để thông báo lên màn hình rằng không cho ch ng trình đang ch y k t thúc s m.

INT 27h: K t thúc và đặt th ng trú

Ngắt này cho phép l u trong b nh trong m t ch ng trình nào đó cho đ n khi tắt máy. Để s dụng ngắt 27h, ta cho ch y m t ch ng trình g m 2 phần. M t phần s phụ trách vi c th ng trú cho phần kia.

INT 21h: Các ch c năng c a DOS

Hàm 01h Đ i đọc 1 ký tự t bàn phím (có hiện trên màn hình)

Vào: Không

Ra AL : Mã ASCII c a phím nhận đ c

Đ i đọc m t ký tự t bàn phím (phím nhận đ c s hiển th trên màn hình). Khi m t phím đ c ấn thì ký tự t ng ng v i phím đó đ c l u trong thanh ghi AL. N u phím đ c ấn là m t phím đặt bi t thì AL=0. T h p phím Ctrl-Break k t thúc công vi c c a hàm này.

Hàm 02h: Hiển th 1 ký tự t i v trí con tr màn hình

Vào DL ← Mã ASCII c a ký tự cần hiển th

Ra: Không

Hàm 03h: Đọc d li u vào t c ng n i ti p chuẩn (COM1)

Vào Không

Ra AL : byte d li u đọc đ c

Vào DL ← ký tự cần xuất

Ra Không

Hàm 05h: Xuất byte d li u ra c ng máy in chuẩn (LPT1)

Vào DL : Byte d li u cần xuất

Ra Không

Hàm 06h: Nhập / Xuất t thi t b chuẩn (không đ i)

Vào DL ← Mã ASCII ký tự cần xuất lên màn hình N u DL ← 0FFh : Thực hi n ch c năng nhập ký tự Ra N u ZF = 0 thì AL ch a Mã ASCII ký tự nhận đ c N u ZF = 1 thì không nhận đ c ký tự Hàm 07h Gi ng hàm 1, nh ng không hi n ký tự ra màn hình Vào Không Ra AL : Mã ASCII ký tự nhận đ c Hàm 08h Gi ng hàm 1, nh ng không hi n ký tự ra màn hình Vào Không Ra AL : Mã ASCII ký tự nhận đ c

Lưu ý: Ctrl-Break không ảnh h ng đ n ho t đ ng c a hàm 07h và 08h

Hàm 09h Xuất 1 chu i ký tự lên màn hình

Vào DS:DX ← đ a ch logic c a chu i ký tự cần xuất

Ra Không (adsbygoogle = window.adsbygoogle || []).push({});

Lưu ý: DS ← đ a ch segment c a chu i trong b nh DX ← đ a ch offset c a chu i trong b nh

Chu i ký tự phải chấm d t bằng ký tự ‘$

Ví dụ: In chu i “Hello Assembly” ra màn hình.

Khai báo biến chứa chuỗi trong đoạn dữ liệu DS:

chuoiDB ‘Hello Assembly$

Viết chương trình trong đoạn lệnh:

MOV AH, 09h ; Gọi hàm 09h

LEA DX, chuoi ; DX ← Offset(chuoi) INT 21h ; Thực hi n hàm

Hàm 0Ah Đ i đọc 1 chu i ký tự t bàn phím, k t thúc bằng Enter

Vào DS:DX ← đ a ch c a vùng đ m bàn phím trong b nh

Ra LEN: T ng s ký tự nhận đ c

BUFF: Mã ASCII c a các ký tự nhận đ c

Hàm 0Ah nhận 1 chu i ký tự t bàn phím, k t thúc bằng phím Enter (Mã ASCII là 0Dh). Hàm trả v chu i nhận đ c và chi u dài chu i trong vùng đ m bàn phím. Vùng đ m bàn phím là 1 bi n mảng trong b nh g m 3 phần MAX, LEN và BUFF có cấu trúc nh sau:

MAX LEN BUFF BUFF+1 BUFF+2 BUFF+… BUFF+n MAX: ch a s ký tự t i đa có thể nhận đ c gán khi khai báo.

LEN: ch a t ng s ký tự c a chu i nhận đ c, do hàm trả v sau khi nhận đ c chu i.

BUFF: ch a mã ASCII c a t ng ký tự trong chu i nhận đ c (mỗi ký tự chiếm 1

byte nhớ). Nh vậy, s byte c a BUFF phải bằng hay l n h n giá tr c aMAX.

Ví dụ: Nhận chu i t i đa 30 ký tự t bàn phím

Khai báo vùng đệm trong đoạn dữ liệu:

MAX DB 30 ; T o bi n MAX LEN DB ? ; T o bi n LEN

BUFF DB 31 DUP(?) ; Vùng nh l u tr ký tự

Viết chương trình trong đoạn lệnh:

MOV AH, 0Ah

LEA DX, MAX ; DX ← Đ/c vùng đ m bàn phím INT 21h

Cách khai báo bi n vùng đ m bàn phím khác: BANPHIM DB 30, ?, 31 DUP(?)

Hàm 0Bh Cho tr ng thái bàn phím

Vào DS:DX ← đ a ch logic c a vùng đ m bàn phím trong b nh

Ra LEN: T ng s ký tự nhận đ c

BUFF: Mã ASCII c a các ký tự nhận đ c

Vào: (adsbygoogle = window.adsbygoogle || []).push({});

DS:DX ← Đ a ch chu i tên c a tập tin m i.

CX ← thu c tính c a tập tin (0: bình th ng, 1: ch đọc, 2: ẩn, 4: tập tin h th ng)

Ra AX : Thẻ tập tin

Hàm 3Dh M tập tin trên đĩa

Vào DS:DX ← Đ a ch chu i tên c a tập tin m i.

AL ← kiểu truy xuất tập tin (0: ch đọc, 1: ch ghi, 2: đọc/ghi)

Ra AX : Thẻ tập tin

Khai báo tên tập tin và bi n ch a thẻ file: Tenf DB “C:\DULIEU\DATA.TXT”,0 Thef DW ?

Chu i Tên tập tin có ch a cả tên đ ng dẫn c a file. N u không có tên đ ng dẫn thì s truy xuất trong th mục hi n hành.

Thẻ tập tin là thành phần quan trọng trong vi c truy xuất file nên sau khi m hay t o file phải l u tr l i để s dụng trong vi c đọc/ghi file. M i file phải có m t thẻ file, bi n thẻ file phải là 2 bytes.

MOV Thef,AX ;L u tr thẻ file vào bi n.

MOV BX,Thef ;Đ a thẻ file vào BX để truy xuất file

Có thể m hay t o nhi u tập tin khác nhau trong cùng ch ng trình để x lý. Khi đó, m i thẻ tập tin phải đ c l u tr trong m i bi n khác nhau.

Hàm 3Eh Đóng tập tin đang m .

Vào BX ← Thẻ tập tin

Ra AX : Mã l i (n u có)

Sau khi x lý xong tập tin và tr c khi thoát kh i ch ng trình, tập tin phải đ c đóng l i để cập nhật thông tin hoặc n i dung m i c a tập tin.

Hàm 3Fh Đọc n i dung tập tin vào b nh

Vào

DS:DX ← Đ a ch vùng nh ch a d li u đọc đ c BX ← Thẻ tập tin cần đọc

CX ← s byte cần đọc

Ra AX : S byte đọc đ c

Hàm 40h Ghi d li u trong b nh vào tập tin

Vào

DS:DX ← Đ a ch vùng nh ch a d li u cần ghi BX ← Thẻ tập tin cần đọc

CX ← s byte cần ghi

Ra AX : S byte ghi đ c

Các hàm 3Fh và 40h cũng có thể đ c s dụng đọc hoặc ghi d li u cho ngo i vi, vì DOS quản lý vi c truy xuất ngo i vi bằng thẻ

Hàm 41h Xóa tập tin trên đĩa

Vào DS:DX ← Đ a ch chu i tên tập tin (adsbygoogle = window.adsbygoogle || []).push({});

Ra AX : Mã l i (n u có)

Hàm 42h Đ i con tr tập tin hi n hành

Vào AL ← H ng d i

CX:DX ← Cự ly d i = (CX*65536) + DX BX ← Thẻ tập tin

Ra DX:AX : V trí con tr m i = (DX*65536)+AX Cấu trúc d li u trong tập tin:

0 1 2 3 4 5 6 7 8 9 10 11 12

C H A O “ ” B A N EOF

Con tr tập tin hi n hành

Hàm 43h Đọc hoặc thay đ i thu c tính tập tin trên đĩa

Vào

DS:DX ← Đ a ch chu i tên tập tin

Nếu Đọc thuộc tính: AL ← 0

Nếu Thay đ i thuộc tính: AL ← 1 và CX ← thu c tính m i

Ra Nếu Đọc thuộc tính: CX : ch a thu c tính tập tin

Vào Không

Ra Không

Hàm 56h Đ i tên tập tin

Vào DS:DX ← Đ a ch chu i tên tập tin cũ ES:DI ← Đ a ch chu i tên tập tin m i

Ra Không 6.4.4 Ngắt c a BIOS INT 10h: Ngắt cho màn hình Hàm 0: Chọn ch đ hiển th cho màn hình Vào: AH=0, AL = Ch đ Ra: Không Hàm 1h: Thay đ i kích th c con tr Vào: AH=1h

4 bit thấp c a CH = dòng quét đầu 4 bit cao c a CH = dòng quét cu i Ra: Không Hàm 2h: D ch chuyển con tr Vào: AH=2 BH=trang s DH= hàng DL = c t Ra: không Hàm 3h: Xác đnh v trí và kích th c hi n th i c a con tr Vào AH=3, BH=trang s

Ra: CH=dòng quét đầu CL=dòng quét cu i DH=dòng

DL=c t

Vào: AH=5 AL=trang s DH=dòng DL=c t Ra: Không Hàm 6h:Cu n màn hình/c a s lên m t s dòng xác đnh Vào: AH=6 AL = S dòng cu n (AL=0 cu n cả màn hình hay c a s ) BH=thu c tính c a các dòng tr ng CH,CL=dòng,c t c a góc trái trên c a s DH,DL=dòng, c t c a góc phải d i Ra: Không Hàm 7: Cu n c a s hay màn hình xu ng Vào: AH=7 AL = S dòng cu n (AL=0 cu n cả màn hình hay c a s )

Một phần của tài liệu Giáo trình kiến trúc máy tính và hợp ngữ (Trang 144 - 165)