Monday, April 11, 2016

giáo trình hợp ngữ nâng cao

ASCII code (Hex) 7 8 9 A D SYMBOL BEL BS HT LF CR FUNCTION beep backspace tab line feed carriage return 1.9 Chương trình đầu tiên Chúng ta sẽ viết một chương trình hợp ngữ nhằm đọc một ký tự từ bàn phím và in nó trên đầu dòng mới . TITLE PGM1: ECHO PROGRAM Đề cương bài giảng HP NGỮ .MODEL SMALL .STACK 100H .CODE MAIN PROC ; display dấu nhắc MOV AH,2 MOV DL,’?’ INT 21H ; nhập 1 ký tự MOV AH,1 ; hàm đọc ký tự INT 21H ; ký tự được đưa vào AL MOV BL,AL ; cất ký tự trong BL ; nhảy đến dòng mới MOV AH,2 ; hàm xuất 1 ký tự MOV DL,0DH ; ký tự carriage return INT 21H , thực hiện carriage return MOV DL,0AH ; ký tự line feed INT 21H ; thực hiện line feed ; xuất ký tự MOV DL,BL ; đưa ký tự vào DL INT 21H ; xuất ký tự ; trở về DOS MOV AH,4CH ; hàm thoát về DOS INT 21H ; exit to DOS MAIN ENDP END MAIN 1.10 Tạo ra và chạy một chương trình hợp ngữ 12 Có 4 bước để tạo ra và chạy một chương trình hợp ngữ là : • Dùng một trình soạn thảo văn bản để tạo ra tập tin chương trình nguồn ( source program file ) . • Dùng một trình biên dòch (Assembler ) để tạo ra tập tin đối tượng (object file) ngôn ngữ máy • Dùng trình LINK để liên kết một hoặc nhiều tập tin đối tượng rồi tạo ra file thực thi được . • Cho thực hiện tập tin EXE hoặc COM . Bước 1 : Tạo ra chương trình nguồn Đề cương bài giảng HP NGỮ 13 Dùng một trình soạn thảo văn bản (NC chẳng hạn) để tạo ra chương trình nguồn .Ví dụ lất tên là PGM1.ASM. Phần mở rộng ASM là phần mở rộng quy ước để Assembler nhận ra chương trình nguồn . Bước 2 :Biên dòch chương trình Chúng ta sẽ dùng MASM ( Microsoft Macro Assembler ) để chuyển tập tin nguồn PGM1.ASM thành tập tin đối tượng ngôn ngữ máy g là PGM1.OBJ bằng lệnh sau : MASM PGM1; Sau khi in thông tin về bản quyền MASM sẽ kiểm tra file nguồn để tìm lỗi cú pháp . Nếu có lỗi thì MASM sẽ inra số dòng bò lỗi và một mộ tả ngắn về lỗi đó . Nếu không có lỗi thì MASM sẽ chuyển PGM1.ASM thành tậo tin đối tượng ngôn ngữ máy gọi là PGM1.OBJ . Dấu chấm phẩy sau lệnh MASM PGM1 có nghóa là chúng ta không muốn tạo ra một tập tin đối tượng có tên khác với PGM1 . Nếu không có dấu chấm phẩy sau lệnh thì MASM sẽ yêu cầu chúng ta gõ vào tên của một số tập tin mà nó có thể tạo ra như hình dưới đây : Object file name [ PGM1.OBJ]: Source listing [NUL.LIST] : PGM1 Cross-reference [NUL.CRF] : PGM1 Tên mặc nhiên là NUL có nghóa là không tạo ra file tương ứng trừ khi lập trình viên gõ vào tên tập tin . Tập tin danh sách nguồn ( source listing file) : là một tập tin Text có đánh số dòng , trong đó mã hợp ngữ và mã nguồn nằm cạnh nhau . Tập tin này thường dùng để gỡ rối chương trình nguồn vì MASM thông báo lỗi theo số dòng . Tập tin tham chiếu chéo ( Cross -Reference File ) : là 1 tập tin chứa danh sách các tên mà chúng xuất hiện trong chương trình kèm theo số dòng mà tên ấy xuất hiện . Tập tin này đưọc dùng để tìm các biến và nhãn trong một chương trình lớn . Bước 3 : Liên kết chương trình Tập tin đối tượng tạo ra ở bước 2 là một tập tin ngôn ngữ máy nhưng nó không chạy được vì chưa có dạng thích hợp của 1 file chạy . Hơn nữa nó chưa biết chương trình được nạp vào vò trí nào trên bộ nhớ để chạy . Một số đòa chỉ dưới dạng mã máy có thể bò thiếu . Trình LINK sẽ liên kết một hoặc nhiều file đói tượng thành một file chạy duy nhất ( *.EXE ) .Tập tin này có thể được nạp vào bộ nhớ và thi hành . Đề cương bài giảng HP NGỮ 14 Để liên kết chương trình ta gõ : LINK PGM1; Nếu không có dấu chấm phẩy ASM sẽ yêu câù chúng ta gõ vào tên tập tin thực thi . Bước 4 : Chạy chương trình Từ dấu nhắc lệnh có thể chạy chương trình bằng cách gõ tên nó rồi nhấn ENTER . 1.11 Xuất một chuỗi ký tự Trong chương trình PGM1 trên đây chúng ta đã dùng INT 21H hàm 2 và 4 để đọc và xuất một ký tự . Hàm 9 ngắt 21H có thể dùng để xuất một chuỗi ký tự . INT 21H , Function 9 : Display a string Input : DX=offset address of string The string must end with a ‘$’ character Ký tự $ ở cuối chuỗi sẽ không được in lên màn hình . Nếu chuỗi có chứa ký tự điều khiển thì chức năng điều khiển tương ứng sẽ được thực hiện . Chúng ta sẽ viết 1 chương trình in lên màn hình chuỗi “HELLO!” . Thông điệp HELLO được đònh nghóa như sau trong đoạn số liệu : MSG DB ‘HELLO!$’ Lệnh LEA ( Load Effective Address ) LEA destnation , source Ngắt 21h , hàm số 9 sẽ xuất một chuỗi ký tự ra màn hình với điều kiện đòa chỉ hiệu dụng của biến chuỗi phải ở trên DX . Có thể thực hiện điều này bởi lệnh : LEA DX,MSG ; đưa đòa chỉ offset của biến MSG vào DX Program Segment Prefix ( PSP ) : Phần đầu của đoạn chương trình Khi một chương trình được nạp vào bộ nhớ máy tính , DOS dành ra 256 byte cho cái gọi là PSP . PSP chưá một số thông tin về chương trình đang được nạp trong bộ nhớ . Để cho các chương trình có thể truy xuất tới PSP , DOS đặt số phân đoạn của nó (PSP) trong cả DS và ES trước khi thực thi chương trình . Kết qủa là thanh ghi DS không chứa số đoạn của đoạn số liệu của chương trình . Để khắc phục điều này , một chương trình có chứa đoạn số liệu phải được bắt đầu bởi 2 lệnh sau đây : MOV AX,@DATA Đề cương bài giảng HP NGỮ 15 MOV DS,AX Ở đây @DATA là tên của đoạn số liệu được đònh nghóa bởi DATA . Assembler sẽ chuyển @DATA thành số đoạn . Sau đây là chương trình hoàn chỉnh để xuất chuỗi ký tự HELLO! TITLE PGM2: PRINT STRING PROGRAM .MODEL SMALL .STACK 100H .DATA MSG DB ‘HELLO!$’ .CODE MAIN PROC ; initialize DS MOV AX,@DATA MOV DS,AX ; display message LEA DX,MSG MOV AH,9 INT 21H ; return to DOS MOV AH,4CH INT 21H MAIN ENDP END MAIN 1.12 Chương trình đổi chữ thường sang chữ hoa Chúng ta sẽ viết 1 chương trình yêu cầu người dùng gõ vào một ký tự bằng chữ thường . Chương trình sẽ đổi nó sang dạng chữ hoa rồi in ra ở dòng tiếp theo . TITLE .MODEL .STACK .DATA CR LF MSG1 MSG2 PGM3: CASE COVERT PROGRAM SMALL 100H EQU EQU DB DB 0DH 0AH ‘ENTER A LOWER CASE LETTER:$’ 0DH,0AH,’IN UPPER CASE IT IS :’ Đề cương bài giảng HP NGỮ CHAR DB ?,’$’ 16 ; đònh nghóa biến CHAR có giá trò ban đầu chưa ;xác đònh .CODE MAIN PROC ; INITIALIZE DS MOV AX,@DATA MOV DS,AX ;PRINT PROMPT USER LEA DX,MSG1 ; lấy thông điệp số 1 MOV AH,9 INT 21H ; xuất nó ra màn hình ;nhập vào một ký tự thường và đổi nó thành ký tự hoa MOV AH,1 ; nhập vào 1 ký tự INT 21H ; cất nó trong AL SUB AL,20H ; đổi thành chữ hoa và cất nó trong AL MOV CHAR, AL ; cất ký tự trong biến CHAR ; xuất ký tự trên d ò theo 11 10 9 8 7 6 5 4 3 2 1 0 ng tiếpDX, MSG2 LEA ; lấy thông điệ O D IF T S Z A P C p thứ 2 F F F F F F F F MOV AH,9 INT 21H ; xuất chuỗi ký tự thứ hai , vì MSG2 không kết ;thúc bởi ký tự $ nên nó tiếp tục xuất ký tự có trong biến CHAR ;dos exit MOV AH,4CH INT 21H ; dos exit MAIN ENDP END MAIN Đề cương bà i giả n g Hợ p ngữ 17 Chương 2 : Trạng thái của vi xử lý và các thanh ghi cờ Trong chương này chúng ta sẽ xem xét các thanh ghi cờ của vi xử lý và ảnh hưởng của các lệnh máy đến các thanh ghi cờ như thế nào . Trạng thái của các thanh ghi là căn cứ để chương trình có thể thực hiện lệnh nhảy , rẻ nhánh và lặp . Một phần của chương này sẽ giới thiệu chương trình DEBUG của DOS . 2.1 Các thanh ghi cờ ( Flags register) Bit Name Symbol Điểm khác biệt qu an trọ 0 ng của máy tính so Carry flag CF với c ác 2 Parity flag PF thiết bò điện tử kh 4 Auxiliary AF ác là khả năng cho các q carry flag uyết đònh 6 Zero flag ZF . Một mạch đặc biệt 7 Sign flag SF trong 11 Overflow flag CPU có thể làm cá OF c quy 8 ết Trap flag TF đònh này bằng các 9 Interrrupt flag IF h că 10 Direction flag n cứ vào trạng thá DF i hiệ n hành của CPU . Có một thanh ghi đặc biệt cho biết trạng thái của CPU đó là thanh ghi cờ . Bảng 2.1 cho thấy thanh ghi cờ 16 bit của 8086 Bảng 2.1 :Thanh ghi cờ của 8086 Đề cương bà i giả n g Hợ p ngữ 18 Mục đích của các thanh ghi cờ là chỉ ra trạng thái của CPU .Có hai loại cờ là cờ trạng thái ( status flags) và cờ

No comments:

Post a Comment