Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с вводом\выводом в Асм 
:(
    Опции темы
lesha_od
Дата 4.12.2006, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



Делаю лабораторку, но не знаю, как выполнить задание.

Задание такое:
Написать программу, которая вводит первую строку символов из файла, начиная с 11 байта, и выводит ее на экран (предварительно очистить экран и поставить курсор в начала экрана). Потом выводит на экран количество считанных байтов. Затем вводит вторую строку символов с клавиатуры. Далее записывается в выходной файл file2.txt сначала вторая строка, а затем измененная первая (изменить первую строку так, чтобы остались только знаки мат. операций).

Вот код, который дан в примере.
Сам пример:
Прочитать первую строку символов из входного файла file1.txt, начиная с 11 байта, и вывести ее на экран в стандартное окно Windows. Ввести вторую строку символов с клавиатуры.  Записать в выходной файл file2.txt сначала вторую строку, а затем первую (переписывать символы первой строки через один).  

Код

.386
   .model flat, stdcall
 option casemap :none   ; case sensitive
 include \masm32\include\windows.inc
 include \masm32\include\kernel32.inc
 include \masm32\include\user32.inc

 includelib \masm32\lib\kernel32.lib
 includelib \masm32\lib\user32.lib

   .data
     hStdIn        DD 0
     hStdOut  DD 0
     mes1 db "Enter stroku ",0
     kol_chars dd 0
     mes2 db "Stroka from source file",0
     title_1 db "From source file",0
     name_in    db      'file1.txt',0
     handle1    dd    0
     name_out   db      'file2.txt',0
     handle2     dd      0
     stroka1 db 30 dup (0)
     stroka2 db 30 dup (0)
     stroka3 db 30 dup (0)
     FileSize dd 0 

    .code
     start:
      ; открываем первый файл для чтения

    push    0
    push    0    ;атрибуты (они игнорируются)
    push    OPEN_EXISTING ;открыть существующий файл, 
                               ; если его нет - ошибка
    push    0    ;защита файла не требуется
    push    FILE_SHARE_READ ; разрешено совместное 
; использование файла (по чтению)
    push    GENERIC_READ    ;разрешено чтение из файла
    push    offset name_in
    call    CreateFile
        mov    handle1,eax    ;дескриптор файла                   


             invoke SetFilePointer, handle1, 11, 0, 0
             
      ; читаем файл

    push    0                                         
    push    offset FileSize    ;сколько байт прочитано реально
    push    30
    push    offset stroka2    ;буфер, в который читаем файл
    push    handle1
    call    ReadFile

      ;   Выводим информацию из файла

              invoke MessageBox, 0, offset stroka2, offset title_1, MB_ICONINFORMATION

  call    AllocConsole
  test    eax, eax   ; запрос консоли у ОС
  jz    ex

  push  STD_OUTPUT_HANDLE
  call  GetStdHandle         ; запрашиваекм идентификатор буфера вы-вода
  mov      hStdOut, eax

  push    STD_INPUT_HANDLE
  call    GetStdHandle         ; запрашиваем идентификатор буфера ввода
  mov          hStdIn, eax

  push    0        ;lpReserved = NULL
  push    offset kol_chars    ;number of bytes written on stdout
  push       13
  push offset mes1
  push    hStdOut
  call    WriteConsole  ; выводим подсказку

  push    0        ;lpReserved = NULL
  push    offset kol_chars
  push    30
  push    offset stroka1
  push    hStdIn
  call    ReadConsole         ; вводим символы с клавиатуры

              
      ; открываем файл для записи

    push    0
    push    0    ;атрибуты (они игнорируются)
    push   CREATE_ALWAYS    ;создать
    push    0    ;защита файла не требуется
    push    FILE_SHARE_WRITE    ;разрешено совместное 
                                                            ; использование файла (по запи-си)
    push    GENERIC_WRITE    ;разрешено запись из файла
    push    offset name_out
    call    CreateFile
               mov    handle2,eax    ;дескриптор файла                   

        mov ecx,FileSize
        shr ecx,1
        inc ecx
        mov FileSize,ecx
        mov esi,0
        mov edi,0
       m1:
          mov al,stroka2[esi]
          mov stroka3[edi],al
          add esi,2
          inc edi
        loop m1              

     ; пишем в файл     

    push    0
    push    offset FileSize    ;сколько байт записано реально
    push    kol_chars
    push  offset stroka1    ;буфер, откуда пишем
    push    handle2
    call    WriteFile

     ; пишем в файл     

    push    0
    push    offset FileSize    ;сколько байт записано реально
    push    FileSize
    push  offset stroka3    ;буфер, откуда пишем
    push    handle2
    call    WriteFile
    ex:
            push 0   
        call ExitProcess

   end start



Тут вроде несложно изменить, но у меня не получается - выводит совсем не то smile
Кто знает - помогите с лабой плиз.
PM MAIL   Вверх
anwe
Дата 4.12.2006, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 1
Всего: 23



А что именно при сохранении ты получаешь? Ты думаешь, что при беглом просмотре можно понять что у тебя выводится? Ошибаешься smile 
Быстрым взглядом тут ничего не видно. Вроде, все правильно.
Вызывает вопрос лишь следующее.
1. Не понятно для чего написаны три строки:
Код

        shr ecx,1
        inc ecx
        mov FileSize,ecx

Они означают, что регистр ecx ты уменьшил в два раза и прибавил 1 (а после это занес в переменную). Для чего? smile  Так все символы не переберешь, лишь (половина+1).
2. В добавок к этому написано
Код

          add esi,2

То есть количество выводимых символов (половина+1) да они еще и выводятся через 1
Надо:
Код

          add esi,1  ;или inc esi

Тогда можно обойтись одним регистром.

3. Длина строки stroka3 у тебя задано в явном виде - 30. Вот и напиши так.
Код

    push    0
    push    offset FileSize    ;сколько байт записано реально
    push    30
    push  offset stroka3    ;буфер, откуда пишем
    push    handle2
    call    WriteFile

Конечно можно и через FileSize, как написал ты, но это, возможно, в твоем конкретном примере. Если же реально записанных символов при предыдущей записи stroka1 будет меньше, то получишь  результат еще короче.
Повторюсь, что в этом примере, если все гладко, то это не выдаст неверный результат, а в общем случае нужно определять количество записываемых данных.
PM MAIL   Вверх
dumb
Дата 5.12.2006, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



это, я так понял, пример "исходный", без модификаций.
Цитата(lesha_od @  4.12.2006,  11:55 Найти цитируемый пост)
Сам пример:
Прочитать первую строку символов из входного файла file1.txt, начиная с 11 байта, и вывести ее на экран в стандартное окно Windows. Ввести вторую строку символов с клавиатуры.  Записать в выходной файл file2.txt сначала вторую строку, а затем первую (переписывать символы первой строки через один).


тут надо отметить, что пример сильно убогий и, вообще говоря, не соответствует требованиям задачи. либо нужно уточнить постановку задачи: что есть "строка", каковы ограничения(если есть) на длины, что есть "стандартное окно Windows"?
PM MAIL   Вверх
lesha_od
Дата 6.12.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



dumb, "стандартное окно Windows" - это вывод окна сообщения (Alert / msgbox).


anwe, 
Код

add esi,2

значит, что, по заданию примера, файл записывается через один символ. а надо сделать, чтобы записывались только "+ - * / < >"
И как вывести число считанных байт?
PM MAIL   Вверх
dumb
Дата 6.12.2006, 03:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



Цитата(lesha_od @  4.12.2006,  11:55 Найти цитируемый пост)
(предварительно очистить экран и поставить курсор в начала экрана)

Цитата(lesha_od @  6.12.2006,  00:44 Найти цитируемый пост)
"стандартное окно Windows" - это вывод окна сообщения (Alert / msgbox).

да? - а скажи пожалуйста, как ты его чистить будешь и курсор в нем ставить? smile

эта тема должна находиться в Центре Помощи, если ты сам ничего делать не собираешься.
PM MAIL   Вверх
lesha_od
Дата 6.12.2006, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



Можно весь вывод делать в окне сообщений так: 
Код

invoke MessageBox, 0, offset stroka2, offset title_1, MB_ICONINFORMATION

Вопросов только 2:
- как оставить только знаки мат. операций?
- как вывести число прочитанных байтов?
PM MAIL   Вверх
anwe
Дата 6.12.2006, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 1
Всего: 23



Цитата(lesha_od @  6.12.2006,  05:55 Найти цитируемый пост)
как оставить только знаки мат. операций?

Отбирай их по кодам.

Цитата(lesha_od @  6.12.2006,  05:55 Найти цитируемый пост)
как вывести число прочитанных байтов? 

Но ведь в функции ReadFile/WriteFile последний параметр и есть это число.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.