Thứ Năm, 6 tháng 6, 2013

SEGMENT DEFINITION

Một 8086/8088 assembly language program file phải có phần mở rộng .asm

Có hai kiểu của các chương trình 8086/8088 assembly language: exe-format và com-format.

Một exe-format program sinh ra excutable files với mở rộng .exe. Một com-format program sinh excutable files với mở rộng .com.

Một exe-format program phải chứa một code segment và một stack segment. Nó có thể chứa data segment và một extra segment.

Một com-format chứa chỉ code segment.

Một programmer chọn một kích cỡ thích hợp cho stack segment, phụ thuộc vào kích thước chương trình của anh ta. Các giá trị nằm trong khoảng 100H đến 400H là hữu hiệu cho hầu hết các chương trình nhỏ.

Note: Trong một chương trình, data, code, stack segments có thể xuất hiện trong bất cứ thứ tự nào. Tuy nhiên, để tránh các tham chiếu về phía trước (forward references) tốt hơn là đặt data segment đứng trước code segment.


  • SIMPLIFIED SEGMENT DIRECTIVES 
MASM version 5.0 và các phiên bản phía trên, và TASM cung cấp một tập hợp đơn giản của directives dành cho việc khai báo segment được gọi là simplified segment directives. Để sử dụng các directives này, bạn phải khởi tạo một mô hình bộ nhớ (memory model), sử dụng .MODEL directive, trước khi khai báo bất cứ segment nào. Định dạng của .MODEL directive là:

                        .MODEL memory-model

memory model có thể là TINY, SMALL, MEDIUM, COMPACT, LARGE, HUGE hoặc FLAT:

memory model                                            description
TINY                          một segment. Do đó code và data cùng nhau không lớn hơn 64K
SMALL: một code segment. một data segment Do đó cả  code hoặc data không lớn hơn 64K
MEDIUM: nhiều hơn một code segment. một data segment. Do đó code có thể lớn hơn 64K
COMPACT: một code segment. nhiều hơn một data segment. Do đó data có thể lớn hơn 64K
LARGE: nhiều hơn một code segment. nhiều hơn một data segment. Không có mảng lớn hơn 64K. Do đó cả code và data có thể lớn hơn 64K
HUGE: nhiều hơn một code segment. nhiều hơn một data segment. Các mảng có thể lớn hơn 64K. Do đó cả code và data có thể lớn hơn 64K
FLAT: một segment lên tới 4GB. Tất cả data và code (bao gồm cả tài nguyên hệ thống) là các single 32-bit segment

Tất cả các mô hình chương trình ngoại trừ TINY dẫn đến sự tạo thành exe-format programs. TINY model tạo ra com-format programs. 

Mô hình bộ nhớ               Hệ điều hành                       Data và code được kết hợp
Tiny                                     MS-DOS                              Có
Small                                    MS-DOS, Windows              Không
Medium                                MS-DOS, Windows              Không
Compact                               MS-DOS, Windows              Không
Large                                    MS-DOS, Windows              Không
Huge                                    MS-DOS, Windows               Không
Flat                                       Windows NT                        Có

Simplified segment directives là : .CODE, .DATA, .STACK

.CODE directive có thể được thay sau bởi tên của code segment.

.STACK directive có thể được theo sau bởi kích thước của stack segment, bởi mặc địch kích thước là 1K, 1024 bytes

Định nghĩa segment mở rộng từ một simplified segment directive cho đến một simpified segment directive khác hoặc đến END directive nếu segment được định nghĩa là cái cuối cùng. 

  • Cấu trúc chung của một EXE-FORMAT PROGRAM
Ánh xạ bộ nhớ của một chương trình exe-format, với segments được định nghĩa theo thứ tự code, data, và stack:





ß SP
Stack segment


ß SS
Data segment



Code segment


ß CS , IP
PSP (100H bytes)


ß DS , ES





Các thanh ghi CS, IP được khởi tạo để trỏ đến bắt đầu của code segment.

Thanh ghi SS được khởi tạo để trỏ đến bắt đầu của stack segment.

SP được khởi tạo để trỏ đến 1 byte bên ngoài stack segment.

DS và ES được khởi tạo để trỏ đến bắt đầu của PSP (Program Segment Prefix) segment.

Đó là 100H (256) byte segment mà DOS tự động prefaces đến một chương trình khi chương trình đó được nạp vào trong bộ nhớ. 

PSP chứa thông tin quan trọng về chương trình

Do vậy, nếu một chương trình chứa một data segment, thanh ghi DS phải được khởi tạo bởi programmer để trỏ đến bắt đầu của data segment đó.

Tương tự nếu một chương trình chứa một extra segment, thanh ghi ES phải được khởi tạo bởi programmer để trỏ đến bắt đầu của extra segment đó.

Khởi tạo DS

Note: Các lệnh mà được khởi tạo thanh ghi DS cho một exe-format program với simplified segment directives là:

                            MOV  AX, @DATA
                            MOV  DS, AX

trong đó AX có thể được thay thế bởi bất cứ thanh ghi 16-bit mục đích chung nào khác.

Tại load time, @DATA được thay thế bằng 16-bit base address của data segment.

Do đó @DATA ước lượng đến một constant value; operand như vậy được gọi là immediate operand.

Bởi vì kiểu lệnh MOV:
           MOV  SegmentRegister, ImmediateOperand
là không hợp lệ, một dạng khởi tạo như:
           MOV  DS, @DATA
là không hợp lệ. Khởi tạo như vậy được hoàn thành một cách gián tiếp bởi việc sử dụng 16-bit general-purpose register. Ví dụ:
           MOV  AX, @DATA
           MOV  DS, AX

Note: Mọi 8086 assembly language program phải kết thúc với END directive. Directive này có thể được theo sau bởi một entry label, những gì báo cho assembler trỏ đến nơi thực thi chương trình bắt đầu. entry label có thể có bất cứ tên hợp lệ nào. 

Không có nhận xét nào:

Đăng nhận xét