Bài thực hành số 1
Nhập môn
Mục đích
Làm quen với ngôn ngữ lập trình Assembly
Biết cách viết, dịch, chạy và chẩn lỗi (debug) một vài chương trình đơn giản
Tóm tắt lý thuyết
Hợp ngữ (assembler) là ngôn ngữ bậc thấp, giúp cho người lập trình không phải ghi nhớ mã máy
(opcode) mà sử dụng các từ ngữ gợi nhớ (pseudo-code) gần với ngôn ngữ tự nhiên để miêu tả công
việc cần thực hiện. Tuy vậy, assembler rất gần với ngôn ngữ máy, đòi hỏi người lập trình phải hiểu
biết tương đối đầy đủ về cấu trúc phần cứng máy tính.
Với mỗi kiểu kiến trúc của bộ vi xử lý, có một bộ lệnh riêng, do đó, có một ngôn ngữ assembler
riêng cho nó. Ở đây, chúng ta nghiên cứu assembler cho các bộ vi xử lý Intel thuộc họ x86. Các
chương trình sẽ được viết cho chế độ thực (real mode) trong DOS và được biên dịch bằng Turbo
Assembler.
Cấu trúc thông thường của một chương trình hợp ngũ
.model <Khai báo kiểu chương trình>
.stack <Khai báo kích thước ngăn xếp>
.data
<Khai báo dữ liệu>
.code
<Các lệnh>
end
Ví dụ: Chương trình sau in ra màn hình dòng chữ “Hello !”
.model small
.stack 100h
.data
s DB “Hello !$” ; khai báo xâu kí tự cần in
Khai báo trong C
Khai báo trong hợp ngữ
char ch;
ch DB ?
char ch = „a‟;
ch DB „a‟
char ch = 5;
ch DB 5
char s[]=”\nhello world!”
s DB 10,13,”hello world!$”
int i=100;
i DW 100
long l;
l DD ?
char a[] = {1,2,3};
a DB 1,2,3
char a[100];
a DB 100 dup(?)
char a[100][50];
a DB 100 dup(50 dup(?)) Dịch, liên kết, chạy và chẩn lỗi chương trình từ dấu nhắc DOS
Cần có các file: tasm.exe (dịch), tlink.exe (liên kết), td.exe (chẩn lỗi). Các bước như sau:
B1. Thiết lập đường dẫn
path = %path%;<đường dẫn đến thư mục chứa các file kể trên>
B2. Biên dịch từ file .ASM sang file .OBJ
Tasm <tên file chương trình>.ASM
những file có tên mở rộng “.asm”.
B0. Cấu hình Edit Plus: xem trong file hướng dẫn
B1. Biên dịch file .ASM : nhấn Ctrl + 1 sẽ biên dịch file đang soạn thảo thành .OBJ
B2. Liên kết : nhấn Ctrl + 2 sẽ biên dịch file .OBJ thành .EXE
B3. Chạy chương trình : nhấn Ctrl + 3 sẽ chạy chương trình .EXE
B4. Chẩn lỗi chương trình : nhấn Ctrl + 4 sẽ debug chương trình .EXE
Lưu ý:
- Để tránh phiền phức khi làm việc với Turbo Assembler, tránh đặt tên thư mục có chứa
khoảng trắng.
- Trước khi nhấn Ctrl + 1 lần đầu tiên, nhớ lưu chương trình với tên cần thiết.
Một số lệnh cơ bản
MOV des,src : chép dữ liệu từ src sang des
INC des : tăng des một đơn vị
DEC des : giảm des một đơn vị
ADD des,src : des = des + src
SUB des,src : des = des – src
INT num : gọi ngắt Tài liệu tham khảo
1. Nguyễn Minh Tuấn, Giáo trình hợp ngữ - Chương 1, ĐHKHTN, 2002
2. Randal Hyde, The art of assembly language programming – Chapter 1.
3. Norton Guide
4. Dan Rollins, TechHelp v.6.0
Bài tập
phép tính: x1-1, x1 +2, x1+x2, x1-x2
Ví dụ:
x1 = 5
x2 = 3
x1 – 1 = 4
x1 + 1 = 6
x1 + x2 = 8
x1 – x2 = 7
Mở rộng
1. Tự tìm hiểu xem hàm nào trong ngắt 21h dùng để nhập một xâu kí tự ? Ngoài ngắt 21h, còn
ngắt nào có thể dùng để nhập xuất từ bàn phím ? (dùng NortonGuide hoặc TechHelp).
2. Viết chương trình nhập tên và in ra màn hình câu “Hello ” + tên đã nhập.
3. Tìm hiểu xem tại sao không có lệnh MOV x1, x2 (x1,x2 là hai biến trong bộ nhớ)
4. Hai lệnh “INC AX” và “ADD AX, 1” khác nhau chỗ nào ?
Hướng dẫn
Bài 1. Để nhập 1 một ký tự sử dụng hàm 1 của ngắt 21h, để xuất, sử dụng hàm 2.
Ví dụ:
mov AH,1
int 21h ; kết quả trong AL
mov DL,AL ; kí tự cần xuất trong DL
mov AH,2
int 21h
Bài 2. Cặp kí tự xuống dòng là 10,13. Có thể khai báo nhiều xâu kí tự hoặc chung một xâu.
Ví dụ:
Msg3 DB 10,13,9,“1. Dich file ASM thanh file OBJ.$”
Msg4 DB 10,13,9,“2. Lien ket file OBJ thanh file EXE.$”
MOV AL,2
CMP AH,AL
Sau khi thực hiện hai lệnh trên, cờ Carry (CF) bật, báo hiệu rằng AH < AL
Bản chất của lệnh TEST Des,Src là lệnh AND Des,Src (thực hiện phép tính Des AND Src)
nhưng kết quả của phép tính không được lưu vào Des như trong lệnh AND.
Ví dụ: kiểm tra hai bit cuối cùng của AL
TEST AL,3 ; 3h = 11b
Nếu cờ Zero (ZF) bật, có nghĩa là cả hai bit 0 và 1 của AL đều bằng 0.
Lệnh nhảy
Thông thường, khi một lệnh (instruction) được thực hiện, giá trị của thanh ghi IP (instruction
pointer) được tự động cập nhật để trỏ đến lệnh kế tiếp. Ngoài ra, nội dung của thanh ghi IP chỉ có
thể bị thay đổi thông qua một số lệnh đặc biệt. Đó là: các lệnh nhảy (J*), lệnh lặp (LOOP*), lệnh gọi
hàm (call, ret), lệnh gọi ngắt (int, iret). Các lệnh này được xếp vào nhóm “Lệnh điều khiển luồng”
(Program flow control instructions). Trong bài thực hành này, chúng ta sẽ học cách sử dụng các lệnh
nhảy và các lệnh lặp.
Lệnh nhảy không điều kiện
JMP <target>
Có các trường hợp sau:
JMP SHORT <tên nhãn> (short jump). Khi đó trong mã lệnh lưu 1 byte khoảng
cách (offset) giữa vị trí hiện tại và vị trí cần nhảy đến. Kiểu này chỉ nhảy trong phạm
vi từ –128 đến +127 byte so với vị trí hiện tại.
Ví dụ: JMP SHORT Calculate
Ví dụ:
myPointer DD Prepare, Calculate, Check, Output
MOV bx,1 ; chỉ số trong mảng con trỏ
MOV cl,2
SHL bx,cl ; nhân 4
JMP myPointer[bx]
Prepare: ; công việc 0
Calculate: ; công việc 1 – nơi cần nhảy đến JMP <thanh ghi 2 byte> (indirect jump via regs). Nhảy đến địa chỉ lưu
trong thanh ghi AX.
Ví dụ:
MOV ax, offset Calculate
JMP ax ; (IP ← AX)
Lệnh nhảy có điều kiện
bằng, có dấu).
JNE, JNZ (nhảy nếu không bằng).
Ví dụ: nếu AL là số nguyên không dấu thì đoạn chương trình ở trên phải sửa lại như sau:
MOV AH,AL
CMP AH,1
JAE Greater
. . .
Greater:
Lệnh lặp
Bằng cách dùng các lệnh nhảy có thể tạo ra vòng lặp. Tuy nhiên, để viết chương trình tiện lợi và
ngắn gọn, có thể dùng thêm các lệnh lặp như LOOP, LOOPZ,…
Lệnh LOOP <Label> tự động giảm CX một đơn vị, sau đó kiểm tra xem CX có bằng 0, nếu
không bằng thì nhảy đến nhãn <Label>
Lệnh LOOPZ <Label> tự động giảm CX một đơn vị, sau đó kiểm tra xem CX có bằng 0
hoặc cờ ZF có bật không, nếu cả hai điều này không xảy ra thì nhảy đến nhãn <Label>
Ví dụ: Nhập mảng A gồm 10 ký tự
MOV SI, 0 ; chỉ số mảng
MOV CX, 10 ; số lần lặp
LAP:
;nhập ký tự
MOV AH, 1
INT 21H
MOV A[SI], AL
INC SI
Ví dụ: N = 3, M = 5 => USCLN(3, 5) = 1 => 3, 5 là 2 số nguyên tố cùng nhau.
Bài 5. Dùng lệnh lặp, viết chương trình nhập vào 1 chuỗi ký tự. Sau khi nhập xong đếm xem chuỗi
có bao nhiêu ký tự. Xuất số ký tự có trong chuỗi.
Ví dụ: S = "Hello world !" ==> Số kí tự trong chuỗi là 13.
Bài 6. Nhập vào 2 chuỗi số, đổi 2 chuỗi thành số, sau đó cộng hai số, đổi ra chuỗi và xuất chuỗi
tổng.
Ví dụ: S1 = "123" => N1 = 123
S2 = "456" => N2 = 456
N = N1 + N2 = 123 + 456 = 579 => S = "579" (xuất S ra màn hình)
Bài 7. Viết chương trình cho phép nhập vào một chuỗi S.
Đổi tất cả ký tự thường thành ký tự hoa.
Đổi tất cả ký tự hoa thành ký tự thường.
Bài 8. Nhập và xuất mảng 1 chiều. Tìm phần tử max, min, tính tổng các phần tử trong mảng.
Ví dụ: N = 5
A[N] = {3,1,2,7,4}
=> max = 7, min = 1, tổng = 17.
Bài 9. Cài đặt thuật toán Bubble Sort dùng ASM.
Thuật toán Bubble Sort theo ngôn ngữ C như sau:
for (int i = 0; i< N-1; i++)
for(int j=N-1;j > i; j )
if(a[j] < a[j-1])
Hoan_Vi (a[j], a[j-1]);
Bài 10. Nhập và xuất mảng A hai chiều.
CMP AL, 's'
JE CHAO_BUOI_SANG
CMP AL, 'T'
JE CHAO_BUOI_TRUA
CMP AL, 't'
JE CHAO_BUOI_TRUA
CMP AL, 'C'
JE CHAO_BUOI_CHIEU
CMP AL, 'c'
JE CHAO_BUOI_CHIEU
CHAO_BUOI_SANG:
LEA DX, CBS
MOV AH,9
INT 21H
JMP THOAT
CHAO_BUOI_TRUA:
LEA DX, CBT
MOV AH,9
INT 21H
JMP THOAT
CHAO_BUOI_CHIEU:
LEA DX, CBC
MOV AH,9
MOV A[DI], DL
MOV A[SI], BL
MOV DL, A[SI]
LAP:
INC DI
LOOP FOR_J
INC SI
POP CX
LOOP FOR_I
Bài thực hành số 3
Ngăn xếp – Thủ tục – Macro
Mục đích
Hiểu được cơ chế hoạt động của ngăn xếp, quá trình gọi một thủ tục.
Biết cách sử dụng ngăn xếp, khai báo và gọi thủ tục.
Biết cách tạo và sử dụng macro.
Tóm tắt lý thuyết
Ngăn xếp
1. Một số lưu ý:
Ngăn xếp (Stack) là vùng nhớ đặc biệt được truy cập theo cơ chế “vào trước ra sau”
(LIFO – Last In First Out), nghĩa là dữ liệu nào đưa vào sau sẽ được lấy ra trước.
Ngăn xếp gồm nhiều phần tử, mỗi phần tử là một từ (2 bytes).
Vị trí của ngăn xếp trong bộ nhớ được xác định bởi cặp thanh ghi SS:SP (SS chứa địa
chỉ đoạn, SP chứa địa chỉ ô của đỉnh ngăn xếp). Khi chưa sử dụng, ngăn xếp rỗng, vị
trí được xác định bởi SP lúc đó là đáy ngăn xếp.
2. Khai báo:
dao la: $'
.code
mov ax,@data
mov ds,ax
mov ah,9
lea dx,msg1
int 21h
mov cx,0
nhap:
mov ah,1
int 21h
cmp al,13
je thongbaoxuat
xor ah,ah
push ax
inc cx
jmp nhap
thongbaoxuat:
mov ah,9
lea dx,msg2
int 21h
xuat:
pop ax
mov dl,al
mov ah,2
int 21h
loop xuat
00
62
00
61
Nhập ký tự „c‟: 00
63
00
62
00
61
3. Xuất các giá trị trong ngăn xếp
Xuất ký tự „c‟: 00
63
00
62
00
61
Xuất ký tự „b‟:
SS:SP
…
0FCh 0FCh SS:SP
000h
…
0FCh 0FCh SS:SP
000h
100h 000h
…
0FCh
000h
100h …
0FCh 0FCh SS:SP
000h
100h 100h 100h Thủ tục
1. Khai báo:
<Tên thủ tục> PROC <Kiểu>;kiểu là NEAR(mặc định) hay FAR
; thân thủ tục
……………
pop bx
mov ah,2
mov dl,‟?‟
int 21h
xor cx,cx
nhap:
mov ah,1
int 21h
cmp al,13
je ketthucnhap
push ax
inc cx
jmp nhap
ketthucnhap:
push bx
RET
Nhap ENDP
;
Xuat PROC
pop bx
mov ah,2
mov dl,13
int 21h
mov dl,10
int 21h
jcxz ketthucxuat
xuat:
pop dx
int 21h
loop xuat
BX = địa chỉ lệnh “CALL Xuat”
4. Nhập ký tự a,b:
00
62
00
61
5. Trả lại địa chỉ quay về
BX = địa chỉ lệnh “CALL Xuat”
CALL Xuat
00
62
00
61
6. Kết thúc thủ tục Nhập:
…
0FCh 0FCh SS:SP
000h
100h 000h
…
0FCh 0FCh 100h SS:SP
…
0FCh
0FCh SS:SP
Macro
1. Một số lưu ý:
Khi chúng ta có nhiều đoạn code giống nhau, chúng ta có thể sử dụng macro để thay
thế, giống như chúng ta dùng define ở trong C.
Bản chất là thay thế lời gọi macro bằng các lệnh trong thân macro.
Các macro nên phục hồi những thanh ghi mà nó sử dụng trừ những thanh ghi chứa
kết quả.
2. Khai báo:
<tên macro> MACRO <các đối số>
; thân macro
……………
ENDM
3. Hai cách sử dụng macro
Tạo macro trực tiếp trong chươnng trình:
Các macro thường được khai báo ở đầu chương trình trước phần .code.
Ví dụ: Xuất một chuỗi ra màn hình sử dụng macro
.model small
.stack 100h
.data
chuoi1 db “hello”,10,13,‟$‟
chuoi2 db “bye”,10,13,‟$‟
TestMacro.asm
.model small
.stack 100h
.data
chuoi1 db “hello”,10,13,‟$‟
chuoi2 db “bye”,10,13,‟$‟
INCLUDE THUVIEN.INC
.code
…
@xuatchuoi chuoi1
@xuatchuoi chuoi2
…
end
4. Các thành phần cục bộ của macro:
Trong macro, ta cũng có thể khai báo các biến, nhãn cục bộ để tránh gây ra lỗi khi
gọi macro nhiều lần.
Cú pháp :
LOCAL <danh sách các nhãn, các biến cục bộ>
Ví dụ: Xuất một chuỗi hằng ra màn hình sử dụng macro với biến cục bộ
.model small
.stack 100h
@xuatchuoi macro chuoi
LOCAL chuoicucbo, nhancucbo
.data
chuoicucbo db chuoi,‟$‟
Bài 1: Viết chương trình kiểm tra một biểu thức đại số có chứa các dấu ngoặc (như (), [] và {}) là
hợp lệ hay không hợp lệ .
Ví dụ:
(a + [b – { c * ( d – e ) } ] + f)
là hợp lệ nhưng
(a + [b – { c * ( d – e )] } + f)
là không hợp lệ.
Bài 2: Tính giá trị biểu thức đã nhập ở bài tập 2 theo thứ tự từ trái sang phải.
Bài 3: Viết lại các bài tập tuần trước dưới dạng các thủ tục
Bài 4: Xây dựng một thư viện các macro
Mở rộng
1. Có những cách nào để truyền tham số cho thủ tục ? để nhận kết quả trả về ?
2. Thử viết một thủ tục đệ quy.
3. Tìm hiểu cách phân chia chương trình thành nhiều file và cách biên dịch, liên kểt chúng.
Hướng dẫn
Bài 1. dùng ngăn xếp để PUSH các dấu ngoặc trái ( „(„, ‟{„, „[„ ) vào ngăn xếp. Nếu gặp dấu ngoặc
phải ( „)‟, „}‟, „]‟ ) thì POP từ stack ra. Nếu không POP được, hoặc POP ra không đúng loại với dấu
ngoặc phải -> không hợp lệ . Ngược lại là biểu thức hợp lệ.
Bài thực hành số 4
Làm việc với số nguyên
Mục đích
Biết sử dụng các phép toán logic, số học
Biết cách đổi giữa các cơ số nhị phân, thập phân và thập lục phân
Tóm tắt lý thuyết
1. Cộng ADD, ADC : ADD (ADC) đích , nguồn
Ví dụ : ADD AL , 10H -> AL = AL + 10H
2. Trừ SUB, SBB : SUB (SBB) đích , nguồn
Ví dụ : SUB BL, 10H -> BL = BL – 10H
Chú ý : Các phép toán cộng trừ trực tiếp giữa các ô nhớ là không hợp lệ. Ngoài ra
ta cũng có thể sử dụng INC hoặc DEC để cộng hoặc trừ 1 đơn vị vào nội dung
một ô nhớ hoặc một thanh ghi.
3. Nhân MUL, IMUL: MUL (IMUL) nguồn
Lệnh MUL thực hiện phép nhân không dấu, còn IMUL là lệnh nhân có dấu. Nếu nguồn là
byte (8 bit) thì kết quả chứa trong AX và AX = AL * nguồn. Nếu nguồn là word (16 bit) thì
kết quả chứa trong DX:AX và DX:AX = AX * nguồn. Nếu nguồn là double (32 bit) thì kết
quà chứa trong EDX:EAX và EDX:EAX = EAX * nguồn.
4. Chia DIV, IDIV : DIV (IDIV) số chia
Lệnh DIV thực hiện chia không dấu, còn IDIV là lệnh chia có dấu. Nếu số chia là byte (8
bit) thì số bị chia là AX và kết quả gồm: phần dư = AH, phần thương = AL. Nếu số chia là word (16
bit) thì số bị chia là DX:AX và kết quả gồm phần dư = DX, phần thương = AX. Nếu số chia là
double thì sô bị chia là EDX:EAX và kết quả gồm phần dư = EDX, phần thương = EAX.
Chú ý : phải xoá giá trị DX hoặc EDX trước khi nhân, hoặc chia.
Tài liệu tham khảo
1. Nguyễn Minh Tuấn, Giáo trình hợp ngữ - Chương 7, ĐHKHTN, 2002
2. Randal Hyde, The art of assembly language programming – Chapter 9.
3. Norton Guide
4. Dan Rollins, TechHelp v.6.0
Bài tập
1. Viết chương trình (VCT) đổi một số dạng thập phân sang thập lục phân.
Ví dụ: Nhập một số hệ 10 : 26
Dạng thập lục phân: 1A
2. VCT nhập một số hệ thập phân rồi xuất ra biểu diễn dạng nhị phân của nó.
Biết sử dụng các phép toán trên chuỗi
Biết làm một số thao tác với xâu kí tự (tìm kiếm, đếm từ, chuyển hoa / thường …. )
Tóm tắt lý thuyết
Cờ hướng DF (Direction Flag) : xác định hướng xử lí chuỗi. Khi DF = 0 (dùng lệnh
CLD) chuỗi được xử lí tăng dần, ngược lại DF = 1 (lệnh STD) chuỗi được xử lí giảm
dần.
Con trỏ chuỗi: DS:SI – địa chỉ nguồn và ES:DI – địa chỉ đích
Các lệnh trên chuỗi :
1. MOVSB (MOVSW) : chuyển nội dung của byte (word) được định bởi DS:SI đến
byte (word) được chỉ bởi ES: DI. Sau đó SI và DI tự động tăng lên 1 (hoặc 2) nếu
cờ DF = 0 hay giảm 1 (hoặc 2) nếu DF = 1
Ví dụ: giả sử cần chép nội dung chuỗi thứ nhất : ‘HELLO’ vào chuỗi
thứ hai theo thứ tự ngược lại ta làm như sau :
.DATA
STR1 DB ‘HELLO’
STR2 DB 5 DUP(‘?’)
.CODE
MOV AX, @DATA
MOV DS, AX
MOV ES, AX
LEA SI, STR1+4 ; cuối STR1
LEA DI, STR2 ; đầu STR2
STD ; định hướng xử lí giảm
MOV CX, 5
move :
MOVSB
ADD DI,2 ; + 2 do DI bị giảm
INT 21H
JMP while1
end_while1: ; thoát khỏi vòng lặp
4. LODSB (LODSW) : chuyển nội dung của byte (word) được định bởi
DS:SI vào AL (hoặc AX) sau đó tăng (hoặc giảm) SI 1 (hoặc 2) đơn vị.
5. SCASB (SCASW): tìm nội dung chứa trong AL (hoặc AX) có trong chuỗi
định bởi ES:DI hay không. Nếu tìm thấy thì cờ ZF sẽ được bật. Sau mỗi
lần thực hiện con trỏ DI sẽ tăng hoặc giảm 1 (hoặc 2) đơn vị.
6. CMPSB (CMPSW) : so sánh byte tại DS:SI và byte tại ES:DI, sau đó tăng
(hoặc giảm) SI và DI 1 (hoặc 2) đơn vị.
Bài tập
1. VCT nhập một chuỗi kí tự và in ra chuỗi theo thứ tự ngược lại. In chiều dài chuỗi.
Ví dụ : Nhập chuỗi : abcd Chuỗi kết quả: dcba Chiều dài chuỗi: 4
2. VCT nhập họ tên .Sau đó biến tất cả thành chữ hoa rồi in ra. Biến tất cả thành chữ thường rồi in
ra.
Ví dụ: Nhập vào chuỗi : Thanh cHi khanG Chuỗi Hoa : THANH CHI KHANG
Chuỗi kết quả thường: thanh chi khang
3. Nhập một chuỗi kí tự tính tần số xuất hiện của các nguyên âm.
Ví dụ : Nhập chuỗi : Thanh Chi Khang Số lần xuất hiện của các nguyên âm là: 3
4. VCT nhập hai chuỗi, liệt kê các kí tự có mặt trong hai chuỗi.
Ví dụ: Nhập chuỗi: computer và chuỗi : informatic
Các kí tự có mặt trong hai chuỗi : o, m, t, r
5. Nhập vào hai chuỗi kí tự, so sánh hai chuỗi (= > < ).
Ví dụ: Chuỗi thứ nhất: forn Chuỗi thứ hai : form
Kết quả : Chuỗi thứ nhất > chuỗi thứ hai.
6. Nhập vào hai chuỗi kí tự, kiểm tra chuỗi thứ nhất là chuỗi con chuỗi tthứ hai không, không phân
biệt hoa thường.
: DS:DX trỏ đến đường dẫn đến file cần mở, là chuỗi ASCIIZ.
AL là kiểu mở
AL = 0: read-only
= 1: write-only
= 2: read/write
Output
: Nếu CF = 0 thì AX chứa handle của file
Nếu CF = 1 thì lỗi mở file
3. Đọc file: AH = 3Fh
Input
: BX chứa handle của file.
CX chứa số byte cần đọc.
DS:DX trỏ đến buffer đủ lớn để chứa các byte đọc được.
Output
: Nếu CF = 0 thì AX chứa số byte thật sự đọc được.
Nếu CF = 1 thì việc đọc có lỗi, xét AX.
Nếu AX = 5 là lỗi đọc
Nếu AX = 6 là thẻ không có giá trị.
4. Ghi file: AH = 40h
Input
: BX chứa handle của file.
CX chứa số byte cần ghi.
DS:DX trỏ đến buffer chứa các byte để ghi.
Khoa Công Nghệ Thông Tin – Trường ĐH KHTN Tp.HCM - 1 -
Hướng dẫn thực hành môn Hợp Ngữ File
Output: Nếu CF = 0 thì AX chứa số byte thật sự được ghi.
Nếu CF = 1 thì thông báo lỗi ghi file, xét AX.
Nếu AX = 5: file không được phép ghi.
Nếu CF = 1 thì việc di chuyển con trỏ không thành công, xét AX:
- Nếu AX = 1 thì giá trị trong thanh ghi AL không có trong 3
giá trị hợp lệ của phần input trước khi gọi ngắt.
- Nếu AX = 6 thì handle không mở.
8. Đổi thuộc tính cho file
Input
: DS:DX trỏ đến đường dẫn file là 1 chuỗi ASCIIZ.
Nếu AL = 0 để lấy thuộc tính file
Nếu AL = 1 để đặt thuộc tính file thì
- CX = 00: normal
- CX = 01: read-only
- CX = 02: hidden
- CX = 04: system
- CX = 10h: thư mục con
- CX = 20h: archive
Output
: Nếu CF = 0 và AL = 00h thì CL chứa thuộc tính của file
Khoa Công Nghệ Thông Tin – Trường ĐH KHTN Tp.HCM - 2 -
Hướng dẫn thực hành môn Hợp Ngữ File
Nếu CF = 1 thì có lỗi, xét AX:
Nếu AX = 1: AL không hợp lệ.
Nếu AX = 3: đường dẫn không hợp lệ hoặc file không tìm
thấy.
Nếu AX = 5: không thể thay đổi thuộc tính.
Khoa Công Nghệ Thông Tin – Trường ĐH KHTN Tp.HCM - 3 -