Ngày nay công nghiệp máy tính đã trở thành mũi nhọn khi bước vào kỷ nguyên kỹ thuật hiện đại.Với tốc độ tăng trưởng đáng kể những sản phẩm liên quan đến máy tính từ phần mềm tới các thiết bị ghép nối.Việt Nam cũng đang góp phần vào sự phát triển của công nghệ máy tính, chuyển mình dần từ thị trường tiêu thụ các sản phẩm máy tính thành nơi phát triển công nghệ. Bên cạnh đó công nghệ phần mềm của Việt Nam có nhiều bước tiến triển góp phần thúc đẩy sự phát triển của nền công ngiệp máy tính nói riêng và nền kinh tế nói riêng.
27 trang |
Chia sẻ: vietpd | Lượt xem: 1369 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Đề tài Xác lập mật khẩu cho chương trình dạng tệp có đuôi .COM, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Lời nói đầu
Ngày nay công nghiệp máy tính đã trở thành mũi nhọn khi bước vào kỷ nguyên kỹ thuật hiện đại.Với tốc độ tăng trưởng đáng kể những sản phẩm liên quan đến máy tính từ phần mềm tới các thiết bị ghép nối.Việt Nam cũng đang góp phần vào sự phát triển của công nghệ máy tính, chuyển mình dần từ thị trường tiêu thụ các sản phẩm máy tính thành nơi phát triển công nghệ. Bên cạnh đó công nghệ phần mềm của Việt Nam có nhiều bước tiến triển góp phần thúc đẩy sự phát triển của nền công ngiệp máy tính nói riêng và nền kinh tế nói riêng.
Đã có rất nhiều ngôn ngữ lập trình được sử dụng để tạo nên sự phát triển của nền công nghệ phần mềm. Một trong những ngôn ngữ lập trình xuất hiện sớm nhất đó là ngôn ngữ lập trình Assembler. Đây là một trong những ngôn ngữ lập trình bậc thấp thường được sử dụng để lập trình hệ thống, nó có một ưu điểm mà không một ngôn ngữ lập trình nào bì kịp, bởi lẽ nó tạo ra những chương trình có dung lượng rất nhỏ, nó thường được sử dụng để làm các chương trình quản lý trong công nghiệp ,diệt vius, tạo vius, tạo hệ điều hành, tạo mật khẩu…
Hiện nay hầu hết các chương trình khi viết xong đều được xác lập mật khẩu để bảo mật dữ liệu
Trong thời gian học tập tại khoá học 1996 – 2001 của trường Đại học Mở Hà Nội tôi đã được đào tạo một cách có hệ thống và tiếp thu những kiến thức về ngôn ngữ Assembler Để kết thúc khoá học tôi được nhận và hoàn thành đề tài “Xác lập mật khẩu cho chương trình dạng tệp có đuôi .COM”.
Mục tiêu của chương trình:
-Trước tiên chạy chương trình xác lập mật khẩu với những yêu cầu nhập tên tệp thực hiện dạng .COM
-Sau đó nhập mật khẩu; Sau khi tệp .COM đã xác lập mật khẩu thì từ đó trở đi chương trình chỉ được chạy khi vào đúng mật khẩu đã xác lập
Chương I
Cơ sở lý thuyết
Các file COM được lưu trên đĩa là hình ảnh chính xác của nội dung bộ nhớ sau khi các file này được nạp. Sau khi được nạp, các file .COM khong cần thêm một thông tin nào nữa và có thể chạy ngay, do vậy, các chương trình COM có thể được nạp và khởi động nhanh hơn so với cá chương trình EXE. Ngay sau khi chương trình COM được nạp vào bộ nhớ, ngay dưới PSP, nó được thực hiện bắt đầu từ ô nhớ sát ô nhớ cuối cùng của PSP, nghĩa là từ địa chỉ offset 100h. Ô nhớ này thường chứa một lệnh nhảy, lệnh này nhảy đến phần đầu thực của chương trình.
Một chương trình COM không thể vượt quá 64KB(65536 byte), tính cả độ dài của PSP (256 byte) và ít nhất 1từ (2 byte) cho ngăn xếp. Độ dài một chương trình COMkhông vượt quá 64 KB, nhưng DOS vẫn dành cả bộ nhớ cho trương trình loại này. Nó không để lại một phần nhớ tự do nào (dưới quan điểm của DOS), và chương trình COM không thể gọi một chương trình khác thông qua hàm EXEC. Vấn đề này có thể giải quyết được, nếu chương trình COM thông qua một hàm của DOS giải phóng bộ nhớ mà nó không dùng đến.
Khi điều khiển được truyền cho chương trình COM, các thanh ghi đoạn đều hướng tới đầu của PSP. Đầu của chương trình COM (so với đầu của PSP) luôn được đặt ở địa chỉ 100h. Con trỏ ngăn xếp nhận giá trị FFFEh và nó hướng tới đoạn cuối của đoạn 64KB mà chương trình COM chiếm, ngăn xếp tiến lại gần cuối chương trình cứ 2 byte một, người lập trình cần đảm bảo làm sao cho ngăn xếp không lớn đến mức đụng vào phần cuôí chương trình
Tồn tại nhiều khả năng để kết thúc một chương trình COM và để trả điều khiển về cho DOS hay chương trình gọi.
Nếu chương trình chạy dưới DOS 1.0, nó có thể kết thúc bằng cách gọi hàm 00h của ngắt 21h hoặc gọi ngắt 20h. Một khả năng khác , thoạt đầu có vẻ lạ, là kết thúc chương trình bằng một “Near Return” (lệnh assembler RET). Khi lệnh này được thực hiện, chương trình được tiếp tục từ địa chỉ offset đặt trong 2byte ở đỉnh ngăn xếp. Mà hàm EXEC lại đặt giá trị 0 vào 2byte này trước khi trao điều khiển cho chương trình COM. Như vậy, chương trình được tiếp tục thực hiện tại địa chỉ CS:0000. Vì địa chỉ này chính là đỉnh PSP, nó chứa lời gọi ngắt 20h, nên chương trình sẽ được kết thúc bằng ngắt 20h.
Đối với các thế hệ sau của DOS, hàm 4Ch của ngắt 21h tường dùng để kết thúc chương trình. Nó kết thúc chương trình và gọi một chương trình thông báo, chương trình thông báo này cho kết quả dưới dạng một giá trị số . DOS không đặt ở đây một giá trị cố định nào, nhưng việc truyền giá trị chỉ có ý nghĩa nếu chương trình được goi và chương trình gọi đều gán cho giá trị đó một ý nghĩa như nhau. Thí dụ, một khả năng hay được dùng là thông báo cho chương trình gọi, thông qua giá trị 0, rằng chương trình được gọi kết thúc bình thường, trong khi mọi giá trị khác thông báo sự xuất hiện lỗi trong khi thực hiện chương trình được gọi. Một người lập trình ngôn ngữ bậc cao không cần phải quan tâm đến việc xây dựng một chương trình COM, vì trình biên dịch (compiler) sẽ làm thay mọi công việc cần thiết. Ngược lại, một người lập trình Assembler phải quan tâm đến nhiều vấn đè khi xây dựng một chương trình COM.
Chương trình COM được lưu dưới dạng phản ánh chính xác nội dung bộ nhớ RAM sau khi dã được nạp. DOS không nạp chương trình này vào một địa chỉ xác định trước. Chúng có thể được nạp vào một địa chỉ bất kỳ(là bội nguyên của 16). Do vậy, các chương trình COM không nhất thiết phải chứa địa chỉ đoạn rõ ràng. Nếu địa chỉ offset luôn dựa vào đoạn hiện thời và nó chỉ một địa chỉ bất kỳ trong đoạn đó, thì vấn đề lại không phải như vậy đối với các địa chỉ đoạn, vì các địa chỉ này xác định các đoạn cố định cách nhau 16 byte.
Kích thước một chương trình COM bị hạn chế là 64KB nên người lập trình bị giới hạn chỉ được dùng các lệnh NEAR, các lệnh này chỉ thay đổi địa chỉ offset của con trỏ lệnh. Các lệnh FAR không được phép dùng trong chương trình bởi vì tất cả các lệnh FAR cho phép tiếp tục chương trình ở một chỗ khác của chương trình bằng cách xác định lại không chỉ địa chỉ offset mà cả địa chỉ đoạn của con trỏ lệnh (CS:IP). Do đó các giá trị không đổi có thể được nạp vào một thanh ghi , thí dụ như địa chỉ đoạn của RAM màn hình.Nhưng không thể nạp một địa chỉ đoạn của các lệnh hay dữ liệu của chương trình COM vào một thanh ghi đoạn. Bởi lẽ các địa chỉ này thay đổi mỗi khi chương trình được gọi chạy. Một chương trình COM không được chứa nhiều đoạn và các biến phải nằm trong một đoạn duy nhất-đoạn mã lệnh. Vì chỉ có một đoạn, nên DOS có thể nạp chương trình vào các vị trí khác nhau, tuỳ theo tình trạng của RAM còn tự do. Các trương trình COM không gặp khó khăn gì khi định nghĩa ngăn xếp. Nó được đặt tự động vào cuối đoạn COM 64KB.
Khi gọi một chương trình COM, DOS dành cho chương trình này toàn bộ RAM còn tự do, đa số chương trình sẽ mất đi khỏi bộ nhớ sau khi kết thúc và bộ nhớ mà nó chiếm sẽ được giải phóng. Nhưng nếu một chương trình COM được chuyển thành nội trú, có nghĩa là nó sẽ tồn tại trong bộ nhớ sau khi thực hiện, thì một số vấn đề sẽ xuất hiện, vì dưới quan điểm của DOS, không còn bộ nhớ tự do không thể nạp và thực hiện một chương trình khác.
Vấn đề cũng sẽ xuất hiện, khi chương trình COM trong qua trình thực hiện yêu cầu nạp và thực hiện một chương trình khác thông qua hàm EXEC. Điều này cũng không thực hiện được, bởi vì DOS cho rằng không còn bộ nhớ tự do để nhận chương trình được gọi. Tuy nhiên , hai trường hợp trên có thể được giải quyết bằng cách giải phóng vùng nhớ mà chương trình không dùng đến.
Có hai khả năng để thực hiện điều này: hoặc là chỉ giải phóng phần bộ nhớ nằm ngoài đoạn COM 64 KB, hoặc giải phóng tất cả các phần nhớ mà chương trình không dùng đến, tính cả vùng nhớ không sử dụng nằm trong đoạn COM. Cách thứ hai cho phép giải phóng được nhiều RAM hơn, nhưng ngăn xếp lại nằm ngoài phần chương trình COM (nó ở cuối đoạn 64 KB). Cho nên trong trường hợp này cần thiết phải chuyển ngăn xếp đến cuối trương trình và chỉ giải phóng vùng nhớ nằm sau đuôi ngăn xếp. Để làm điều này, ta phải cho ngăn xếp một kích thước xác định. Đối với đa số các chương trình thì 512 byte là quá đủ.
Trong khi kích thước của chương trình COM không vượt quá 64 KB, thì mọtt chương trình EXE có thể lớn ngang phần RAM tự do mà DOS quản lý. Đói với cr COM, trong đoạn 64 KB phải đặt cả mã lệnh, dữ liệu và ngăn xếp. Kết quả là tất cả các thanh ghi đoạn đều nhận cùng một giá trị khi khởi đầu và trong quá trình thực hiện chương trình, giá trị này chỉ ra địa chỉ bắt đầu của một đoạn 64 KB( chỉ có nội dung của thanh ghi ES là có thể bị thay đổi, vì nó không có ý nghĩa trực tiếp với việc thực hiện chương trình). Đối với các file EXE, sự tổ chức các đoạn không ngặt nghèo như vậy. Mã lệnh, dữ liệu ngăn xếp được đặt trong các đoạn khác nhau, mỗi loại có thể được phân bố trong nhiều đoạn. Vì lẽ đó mà các thanh ghi đoạn có giá trị khác nhau trong quá trình thực hiện chương trình EXE. Các file COM lưu trên dĩa mềm hay đĩa cứng là hình ảnh chính xác của RAM khi thực hiện chương trình, trong khi các file EXE lại được lưu trên đĩa theo một cách được mã hoá.
Chương II
Giới thiệu chương trình
Chương trình được chia làm 2 phần:
Phần Cài dặt (INSTALL):
Phần này thực hiện các chức năng sau:
-Vào tên tệp có dạng .COM cần cài mật khẩu
-Kiểm tra liệu tệp .COM đó trước đã được xác lập mật khẩu hay chưa?
. Nếu tệp .COM đó đã xác lập mật khẩu rồi thì 9 byte cuối của tệp .COM mới (được hình thành bằng nội dung tệp .COM + nội dung đoạn chương trình gộp vào thêm sau) sẽ chứa chữ "PROTECTED". Không tiến hành cài đặt và kết thúc phần chương trình cài đặt.
. Nếu tệp .COM chưa được xác lập mật khẩu thì 9 byte cuối của tệp .COM đó không chữ Protected. Sẽ tiến hành nhập mật khẩu( 2lần : lần đầu nhập mật khẩu vào, kiểm tra (verify) liệu nhớ đúng mật khẩu hay chưa bằng cách nhập mật khẩu lần nữa và kiểm tra mật khẩu giữa 2 lần nhập?). Đọc 3 byte đầu của tệp .COM và cất nội dung 3byte đó vào một biến nhớ (để sau này có thể phục hồi được). Tính độ dài của các byte tệp .COM cũ và cất bước nhảy đó vào biến 3 byte có tên JMPCODE: byte 1 là 0e9h - mã của lệnh JMP và 2 byte sau là bước nhảy). Sau đó tiến hành ghi thêm đoạn chương trình cần gộp vào tệp .COM.
Lưu đồ thuật toán Xác lập mật khẩu cho File .com
Bắt đầu
Vào tệp dạng .COM
SAI
KT tệp đó có tồn tại không
đúng
KT .COMđó dã xl mk chưa
Thoát
Xl MK cho tệp .COM
sai
Xác lập lại mật khẩu
sai
KT 2 lần vào MK có giống nhau hay ko?
đúng
Cất 3 byte đầu của tệp .COM vào biến nhớ
Xác lập bước nhảy
Ghi đoan chương trình can gộp vào tệp .COM
Phần chương trình sẽ gộp vào tệp .COM sau khi đã cài mật khẩu (đoạn từ START CODE đến END CODE).
Phần này sẽ được chạy khi tiến hành chạy tệp >COM đã được xác lập mật khẩu. Khi một tệp .COM đã được xác lập mật khẩu thì 3 byte đầu của tệp .COM đó chứa chứa lệnh nhảy đến phần chương trình gộp thêm vào và phần chương trình gộp thêm vào sẽ tiến hành các chức năng sau:
- Yêu cầu nhập mật khẩu.
- Kiểm tra mật khẩu vừa nhập có đúng với mật khẩu đã xác lập hay chưa?
. Nếu không đúng thì không cho chương trình chạy và thoát.
Lưu đồ thuật toán FIle.com đã được xác lập mật khẩu
. Còn nếu đúng mật khẩu thì hồi phục lại phần mã ở 3 byte đầu của tệp .COM (trước khi cài đặt mật khẩu), đưa phần địa chỉ OFFSET về 100h và tiếp tục chạy phần chương trình .COM
Start
Nhập mật khẩu
Đúng
Kiểm tra mật khẩu
Khôi phục lại chương trình
Sai
Chạy chương trình *.COM
End
Toàn bộ chương trình sẽ có dạng sau:
; Tạo Macro cho hiện ra màn hình một xâu ký tự
HienString macro xau
mov dx, offset xau
mov ah,9 ;Nap so ham vao AH
int 21h
endm ;Kết thúc macro
CODE segment
assume CS:CODE, DS:CODE, ES:CODE, SS:CODE
ORG 100h
BEGIN:
jmp INSTALL
;Bắt đầu đoạn chưong trình và phần dữ liệu sẽ gộp (append) vào tệp .COM cần xác lập mật khẩu
START_CODE:
call NEXT
NEXT:
pop SI
jmp CHECK
; Bắt đầu vùng dữ liệu cần được gộp vào tệp .COM
;SI+4
MESS db 0ah,0dh,'PASSWORD : $'
;SI+18
FIRSTTHREE db 3 dup(?)
;SI+21
KEYWORDLEN dw ?
;SI+23
KEYWORD db 30 dup(?)
;SI+53
CHFLAG db 1
;SI+54
KEYWORDERR db 10,13,10,13,10,13,'Access is denied !!! $'
;Ket thucs vùng du lieu se gop vao tep .COM
CHECK:
mov DX,SI ; hien xau ky tu MESS
mov AH,9
add DX,4
int 21h
mov BX,SI
add BX,21 ; BX tro den KEYWORDLEN
mov CX,WORD PTR[BX] ; CX chua do dai cua KEYWORD (mat ;khau)
inc BX
inc BX ;BX tro den vung nho KEYWORD
mov DI,SI
add DI,53 ; DI tro den bien CHFLAG
STAR_CHECK:
mov AH,8 ; Nhap cac ky tu mat khau(khong hien)
int 21h
cmp AL,0dh
jz END_CHECK ;Neu la ENTER ket thuc nhap mat khau
jcxz WRONG
cmp AL,BYTE PTR[BX] ;SS voi cac ky tu mat khau da xac lap
jnz WRONG ; Neu sai thi nhay
mov DL,'*' ; Hien dau'*' ra man hinh
mov AH,2
int 21h
inc BX ; Tro den byte tiep theo cua KEYWORD
dec CX ; Giam so luong byte cua bien KEYWORD
jmp STAR_CHECK
WRONG:
mov BYTE PTR[DI],0
mov DL,'*'
mov AH,2
int 21h
jmp STAR_CHECK
END_CHECK:
cmp BYTE PTR[DI],1 ; Hoi co CHFLAG(1=dung;0=sai mat khau)
jnz INCORPASS
cmp CX,0
ja INCORPASS
;Tra 3 byte cu dau cua tep.COM (khi chua gop) cat o bien FIRSTTHREE
;vao o ca o nho co dia chi OFFSET la 100h,101h va 102h
add SI,18
mov DI,100h
mov CX,3
cld ; Huong chuyen theo chieu tang cua dia chi
rep MOVSB
;Quay ve dau chuong trinh cu
mov AX,100h
push AX
ret
;Phan thong bao khi vao sai mat khau. Hien xau 'Acces is denied !!!'
INCORPASS:
mov DX,DI
inc DX
mov AH,9
int 21h
mov AH,4ch
int 21h
psign db 'PROTECTED'
END_CODE:
;Ket thuc doan ma chuong trinh gop vao tep .COM
INSTALL:
call CLRSCR
jmp EXEC
Buff db 50
db ?
db 50 dup(?)
FILENAMELEN db ?
FILENAME db 50 dup(?)
KEYWORD2 db 30 dup(?)
FILEHAND dw ?
FILELEN dw ?
JMPCODE db 0e9h,?,?
FSIGN db 9 dup(?)
MESS0 db 10,13,'Xac lap mat khau cho tep dang .COM$'
MESSN db 10,13,'Chương trình viết bởi Nguyễn Quốc Việt$'
MESS1 db 10,13,'Nhap ten FILE.COM: $'
MESS2 db 10,13,'Nhap mat khau:$'
MESS3 db 10,13,'Nhap lai:$'
MESS4 db 10,13,'DA NHAN ! $'
ERR1 db 10,13,'Khong the mo tep !$'
ERR2 db 10,13,'Khong the doc tep !$'
ERR3 db 10,13,'Khong the ghi tep !$'
ERR4 db 10,13,'Tep da duoc xac lap mat khau roi !$'
ERR5 db 10,13,'mat khau khong hop le !$'
EXEC :
HienString MESS0
HienString MESSN
HienString MESS1
;Vao ten tep .COM can xac lap mat khau
lea BX,FILENAME ; BX tro den dia chi dau chua ten tep
call GET_FILE_NAME ; Goi chuong trinh con vao tep
;Mo tep .COM de doc /ghi
mov AL,2 ;Mode doc/ghi
mov DX,OFFSET FILENAME
mov AH,3dh ;chuc nang mo tep
int 21h
jnc NEXT1
HienString ERR1 ;Thong bao khong mo duoc tep
jmp FINISH
NEXT1:
mov FILEHAND,AX ;Cat the tep(filehandle)vao bien FILEHAND
;Xac lap kich thuoc cua tep bang cach di chyen den cuoi tep
mov AL,2
xor CX,CX
xor DX,DX
mov BX,FILEHAND
mov AH,42h ;Chucnang dich chuyen con tro tep
int 21h
mov FILELEN,AX
;Tro den 9 byte cuoi cua tep( Cac bute nhan dang lieu tep .COM da duoc xac ;lap mat khau hay chua? Neu da duoc xac lap thi 9 byte nay chua 9 ky tu ;"PROTECTED"
mov AL,0
xor CX,CX
mov DX,FILELEN
sub DX,9
mov BX,FILEHAND
mov AH,42h
int 21h
;Doc 9 byte cuoi tep va de vao bien nho FSIGN
lea DX,FSIGN
mov CX,9
mov BX,FILEHAND
mov AH,3fh
int 21h
jnc NEXT2
HienString ERR2
jmp CLOSE
;SO sanh voi noi dung cua bien PSIGN de kiem tr lieu tep .COM
;do da duoc xac lap mat khau hay chua?
NEXT2:
mov SI,OFFSET PSIGN ;Tro den byte dau cua PSIGN
mov DI,OFFSET FSIGN ;Tro den byte dau cua FSIGN
mov CX,9 ; So luong byte can so sanh la 9
cld ;So sanh tung byte theo chieu tang dia chi
repz cmpsb ;Lap viec so sanh voi dieu kien dung la: noi dung ;ZF=1 va noi dung CX=0
cmp CX,0
jnz NEXT3
HienString ERR4
jmp CLOSE
;Nhap mat khau neu tep .COM truoc do chua duoc xac lap mat khau
NEXT3:
HienString MESS2
mov DI,OFFSET KEYWORD
cld
xor CX,CX ;CX=0
START_REPEAT1:
mov AH,8
int 21h
cmp AL,0dh
jz END_REPEAT1
cmp CX,30
jae END_REPEAT1
stosb
inc CX
mov DL,'*'
mov AH,2
int 21h
jmp START_REPEAT1
END_REPEAT1:
mov KEYWORDLEN,CX ; KEYWORDLEN=so luong byte mat khau
;Nhap lai mat khau (lan thu 2)
HienString MESS3
mov DI,OFFSET KEYWORD2
cld
xor CX,CX
START_REPEAT2:
mov AH,8
int 21h
cmp AL,0dh
jz END_REPEAT2
cmp CX,30
jae END_REPEAT2
stosb
inc CX ;Tang so dem so luong ky tu mat khau
mov DL,'*' ; Hien dau '*' ra man hinh
mov AH,2
int 21h
jmp START_REPEAT2
END_REPEAT2:
;So sanh giua hai lan nhap mat khau( so sanh theo tung byte)
cmp CX,KEYWORDLEN ; So sanh do dai mat khau giua hai lan nhap
jnz PASSNMERR ; Neu khac nhau thi nhay
mov SI,OFFSET KEYWORD ; SI tro den xau ky tu vao lan 1
mov DI,OFFSET KEYWORD2 ; DI tro den xau ky tu vao lan 2
cld ; DF= 0 -So sanh theo chieu tang dia chi
repz cmpsb ; Vong lap so sanh mat khau 2 lan vao
jcxz NEXT4
PASSNMERR:
HienString ERR5 ; Hien thong bao mat khau khong hop le
jmp NEXT3
NEXT4:
; Dich ve dau tep .COM
mov AL,0
mov BX,FILEHAND
xor CX,CX
xor DX,DX
mov AH,42h
int 21h
; Doc 3 byte dau cua tep.COM va cat vao bien FIRSTTHREE
mov AH,3fh
mov DX,FILEHAND
mov DX,OFFSET FIRSTTHREE
mov CX,3
int 21h
jnc NEXT5 ; Doc tot thi nhay
jmp READERR
NEXT5:
;Tinh dia chi (phan OFFSET)cho lenh CALL de nhay ve dia chi chua lenh ;dau tien cua phan chuong trinh cua chung ta duoc gop them vao tep.COM khi ;tep nay duoc xac lap mat khau
mov BX,OFFSET JMPCODE ;Tro den bien JMPCODE
mov AX,FILELEN
sub AX,3
mov WORD PTR[BX+1],AX ; Cat do dai vao bytethu 2 va 3
; Chuyen ve dau tep
mov AL,0
mov BX,FILEHAND
xor CX,CX
xor DX,DX
mov AH,42h
int 21h
; Thay noi dung 3 byte dau cua tep.COM bang ma lenh CALL va 2 byte
;chua buoc nhay(bo qua phan ma chuong trnh.COM cu)
mov BX,FILEHAND
mov DX,OFFSET JMPCODE
mov CX,3
mov AH,40h
int 21h
jnc NEXT6
jmp WRITERR
NEXT6:
; Chuyen con tro ve cuoi tep
mov AL,2 ; Mode buoc dich chuyen so voi cuoi tep
mov BX,FILEHAND ; BX chua the tep
xor CX,CX ; Buoc dich CX:DX=0 so voi cuoi tep
xor DX,DX
mov AH,42h ; chuc nang chuyen con tro tep
int 21h
; Ghi them vao cuoi tep.COM phan chuong trinh cua chung ta doan tu
;START_CODE den END_CODE
mov BX,FILEHAND
mov DX,OFFSET START_CODE
mov CX,OFFSET END_CODE
sub CX,DX
mov AH,40h
int 21h
; Dong tep
mov BX,FILEHAND
mov AH,3eh
int 21h
; Hien thong bao sai
HienString MESS4
jmp FINISH
; Phan cac thong bao sai
OPENERR:
HienString ERR1
jmp FINISH
READERR:
HienString ERR2
jmp CLOSE
WRITERR:
HienString ERR3
jmp CLOSE
PROTECTERR:
HienString ERR4
;Dong tep
CLOSE:
mov BX,FILEHAND
mov AH,3eh
int 21h
FINISH:
mov AH,8 ; cho 1 ky tu tu ban phim( khong hien ra)
int 21h
mov AH,4ch ; Ve DOS
int 21h
;-------------------------------------------------------
; chuong trinh con vao ten tep can doc
;Vao: DX:BX tro den dia chi dau bien xau chua ten tep
;Ra: Ten tep nam o bien xau ten_tep
;----------------------------------------------------------
CLRSCR PROC
push AX
mov AH,0fh
int 10h
mov AH,0
int 10h
pop AX
ret
CLRSCR ENDP
GET_FILE_NAME PROC
push AX BX DX DI ; Bao ve noi dung cac thanh ghi
lea DX,Buff ; DX tro den vung dem Buff de chua cac ky tu
mov AH,0ah ; doc duoc bang chuc nang 0ah cua int 21h.
int 21h
lea DI,Buff
inc DI
GF1:
inc DI
mov AL,[DI]
cmp AL,0dh
je GF2
mov [BX],AL
inc BX
jmp GF1
GF2:
xor AL,AL
mov [BX],AL
pop DI DX BX AX
ret
GET_FILE_NAME ENDP
CODE ENDS
END BEGIN
Phụ lục
Một số lệnh assembler dùng
trong chương trình
Lệnh MOV
Chức năng : Chuyển dữ liệu từ toán hạng nguồn sang toán hạng đich
Cú pháp : mov DST,SRC
reg reg mem data
reg data segreg reg16
reg mem segreg mem16
mem reg reg16 segreg
mem16 segreg
Lệnh PUSH
Chức năng : Chuyển dữ liệu toán hạng nguồn vào đỉnh ngăn xếp
Cú pháp : PUSH SRC
3. Lệnh POP
Chức năng : Chuyển dữ liệu toán hạng nguồn vào đỉnh ngăn xếp
Cú pháp : POP DST
Lệnh IN
Chức năng : Đọc dữ liệu từ một cổng 8/16 bit và đưa vào AL/AX
Cú pháp : IN AL/AX, địa chỉ cổng
Chú ý : Nếu địa chỉ cổng < 256 thì địa chỉ được trực tiếp đứng trong lệnh IN
còn nếu địa chỉ cổng >255 thì DX sẽ thay địa chỉ đứng trong lệnh IN
Lệnh OUT
Chức năng : Chuyển giá trị 1 byte hoặc 1 từ từ thanh ghi AL hoặc AX ra cổng (PORT)
Cú pháp : OUT