Đề tài Xác lập mật khẩu cho chương trình dạng tệp có đuôi .COM

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.

doc27 trang | Chia sẻ: vietpd | Lượt xem: 1369 | Lượt tải: 0download
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
Tài liệu liên quan