1. Trang chủ
  2. » Công Nghệ Thông Tin

Assembler 86

8 246 1
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Nội dung

11 CHƯƠNG 4 : ASSEMBLER 86 Ngữ pháp của các trình hợp dòch thông dụng hiện nay như MASM,TASM . khá phức tạp, do đó tài liệu này sẽ chỉ trình bày các phần căn bản mà hầu hết trình hợp dòch thông dụng đều chấp nhận. Những phần căn bản nhất của ngữ pháp của assembler cho bộ xử lý 8088/86 sẽ được trình bày trong chương này. Các phần khác sẽ được đề cập đến trong các chương sau. 4.1NGỮ PHÁP CỦA ASSEMBLER 86 4.1.1Khai báo segment Chương trình của chúng ta có thể sử dụng đến nhiều segment khi được thực hiện : Để truy nhập đến mỗi segment, ta phải gán đòa chỉ của segment tương ứng cho các thanh ghi segment . Sau đó, các phần tử thuộc về segment sẽ được truy nhập thông qua offset của nó trong segment ấy. Lưu ý là việc gán giá trò cho các thanh ghi segment chỉ được thực hiện trong lúc chương trình đang thực hiện . Trong quá trình hợp dòch, trình hợp dòch không thể kiểm soát được giá trò thực của thanh ghi segment . Do đó sự phân chia chương trình thành các segment hoàn toàn là các ý niệm của người lập trình . Một trong các nhiệm vụ quan trọng của trình hợp dòch là xác đònh chính xác các offset theo các segment của chương trình chúng ta . Nếu không có một sự lưu ý nào về segment sẽ được sử dụng, trình hợp dòch sẽ cho rằng toàn bộ chương trình ở trong cùng một segment . Khi ấy các phần tử thuộc chương trình đều được trình hợp dòch xác đònh đòa chỉ tương đối (offset) theo điểm đầu của chương trình . Thí dụ : một vò trí thuộc SEGMENT-B sẽ được tính offset theo cự ly từ đầu SEGMENT-A cho đến vò trí của nó trong toàn bộ đoạn mã chương trình được tạo ra .Khai báo về Segment sẽ lưu ý trình biên dòch về phạm vi của các segment cùng các phần tử thuộc về chúng.Theo đó trình biên dòch sẽ xác đònh đúng các offset tương ứng theo nguyên tắc : phần tử được xét thuộc segment nào sẽ được xác đònh cự ly theo điểm khởi đầu của segment ấy . SEGMENT-A SEGMENT-B SEGMENT-C Var_X Offset Var_X nếu có khai báo Segment Offset Var_X nếu không khai báo Segment 12 Một Segment được khai báo với trình hợp dòch theo dạng thức sau : Tên-segment Segment [word/byte] [Public] . . ( Phạm vi của segment ) . . Tên-segment ends Các phần tử thuộc về segment nào phải được mô tả bên trong cấu trúc segment đó. Để xác đònh thanh ghi segment sẽ dùng cho segment được mô tả ta dùng khai báo sau : Assume Thanh-ghi:Tên-segment[,Thanh-ghi:Tên-segment [ .] ] TD : Assume CS:Code,DS:Code ;xác đònh với trình hợp dòch CS và DS sẽ cùng mang giá trò của Code segment . Lưu ý : Chỉ thò Assume chỉ là sự khai báo cho trình hợp dòch biết các thanh ghi segment sẽ được sử dụng như thế nào chứ không tạo ra phép gán giá trò cho các thanh ghi ấy ! 4.1.2Khai báo thủ tục Chương trình của chúng ta được viết thành các thủ tục (procedure) . Một procedure có cấu trúc như sau : Tên-procedure proc [near/far] . . Tên-procedure endp Bên trong thủ tục là các lệnh, các khai báo về dữ liệu . Mỗi một lệnh, mỗi một khai báo đều được viết dưới dạng một dòng lệnh . Khai báo thủ tục trong hợp ngữ chỉ là hình thức . Chúng ta có thể bỏ qua các khai báo ấy mà vẫn tạo lập được một số chương trình đơn giản . Tuy vậy viết chương trình dưới dạng các thủ tục sẽ làm chương trình của chúng ta trở nên rõ ràng và dễ quản lý hơn . Khi chương trình được viết dưới dạng các thủ tục, việc khai báo thủ tục rất quan trọng. Trình hợp dòch sẽ căn cứ trên các khai báo ấy mà xác đònh chính xác các mã lệnh tương ứng với các chỉ thò JMP, CALL và RET . 4.1.3Cấu trúc một dòng lệnh A. Dòng lệnh mô tả : Mô tả hằng ( không tạo ra mã lệnh ) Tên EQU Giá trò Mô tả hằng dùng để đònh nghóa một số giá trò sẽ được dùng đến trong chương trình . Sau khi được mô tả, mỗi khi sử dụng đến giá trò nào chúng ta chỉ cần dùng tên tương ứng . Trình hợp dòch sẽ tự động thay thế giá trò thực của hằng vào đoạn mã tương ứng . Mô tả biến Tên Loại Danh sách giá trò ( Trong đó Loại có thể là [Byte/Word/Dword] ) Mô tả biến dùng để xác đònh một đòa chỉ,từ đó bắt đầu lưu chứa các thông tin với tính chất nêu trong “Loại” và chi tiết được liệt kê trong “Danh sách giá trò”. Khi cần truy nhập đến các thông tin này chúng ta dùng tên biến như một mốc đòa chỉ. 13 Thí dụ : Biến-A đòa chỉ tại nơi khai báo Biến-A Biến-A[1] đòa chỉ Biến-A + 1 Biến-A[2] đòa chỉ Biến-A + 2 Biến-A[-1] đòa chỉ Biến-A - 1 Trình hợp dòch sẽ tự động đổi ra đòa chỉ thực của biến trong các chỉ thò có dùng đến biến. Mô tả nhãn Tên LABEL Loại ( Trong đó Loại có thể là [Byte/Word/Dword/Near/Far] ) Mô tả nhãn dùng để xác đònh một vò trí trong chương trình,tính chất của đòa chỉ ấy tùy thuộc vào “Loại” được khai báo . Trình hợp dòch sẽ tạo ra các đòa chỉ,các cự ly thực trong các chỉ thò có liên hệ đến tên nhãn. Mô tả biến và nhãn cho phép chúng ta chỉ đònh các vò trí trong chương trình theo vò trí logic của chúng chứ không theo đòa chỉ thực của chúng . Khi hợp dòch, trình hợp dòch sẽ tính các cự ly thực sự và thay thế chúng vào các mã lệnh tương ứng . Để lấy đòa chỉ một phần tử dùng cấu trúc : Offset Tên-phần-tử Thí dụ : Mov dx,offset Biến-A Các quy đònh chung : Tên : là một chuỗi tạo bởi các ký tự, các ký số và - (dấu gạch dưới). Tên không được bắt đầu bằng ký số. Trình hợp dòch quy đònh sau dấu chấm phẩy (;) là các lời chú thích. Ta có thể đặt bất cứ ghi chú gì ở đấy . Mỗi giá trò trong mô tả hằng hoặc biến có thể là : - Một hằng số, một tên hằng đã khai báo - Một biểu thức gồm các hằng số,tên hằng tạo thành từ các phép toán: - Số học : + - * / - Logic : NOT AND OR XOR - và dấu () Thí dụ : GT-A equ 020h ; Có giá trò là 00100000b GT-B equ 040h ; Có giá trò là 01000000b Biến-A db NOT 010h ; Có giá trò là 11101111b Biến-B db GT-A OR GT-B ; Có giá trò là 01100000b B. Dòng lệnh thực hiện [Nhãn:] Lệnh Đối tượng Tên : là một chuỗi tạo bởi các ký tự, các ký số và - (dấu gạch dưới). Tên không được bắt đầu bằng ký số. Sau dấu chấm phẩy (;) là các lời chú thích . Ta có thể đặt bất cứ ghi chú gì ở đấy . 4.1.4Các loại (kiểu) cơ bản Loại : Loại byte : khai báo bằng từ khóa DB. Mỗi phần tử trong danh sách giá trò chiếm 1 byte 14 Thí dụ: a/ Số-học-viên DB 0,0,0 ;khai báo Số-học-viên là một giá trò kiểu byte, chiếm tất cả 3 byte, giá trò ban đầu của cả 3 byte này là 0 b/ File-name DB ‘Thidu1.asm’,0 ;khai báo File-name là một giá trò kiểu byte, chiếm tất cả 11 byte, giá trò ban đầu của các byte này lần lượt là mã của từng ký tự trong dấu nháy và cuối cùng là 0 c/ Buffer DB 20 dup (0) ;khai báo Buffer là một giá trò kiểu byte, chiếm tất cả 20 byte, các byte mang giá trò được mô tả trong cặp dấu ngoặc đơn ( 0 ). Chú ý : - Chỉ có kiểu byte mới chấp nhận chuỗi ký tự - Để biểu diễn một byte,ta có thể ghi giá trò của byte đó dưới dạng số thập phân, số thập lục, số nhò phân hoặc là một ký tự (có mã tương ứng) đặt giữa hai dấu nháy đơn . TD : 65, 041h, ‘A’ là các cách biểu diễn khác nhau của cùng một giá trò . - Các vùng nhớ lưu chứa giá trò được khai báo được gọi là các biến của chương trình - Kiểu được khai báo chỉ dùng làm giá trò ngầm đònh để xác đònh loại dữ liệu được thao tác trong các lệnh . Ta hoàn toàn có thể chỉ đònh kiểu bất kỳ cho một biến trong các lệnh một cách tường minh. Loại word : khai báo bằng từ khóa DW Mỗi phần tử trong danh sách giá trò chiếm 2 byte (1 word) Loại double word : khai báo bằng từ khóa DD Mỗi phần tử trong danh sách giá trò chiếm 4 byte (2 word) Chú ý : Dữ liệu lưu chứa trong RAM có một số điểm khác với cách biểu diễn thông thường của chúng ta : những số biểu diễn bằng nhiều byte như loại word, double word được ghi nhớ trong RAM theo quy tắc byte thấp đứng trước, byte cao đứng sau. Thí dụ : giá trò hai byte 01234h được ghi nhớ tại đòa chỉ 0462:0180 như sau : 0462:0180 034h 0462:0181 012h Chú ý : Khi nói một giá trò được ghi nhớ tại một đòa chỉ nào đó ta phải hiểu là “được ghi nhớ bắt đầu từ đòa chỉ đã chỉ ra” ! 4.1.5Phân loại chương trình Đối với hệ điều hành DOS, chương trình của chúng ta được chia thành hai loại chính : - Loại COM : chỉ sử dụng 1 segment, có kích thước tối đa gần 64 KB khi được thực thi, các thanh ghi segment đều được gán giá trò của segment hiện lưu chứa chương trình . Do đó trong một file COM, nếu không có nhu cầu truy nhập đến các vùng nhớ ngoài segment của chương trình, không cần phải chú ý đến việc xác đònh giá trò các thanh ghi segment. Giá trò của IP khi chương trình được thực thi luôn luôn bằng 0100h . - Loại EXE : sử dụng nhiều segment, không hạn chế về kích thước khi được thực thi, các thanh ghi segment cần được gán giá trò của segment có liên quan . Giá trò của IP khi chương trình được thực thi tùy thuộc từng chương trình cụ thể . Trong tài liệu này, các chương trình thí dụ đều được viết dưới dạng COM . 4.2CÁC LỆNH CĂN BẢN 4.2.1Lệnh MOV Dạng lệnh : MOV đích,nguồn 15 Kết quả : dữ liệu sẽ được đem từ “nguồn” vào “đích” (giá trò của nguồn vẫn giữ nguyên) Trong đó “nguồn” và “đích” có thể là : - Thanh ghi - Số - Offset . Nếu là offset thì phải chỉ ra sẽ sử dụng byte hay word bằng cách sử dụng các khai báo : Byte PTR offset ( 8 bit ) Word PTR offset ( 16 bit ) Thí dụ : MOV AX,BX MOV AX,word PTR [SI+3] MOV AH,0Fh MOV word PTR [SI+BX],BX MOV AH,byte PTR [BX] MOV byte PTR [DI+4],9 Để lấy đòa chỉ của một tên ( nhãn hoặc biến ) ta thực hiện như sau : MOV DX,offset chuoi1 hoặc LEA DX,chuoi1 Lệnh trên sẽ đưa vào DX offset của chuoi1 Chú ý : - Đích và nguồn phải có kích thước bằng nhau - Bộ vi xử lý 8088 không thể thực hiện các tác vụ với cả hai đối tượng cùng được đònh vò bởi offset . Do đó lệnh sau là không hợp lệ : Mov byte ptr [SI],byte ptr [DI+2] 4.2.2Lệnh XCHG Dạng lệnh : XCHG đích,nguồn Kết quả : dữ liệu giữa “nguồn” vào “đích” sẽ được đổi chỗ cho nhau 4.2.3Các lệnh cộng,trừ Dạng lệnh : ADD đích,nguồn ADC đích,nguồn (cộng) SUB đích,nguồn SBB đích,nguồn (trừ) Kết quả : giá trò của “đích” được cộng (hay trừ) với nguồn, kết quả được đặt vào “đích” .Giá trò của “nguồn” không đổi Nếu là ADC hay SBB, kết quả được cộng thêm hay trừ bớt 1 khi bit CF = 1. 4.2.4Các lệnh nhân,chia *Lệnh nhân : MUL giá trò 8 bit (thanh ghi/offset) Thanh ghi AL được nhân với giá trò 8 bit,kết quả là giá trò 16 bit đặt trong AX Thí dụ : Mov AL,3 Mov CL,2 Mul CL kết quả AX=6 MUL giá trò 16 bit (thanh ghi/offset) Thanh ghi AX nhân với giá trò 16 bit, kết quả là giá trò 32 bit đặt trong DX và AX 16 Thí dụ : Mov AX,3 Mov CX,0100h Mul CL kết quả DX=0 AX=0300h *Lệnh chia : DIV giá trò 8 bit (thanh ghi/offset) Thanh ghi AX được chia cho giá trò 8 bit, kết quả là giá trò 8 bit đặt trong AL,số dư đặt trong AH Thí dụ : Mov AX,035h Mov CL,010h Div CL Kết quả AL=3 AH=5 DIV giá trò 16 bit (thanh ghi/offset) Giá trò 32 bit đặt trong thanh ghi DX và AX (giống như kết quả phép nhân 16 bit) chia cho giá trò 16 bit, kết quả là giá trò 16 bit đặt trong AX,số dư đặt trong DX Thí dụ : Mov DX,038h ; giá trò 32 bit trong DX và Mov AX,02147h ; AX là 0382147h Mov CX,01000h Div CX kết quả AX=0382h (thương số) DX=0147h (số dư) 4.2.5Lệnh CMP và lệnh TEST Dạng lệnh : CMP đích,nguồn TEST dích,nguồn Cách thực hiện : CMP thực hiện phép tính : nguồn – đích, TEST lấy nguồn AND với đích. Kết quả : Không làm thay đổi giá trò của đích và nguồn, kết quả thực hiện được ghi nhận trong thanh ghi cờ hiệu Flag,để nhận đònh kết quả phương pháp thông thường là dùng nhóm lệnh chuyển điều khiển có điều kiện. 4.2.6Lệnh JMP (chuyển điều khiển không điều kiện) Dạng lệnh : JMP Nhãn 4.2.7Nhóm lệnh chuyển điều khiển có điều kiện . Dạng lệnh : Các giá trò không dấu Các giá trò có dấu Ý nghóa JB Nhãn JL Nhãn < JBE Nhãn, JNA Nhãn JLE Nhãn, JNG Nhãn <= JE/JZ Nhãn JE/JZ Nhãn = JAE Nhãn, JNB Nhãn JGE Nhãn, JNL Nhãn >= JA Nhãn JG Nhãn > 17 JNB Nhãn JNL Nhãn >= JNE Nhãn JE Nhãn <> JNA Nhãn JNG Nhãn <= Thường được dùng ngay sau lệnh CMP hoặc lệnh TEST Thí dụ : CMP AX,BX ; So sánh AX với BX JB M-1 ; Nếu AX < BX thì chuyển điều khiển đến M-1 M-0: MOV Max,AX ; Nếu AX >= BX thì gán Max = AX JMP M-2 ; Rồi chuyển điều khiển đến M-2 M-1: MOV Max,BX ; Gán Max = BX, sau đó thực hiện tiếp tại M-2 M-2: . ; Kết quả : Max là giá trò lớn nhất Max dw 0 ; giữa AX và BX 4.2.8Nhóm lệnh logic Dạng lệnh : AND đích,nguồn XOR đích,nguồn, OR đích,nguồn NOT đích 4.2.9Nhóm lệnh shift Dạng lệnh : SHL đích,1 hay SHL đích,CL SHR đích,1 hay SHR đích,CL Tác dụng : “đẩy” các bit của đích theo chiều từ bit thấp đến bit cao (sang trái/SHL) hay theo chiều từ bit cao qua bit thấp(sang phải/SHR) với số bit là 1 hay là giá trò trong CL. Bit bò đẩy “lọt ra ngoài” được đặt trong CF . Các khoảng trống do lệnh shift tạo ra được điền bằng giá trò 0 Trước khi SHL Sau khi SHL 1 Sau khi SHL 2 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 CF = 0 CF = 1 CF = 0 Trước khi SHR Sau khi SHR 1 Sau khi SHR 2 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 0 1 1 0 CF = 0 CF = 1 CF = 1 Dạng lệnh : ROL đích,1 hay ROL đích,CL ROR đích,1 hay ROR đích,CL 18 Tác dụng : Bit cao nhất và bit thấp nhất của đích được xem như đứng cạnh nhau trong một vòng tròn . ROL và ROR sẽ đẩy các bit theo chiều từ bit thấp đến bit cao (ROL) hoặc theo chiều từ bit cao sang bit thấp (ROR) trong vòng tròn ấy với số bit là 1 hay là giá trò trong CL . Trước khi ROL Sau khi ROL 1 Sau khi ROL 2 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 Trước khi ROR Sau khi ROR 1 Sau khi ROR 2 1 0 0 1 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 0 Dạng lệnh : RCL đích,1 hay RCL đích,CL RLR đích,1 hay RCR đích,CL Tác dụng : tương tự ROL và ROR, nhưng bit giá trò của CF được đặt chèn vào giữa điểm nối của bit cao nhất và bit thấp nhất.Vòng quay gồm 9 ( hay 17 ) bit . Trước khi RCL Sau khi RCL 1 Sau khi RCL 2 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 Trước khi RCR Sau khi RCR 1 Sau khi RCR 2 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0 CF = 0 CF = 1 F = 1 . của assembler cho bộ xử lý 8088 /86 sẽ được trình bày trong chương này. Các phần khác sẽ được đề cập đến trong các chương sau. 4.1NGỮ PHÁP CỦA ASSEMBLER 86. 11 CHƯƠNG 4 : ASSEMBLER 86 Ngữ pháp của các trình hợp dòch thông dụng hiện nay như MASM,TASM .

Ngày đăng: 29/09/2013, 11:20

Xem thêm

TỪ KHÓA LIÊN QUAN

w