Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Lập trình ngắt ... 808x structure

  1. #1
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Cool Lập trình ngắt ... 808x structure

    Phần này chỉ đề cập đến ngắt trong họ 808x ( 8086 , 8088 , 80862 .. )

    Các thanh ghi : gồm 14 thanh chia 4 nhóm :
    + Thanh ghi chung : AX , BX , CX , DX
    AX : Accumulator
    BX : Base
    CX : Count
    DX : Data
    + Thanh ghi đoạn : CS , DS , SS , ES
    CS : Code Segment
    DS : Data Segment
    SS : Stack Segment
    ES : Extra Segment
    + Thanh ghi slope ( offset ) : IP , SP , BP , SI , DI
    IP : Instruction Pointer
    SP : Stack Pointer
    BP : Base Pointer
    SI : Source Index
    DI : Destination Index
    + Thanh ghi FLAGS : 9 flags
    Bit : 15 11 10 9 8 7 6 4 2 0
    Flags: OF DF IF TF SF ZF AF PF CF
    Cờ trạng thái
    + CF : Carry Flags
    + OF : OverFlow Flags
    + ZF : Zero Flags
    + SF : Sign Flags
    + PF : Parity Flags
    + AF : Axiliary Flags
    Cờ điều khiển
    + DF Direction Flag
    + IF : Interrupt Flag
    + TF : Trap Flag

    Hết Part I .

    Tổ chức bộ nhớ : kiểu phân đoạn length 1 -> 64 KB
    Cấu trúc viết bộ nhớ : SEGMENT : OFFSET
    Example : address 3000 : 0056 : SEGMENT = 3000 ; OFFSET = 0056
    Real Address được tính = : SEGMENT * 16 + OFFSET
    -> above example has real address : 0x30056

    Bộ nhớ gồm 3 đoạn và 1 đoạn nhỏ : CS - DS - SS - ES

    Chuyển địa chỉ :
    Real -> Segment : unsigned FP_SEG ( real_address )
    unsigned FP_OFF ( real_address )
    versa : void far *MK_FP ( segment , offset )

    Example : after use this program :
    char buf[100];
    unsigned ds,dx;
    ds = FP_SEG(buf) ; dx = FP_OFF(buf);

    ds:dx will address buf array

    suppose that at es : bx invovle any memory
    then real address of this memory at pointer pchar :
    char *pchar;
    pchar = (char*)MK_FP(es,bx);

    Hết Part II .
    None!

  2. #2
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Mặc định Ngắt mềm bằng geninterrupt và int86x

    Dùng cách ngắt mềm ( 0x21,0x0A ) xây dựng hàm nhập một chuỗi kí tự có độ dài n. Hàm trả về số kí tự đọc được .

    Cách 1 : dùng hàm geninterrupt(int sh)

    C Code:
    1. #include <dos.h>
    2.  
    3. int get_string( char *buf, int n)
    4. {
    5.    int m,i;
    6.    buf[0] = n;
    7.    _DS = FP_SEG(buf);
    8.    _DX = FP_OFF(buf);
    9.    _AH = 0x0A;
    10.    geninterrupt(0x21);
    11.    m = buf[1];
    12.  
    13.    for ( i = 0 ; i < m ; ++i )
    14.    buf[i] = buf[i+2];
    15.    buf[m] = 0;
    16.    return m;
    17. }

    Cách 2 : dùng hàm int86x ( int sh , union REGS* v , union REGS* r , union REGS* s);

    C Code:
    1. #include <dos.h>
    2.  
    3. int get_string(char* buf , int n)
    4. {
    5.    int m,i;
    6.    union REGS vr ; struct SREGS s;
    7.    buf[0] = n;
    8.    s.ds = FP_SEG(buf);
    9.    v.x.dx = FP_OFF(buf);
    10.    v.h.ah = 0x0A;
    11.    int86x(0x21 , &v,&r,&s );
    12.    m = buf[1];
    13.    
    14.    for ( i = 0 ; i < m ; ++i )
    15.    buf[i] = buf[i+2];
    16.    buf[m] = 0;
    17.    return m;
    18. }
    None!

  3. #3
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Mặc định Các phương pháp ngắn của chip 808x

    Trong ngắt C của chip 808x có 2 phương pháp ngắt chính :
    PP1 : dùng hàm geninterrupt(int sh );
    PP2 : dùng cấu trúc và các hàm đặc tả ..

    PHƯƠNG PHÁP 1 : using >> geninterrupt( int sh ) <<
    sh : địa chỉ ngắt

    áp dụng với các thanh ghi ( pseudo register ) đã post ở trên .

    Ví dụ : ngắt ( 0x21, 6 ) ( để đưa 1 kí tự lên screen ) :

    _AH = 6 ;
    _AL = 65 ;
    geninterrupt(0x21);
    Cấu trúc thanh AH : _AH _AX _AL

    PHƯƠNG PHÁP 2 : dùng kết cấu Union

    + Cấu trúc và hợp ngắt
    C Code:
    1. struct WORDREGS { // Thanh ghi 16-bit
    2.     unsigned int ax,bx,cx,dx,si,di,cflag,flags;
    3. }
    4.  
    5.  
    6. struct BYTEREGS {// Thanh ghi 8-bit
    7.     unsigned int al,ah,bl,bh,cl,ch,dl,dh;
    8. }
    9.  
    10. struct SREGS {// Thanh ghi OFFSET
    11.     unsigned int es,cs,ss,ds;
    12. }
    13.  
    14. union REGS {// Hợp 16-bit and 8-bit
    15.     struct WORDREGS x;
    16.     struct BYTEREGS h;
    17. }
    18.  
    19. struct REGPACK {
    20.     unsigned r_ax, r_bx , r_cx , r_dx;
    21.     unsigned r_bp, r_si, r_di, r_ds, r_es, r_flags;
    22. }

    + Các hàm

    int86 (int sh , union REGS* v , union REGS* r);
    tham số vào v rồi ra qua r . Giá trị cho lại trên thanh STATUS

    int86x(int sh , union REGS* v , union REGS* r , struct SREGS* s);
    như hàm int86 nhưng tham số đầu vào v và s rồi ra qua r và s

    void segread(struct SREGS* s);
    ghi nội dung vào s . Chuẩn bị cho int86x();

    Chú ý : Nếu ngắt cần tham số thì xài int86x nếu không thi xài int86

    Hàm bổ sung :
    int intdos ( union REGS* v , union REGS* r )
    thực hiện ngắt 0x21 của DOS như int86

    int intdosx(union REGS* v , union REGS* r, struct SREGS* s)
    thực hiện ngắt 0x21 của DOS như int86x

    void intr( int sh , struct REGPACK *reg );
    thực hiện ngắt tại sh tham số xác định qua reg

    Example : ngắt ( 0x21, 6 ) làm như sau :
    C Code:
    1. union REGS v,r;
    2. v.h.ah = 6 ; // đưa chức năng vào AH
    3. v.h.al = 65; // đưa kí tự A ra AL
    4. int86(0x21, &v, &r); // thực hiện ngắt
    None!

  4. #4
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Chú ý : các vị trí ngắt là default nên mỗi thao tác ngắt bạn thực hiện phải biết địa chỉ đó làm việc gì ..
    Ví dụ : Muốn tạo tệp thì ngắt (0x21,0x3C)
    Mở tệp (0x21, 0x3D);
    .....Ngắt linh tinh không biết nó ra cái gì ^_^!

    Mã các lỗi ngắt ( được đặt trong AX )

    1 - Số hiệu chức năng không hợp lệ
    2 - Không thấy tập tin
    3 - Không thấy đường dẫn
    4 - Hết thẻ File
    5 - Không truy nhập được
    6 - Thẻ File không hợp lệ
    7 - Khối điều khiển bộ nhớ MCB bị phá hủy
    8 - Không đủ bộ nhớ
    9 - Địa chỉ khối nhớ không hợp lệ
    A - Môi trường không hợp lệ
    B - Khuôn dạng không hợp lệ
    C - Mã truy nhập không hợp lệ
    D - Dữ liệu không hợp lệ
    E - Không dùng
    F - Ổ đĩa không hợp lệ
    10 - Định xóa thư mục hiện hành
    11 - Không cùng thiết bị
    12 - Hết tập tin để tìm
    None!

  5. #5
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Mặc định Xử lý tập tin bằng sử dụng ngắt trong lập trình C

    1 . Tạo tệp

    + Ngắt : ( 0x21 , 0x3C )

    + Vào : DSX chứa địa chỉ dãy kí tự biểu thị ỏ đĩa, đường dẫn và tên tệp cần tạo
    CX chứa thuộc tính tệp ( CX = 0 đối với tệp đọc ghi bình thường )

    + Ra : Nếu cờ nhớ CF = 0 ( cflag của struct WORDREGS ) là thành công và AX chứa số hiệu tệp vùa được xây dựng, số hiệu này có thể dùng trong thao tác ghi tệp
    Nếu CF = 1 là có lỗi và AX chứa mã lỗi . Các lỗi có thể gặp 3,4,5

    + Chú ý : Nếu tệp đã tồn tại thì nó bị xóa

    Mình viết một ví dụ cho dễ tưởng tượng ngắt nha ^_^!
    Viết một hàm tạo tệp có 2 cách là 2 cách ngắt như đã nói ở trên .

    Viết cách 1 dùng geninterrupt()
    C Code:
    1.  
    2. #include <dos.h>
    3.  
    4. int taotep(char *tentep)
    5. {
    6.    printf("\n Ten tep muon tao : ");gets(tentep);
    7.    _DS = FP_SEG(tentep) ; _DX = FP_OFF(tentep);  // vào số liệu
    8.    _AH = 0x3C ; // kiểu ngắt
    9.    geninterrupt(0x21); // ngắt
    10.    
    11.    if ( CF != 0 ) printf("\n Loi tao tep ! ");
    12.    else printf("\n Tao tep thanh cong . ");
    13.    
    14.    return 0;
    15. }

    Cách 2 : dùng kiểu cấu trúc

    C Code:
    1. #include <dos.h>
    2.  
    3. int taotep(char *tentep);
    4. {
    5.     printf("\n Dat ten cho tep can tao : ");gets(tentep);
    6.    v.h.ah = 0x3C;
    7.    v.h.al = 0;
    8.    s.ds = FP_SEG(tentep);
    9.    v.x.dx = FP_OFF(tentep);
    10.    int86x(0x21,&v,&r,&s);
    11.    if ( r.x.cflag !=0 )
    12.    printf("\n Loi tao tep %s ",tentep);
    13.    return 0;
    14. }

    + Chú ý : mình chưa khai báo biến trong ví dụ , các bạn đọc tự check nha .
    Khi làm việc thao tác với tệp kiểu này thì dùng kiểu cấu trúc là tốt nhất vì có flags và clags đồng thời nên tính chính xác cao hơn, và thông số vào ra đều được check cả lúc vào và ra nên dễ xài hơn .

    2 . Mở Tệp

    + Ngắt : ( 0x21 , 0x3D )

    + Vào : DS : DX chứa địa chỉ dãy kí tư và đường dẫn
    AL chứa chế độ mở ( 0 : đọc ; 1 : ghi ; 2 - đọc/ghi )

    + Ra : Nếu cờ nhớ CF = 0 ( struct WORDREGS ) thành công thì AX chứa số hiệu tệp vứa được xây dựng ( số hiệu này > 4 vì DOS sử dụng từ 0 đến 4 rồi )
    Nếu CF = 1 là có lỗi và AX chứa mã lỗi . Các lỗi có thể : 2,3,4,5 và 12 .

    + Chú ý :

    - Mở tất cả các loại tệp kể cả tệp bị hidden
    - Nếu tệp không tồn tại mã lỗi = 2
    - Nếu mở một tệp đã tồn tại theo mode 1 thì tệp không bị xóa . Chỉ các phần tử trên tệp bị ghi đè mới bị thay đổi. Còn lại nội dung không thay đổi .

    3. Đóng tệp

    + Ngắt ( 0x21 , 0x3E )

    + BX chứa số hiệu tệp cần đóng

    + Các lỗi có thể : 6

    4. Đọc tệp

    + Ngắt : ( 0x21 , 0x3F )

    + Vào : BX chứa số hiệu tệp
    CX chứa số byte cần đọc
    DS : DX chứa địa chỉ vùng nhớ nhận dữ liệu

    + Ra :

    _ Nếu CF = 0 thì AX chứa số byte cần đọc
    _ CF = 1 là lỗi và AX chứa mã lỗi

    + Các lỗi có thể : 5,6

    5 . Ghi lên tệp

    + Ngắt ( 0x21 , 0x40 )

    + Vào : BX chứa số hiệu tệp
    CX chứa số byte cần ghi
    DS : DX chứa địa chỉ vùng dữ liệu cần ghi lên tệp

    + Ra :

    _ Nếu CF = 0 là thành công và AX chứa số byte ghi được
    _ CF = 1 là có lỗi và AX chứa mã lỗi

    + Các lỗi có thể : 5,6

    6. Xóa tệp

    + Ngắt : ( 0x21 , 0x41 )

    + Vào : DS : DX chứa địa chỉ dãy kí tự, đường dẫn tên tệp cần xóa

    + Ra :
    _ Nếu CF = 0 thì thành công
    _ Nếu CF = 1 thì lỗi và AX chứa mã lỗi

    + Các lỗi có thể : 2,5
    None!

Các đề tài tương tự

  1. Graph structure
    Gửi bởi quano1 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 18
    Bài viết cuối: 05-09-2013, 11:31 PM
  2. Borland C++ Lỗi Undefined structure 'REGS' ?! ngắt dos
    Gửi bởi songhy trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 13-07-2013, 11:20 PM
  3. giúp hộ bài tập về structure
    Gửi bởi kokujampo trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 23-05-2010, 02:07 PM
  4. bài tập về Structure
    Gửi bởi kokujampo trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 19-05-2010, 06:45 PM
  5. cho mình hỏi về structure trong VS c++ !
    Gửi bởi nguyendima trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 20-02-2010, 06:46 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn