Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
  2. KozzyKoder

    KozzyKoder New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2008
    Сообщения:
    12
    Fatal: Bad loc for fixupp in module 'Test.obj' near file offset c8. Что это за ошибка? Возникает при линковке в TLINK32
    Код программы:

    .386
    ;------------------------------------------------------------------------------
    ;Сегмент Данных
    ;------------------------------------------------------------------------------
    Data_Seg SEGMENT PARA PUBLIC 'DATA' USE32

    Data_Seg ENDS

    ;------------------------------------------------------------------------------
    ;Сегмент Стека
    ;------------------------------------------------------------------------------
    Stack_Seg SEGMENT PARA STACK 'STACK' USE32

    db 256 dup (?)

    Stack_Seg Ends

    ;------------------------------------------------------------------------------
    ;Сегмент Кода
    ;------------------------------------------------------------------------------
    Code_Seg SEGMENT PARA PUBLIC 'CODE' USE32

    assume ds : Data_Seg, ss : Stack_Seg, cs : Code_Seg
    Start:
    mov ax, Data_Seg
    mov ds, ax
    mov ax, Stack_Seg
    mov ss, ax
    mov ah, 4ch
    int 21h

    Code_Seg ENDS
    END Start
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    KozzyKoder
    Поясни, что ты хочешь сделать? Программу под dos, которая бы могла использовать 32ухразрядные регистры?
     
  4. KozzyKoder

    KozzyKoder New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2008
    Сообщения:
    12
    Да. Программу под DOS, которая могла бы использовать 32 разрядные регистры.
     
  5. Vika_M

    Vika_M New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    2
    Всем большое спасибо за ответы) а на ассемблере под linux, кто-нибудь знает как strcspn реализовать?)
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    KozzyKoder
    Давно уже не играл с тасмом под ДОС, но раньше всегда юзал обычные .MODEL, .STACK и т.д. и проблем с использованием 32 битных регистров не было.
    Код (Text):
    1. .MODEL compact, pascal ;stdcall
    2. .STACK 1024
    3. .DATA
    4. ...
    5. .CODE
    6. .486
    7. start:
    8. ...
    9.   mov EAX, [DI]
    10.   mov dword ptr [X_VESA], EAX
    11. ...
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    KozzyKoder
    Если собираешь tasm'ом, то маленькая добавка к коду Y_Mur
    Код (Text):
    1. ...
    2. start:
    3.     .startup        ;; tasm настроит ds и ss:sp
    4. ...
    компилировать
    Код (Text):
    1. tasm имя_исходника;
    2. tlink /3 /x имя_исходника,имя_исходника
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Vika_M
    Типичная ошибка всех просящих студентов:
    1) нечеткая формулировка задачи
    2) под словами "написать на ассемблере" забывают указать диалект ассемблера, а их более десятка: tasm, masm, fasm, hla, a386 и т.д.
    3) не указывается операционная система: DOS, Windows (от 3.11 до Vista), *nix (какой?)
    4) выходной файл (com, exe, драйвер)
    А самой под деббагером или после дизассемблера посмотреть, не судьба?
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    KozzyKoder
    Да кстати если ты всё таки победишь линкер то программа всё равно не заработает ;) USE32 предполагает что процессор уже находится в 32х разрядном режиме и должен использоваться в соответствующих осях (не обычная DOS, а как минимум DOS extender, win32 или что-то типа того).
    В сегментах USE16 регистры и адреса x32 доступны через префиксы переопределения размера операнда 66h и размера адреса 67h. Tasm ставит их автоматически ориентируясь на имена регистров (eax вместо ax), указания dword ptr и т.п. и это правильный путь доступа к ним из под dos.
     
  10. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    Всем ЗДРАВСТВУЙТЕ!!! у меня проблема... создаю файл:
    f=CreateFile (с, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    а выдается ошибка:
    error C2065: ', GENERIC_WRITE' : undeclared identifier
    помогите!!! не знаю, что делать!!!
     
  11. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    JangaMa
    #include <windows.h>

    P.S. весь код
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    JangaMa
    #include <windows.h>
     
  13. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    вот весь код:

    #include "stdafx.h"
    #include "conio.h"
    #include "windows.h"
    #include "process.h"
    #include "stdlib.h"
    #include "string.h"
    CRITICAL_SECTION gs;


    DWORD WINAPI Thread1 (PVOID pvParam)
    {
    //EnterCriticalSection (&gs);
    int i=0;
    int j=4;
    char c[20]="C:\\";
    //char d[5];
    char* tname = (char*) pvParam;
    printf ("%s\n", tname);
    while (tname!=13)
    {
    i++;
    }
    tname ='.';
    tname [++i]='t';
    tname [++i]='x';
    tname [++i]='t';
    tname [++i]=0;
    strcat (c,tname);
    printf ("%s\n", c);
    int txt_length=lstrlen(c);
    DWORD written;
    HANDLE f;
    f=CreateFile (с, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    WriteFile(f, c, txt_length+1, &written, NULL);
    //LeaveCriticalSection (&gs);
    return 0;
    }


    int _tmain(int argc, _TCHAR* argv[])
    {
    char S[20]="C:\\tables.txt";
    char pBuffer [100];
    DWORD id1;
    int k=0;
    char Name [10];
    DWORD read;
    HANDLE tab;
    tab=CreateFile (S, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    int fsize=GetFileSize (tab, NULL);
    ReadFile (tab, pBuffer, fsize, &read, NULL);
    int i=0;
    while (pBuffer!='\n')
    {
    Name [k]=pBuffer;
    i++;
    k++;
    }
    Name [k]='\n';
    Name [k]='\0';
    //printf ("%s\n", Name);
    //InitializeCriticalSection (&gs);
    HANDLE h1=CreateThread (NULL,0,Thread1,&Name,0,&id1);
    getch();
    CloseHandle (tab);
    //fclose (f);
    return 0;
    }
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Сдаётся мне что в:
    символ "с" - русский.
     
  15. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Ну, что ж, тоже погадаю. Я бы поставил #include <windows.h> на первое место
     
  16. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    ой))) спасибо большое!!!!! а можно еще один вопрос???
    почему потоки не работают так, как надо?
    надо чтобы каждый поток считывал одну строку из файла и передавал его своей функции, а функция должна вывести эту строку

    #include "stdafx.h"
    #include "conio.h"
    #include "windows.h"
    #include "process.h"
    #include "stdlib.h"
    #include "string.h"
    CRITICAL_SECTION gs;

    DWORD WINAPI Thread1 (PVOID pvParam)
    {
    //EnterCriticalSection (&gs);
    char* tname = (char*) pvParam;
    printf ("%s\n", tname);
    //LeaveCriticalSection (&gs);
    return 0;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    char S[20]="C:\\tables.txt";
    char pBuffer [100];
    DWORD id1;
    int k=0;
    char Name [10];
    DWORD read;
    HANDLE tab;
    tab=CreateFile (S, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    int fsize=GetFileSize (tab, NULL);
    ReadFile (tab, pBuffer, fsize, &read, NULL);
    HANDLE h[3];
    int i=0;
    int j=0;
    while (j<3)
    {
    while (pBuffer!='\n')
    {
    Name [k]=pBuffer;
    i++;
    k++;
    }
    Name [k]='\n';
    Name [++k]='\0';
    //printf ("%s\n", Name);
    //InitializeCriticalSection (&gs);
    h[j]=CreateThread (NULL,0,Thread1,&Name,0,&id1);
    k=0;
    j++;
    i++;
    }
    getch();
    CloseHandle (tab);
    return 0;
    }
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А что ты хочешь, ты передаёшь в поток указатель и тут же начинаешь менять значения по-этому указателю. printf довольно тормознутая функция, вот у тебя и получается вывод последнего имени. ;) Сохраняй каждое имя в отдельное место.
     
  18. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    если честно, то не совсем понятно как это сделать? ведь тогда цикл надо будет убрать?
     
  19. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    и еще вопрос: а можно ли считать 1 строку из файла, а не файл целиком?
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Можно в каждой итерации выделять динамический массив, и передавать его адрес в поток, только не забудь в потоке его грохнуть.