watcom настройка сегментов

Тема в разделе "LANGS.C", создана пользователем XshStasX, 29 мар 2011.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Kак настроить сегменты в watcom C.
    Проблема том что я не получить валидный адрес данных, кроме локальных данных с ними все в порядке.
    Проект прикреплен к теме.

    Код (Text):
    1. .286 p
    2. .model tiny
    3.         assume  nothing
    4.        
    5. DGROUP  group   _BSS,CONST,CONST2,_DATA,DATA,STRINGS,STACK
    6. extern      _cstart_    :proc
    7.  
    8.  
    9. _TEXT   segment byte public 'CODE'
    10.                 assume  CS:_TEXT
    11.                 assume  DS:DGROUP
    12.                 public  myrtn_
    13.                
    14. org 100h    
    15.            
    16. myrtn_  proc
    17.  
    18.  
    19.                 push bp
    20.                 mov bp,sp
    21.                      call _cstart_
    22.                 mov sp,bp
    23.                 pop bp
    24.                 ret
    25. myrtn_  endp            
    26. _TEXT   ends
    27.  
    28. _DATA   segment  'DATA'
    29.     _data_ db 100h dup(?)
    30. _DATA   ends
    31.  
    32. DATA   segment  'DATA'
    33.     data_ db 100h dup(?)
    34. DATA   ends
    35.  
    36. CONST   segment  'DATA'
    37.     cnt_ db 100h dup(?)
    38. CONST   ends
    39.  
    40.  
    41. CONST2   segment  'DATA'
    42.     cnt2_ db 100h dup(?)
    43. CONST2   ends
    44.  
    45.  
    46. STRINGS   segment  'DATA'
    47.     str_ db 100h dup(?)
    48. STRINGS   ends
    49.  
    50. _BSS   segment  'BSS'
    51.     bss_ db 100h dup(?)
    52. _BSS   ends
    53.  
    54. STACK   segment  'STACK'
    55. ;    bss_ db 100h dup(?)
    56. STACK   ends
    57.  
    58.  
    59.  
    60. end             myrtn_
    Код (Text):
    1. #include "precomp.h"
    2. #include "TextMode.h"
    3.  
    4. void _cstart(void){
    5.        BREAK_POINT;
    6.       InitTextMode();
    7.       TextOut(sdf);  // передает не правильный адрес
    8.        __asm{
    9.  
    10.      xor eax,eax
    11.      int 16h
    12.  };
    13.  
    14.  
    15. typedef struct __TEXTPAGE{
    16.     struct XY{
    17.         unsigned char x;
    18.         unsigned char y;
    19.     };
    20.     unsigned char attr;
    21. } TEXTPAGE,*PTEXTPAGE;
    22.  
    23. #define _TEXTPAGE  struct __TEXTPAGE
    24. #define TEXTPAGE    _TEXTPAGE
    25.  
    26. #define CountPage 7
    27. #define TextMode8025 0x03
    28.  
    29. TEXTPAGE TextPages[CountPage];
    30. char        ActivePage;
    31.  
    32.  
    33.  
    34. int strlen(char*str);
    35. void memcpy(void *dest,void *source,int size);
    36. void memset(void *dest,int size,char fill);
    37.  
    38. int strlen(char*str){
    39.     char *p;
    40.     p = str;
    41.     while(*p) ++p;
    42.     return p - str;
    43. };
    44.  
    45. void memcpy(void *dest,void *source,int size){
    46.     while(size--){
    47.         *((char*)dest)++ = *((char*)source)++;
    48.     };
    49. };
    50.  
    51. void memset(void *dest,int size,char fill){
    52.     while(size--)
    53.      *((char*)dest)++ = fill;
    54. };
    55.  
    56. void  InitTextMode(){
    57.     ActivePage = 0;
    58.     memset(TextPages,sizeof(TextPages),0);
    59.    
    60.     __asm{
    61.         mov ax,TextMode8025
    62.         int 10h
    63.     };
    64.    
    65. };
    66.  
    67.  
    68.  
    69. void TextOut(char*text){
    70.  //text указывает не понятно куда  ((!!!
    71.     int len;
    72.     TEXTPAGE pos;
    73.     memcpy(&pos,&TextPages[GetActivePage()],sizeof(TEXTPAGE));    
    74.     len = strlen(text);
    75.     __asm{
    76.         push es
    77.             mov ax,ds
    78.             mov es,ax
    79.             mov cx,len
    80.             mov bp,text
    81.             lea  bp,[pos]
    82.             mov WORD PTR dx,[bp + 0]
    83.             mov BYTE PTR bl,[bp + 2]
    84.             mov  bp,[text]
    85.             mov ax,0x1301 // 13h function, update cursor pos
    86.             int 10h
    87.         pop es
    88.     };
    89. };
     
  2. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    вопрос решен
    push DATA
    pop ds