Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2017, 00:32   #1
nait123321
Пользователь
 
Регистрация: 25.04.2017
Сообщений: 13
По умолчанию Запись структуры в файл

Здравствуйте, требуется модифицировать код, а именно: создать и напечатать в файл rezult1.txt инициализированные структуры(все). А в result 2.txt те - которые выводятся на экран. Вот код программы:


Код:
.model small
 
.stack 100h
 
.data
        CrLf    db      0Dh, 0Ah, '$'
 
TTrains struc
        Flight          dw      ?               ;рейс
        Destination     db      10 dup(' ')     ;станция назначения
        DepartureHour   dw      ?               ;время отправления
        DepartureMin    dw      ?               ;время отправления
        ArrivalHour     dw      ?               ;время прибытия
        ArrivalMin      dw      ?               ;время прибытия
TTrains ends
 
        Timetables      label
        TTrains  <1,'Kiev',   07,02, 12,15>
        TTrains  <2,'Lviv',   17,02, 19,01>
        TTrains  <3,'Odessa', 04,55, 07,15>
        TTrains  <4,'Moscow', 01,33, 11,22>
        TTrains  <5,'Paris',  02,27, 22,09>
        TTrains  <6,'Berlin', 05,43, 15,31>
 
        N       dw      ($-Timetables)/(SIZE TTrains)
 
       filenam db "result1.txt",0
        filename db "result2.txt",0
        handler dw ?

.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
;CREATE FILE.
  mov  ah, 3ch
  mov  cx, 0
  mov  dx, offset filenam
  int  21h
  ;----------
  mov  handler, ax
  ;WRITE STRING.
  mov  ah, 40h
  mov  bx, handler
  mov  cx, 150  ;STRING LENGTH.
  mov  dx, offset TTrains
  int  21h

;CLOSE FILE (OR DATA WILL BE LOST).
  mov  ah, 3eh
  mov  bx, handler
  int  21h 
  ;----------------------
   mov  ah, 3ch
  mov  cx, 0
  mov  dx, offset filename
  int  21h
  
  
  
  ;-------------------------------------


        mov     bx,     60      ;для вычисления времени от начала суток
        lea     si,     Timetables
        mov     cx,     N
@@For:
        ;вычисляем время следования
        mov     ax,     TTrains([si]).DepartureHour
        mul     bx
        add     ax,     TTrains([si]).DepartureMin
        mov     di,     ax
        mov     ax,     TTrains([si]).ArrivalHour
        mul     bx
        add     ax,     TTrains([si]).ArrivalMin
        sub     ax,     di
        ;если время в пути не превышает 17 часов - вывести информацию о рейсе
        cmp     ax,     17*60
        ja      @@Next
        ;вывод информации о рейсе
        mov     ax,     TTrains([si]).Flight
        call    Show_AX
        mov     al,     ' '
        int     29h
        push    bx
        push    cx
        mov     ah,     40h
        lea     dx,     TTrains([si]).Destination
        mov     cx,     10
        mov     bx,     1
        int     21h
        pop     cx
        pop     bx
        mov     ax,     TTrains([si]).DepartureHour
        call    ShowLeadingZero
        mov     al,     ':'
        int     29h
        mov     ax,     TTrains([si]).DepartureMin
        call    ShowLeadingZero
        mov     al,     ' '
        int     29h
        mov     ax,     TTrains([si]).ArrivalHour
        call    ShowLeadingZero
        mov     al,     ':'
        int     29h
        mov     ax,     TTrains([si]).ArrivalMin
        call    ShowLeadingZero
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
 
        ;WRITE STRING.
  mov  ah, 40h
  mov  bx, handler
  push cx
  mov  cx, 50  ;STRING LENGTH.
  mov  dx, offset TTrains([si])
  int  21h
  pop cx               

@@Next:
        ;переходим к следующему элементу
        add     si,     SIZE TTrains
        loop    @@For
 
        mov     ax,     4C00h
        int     21h
main    endp
 
; выводит число из регистра AX на экран
; входные данные:
; ax - число для отображения
Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
 
        mov     cx, 10
        xor     di, di          ; di - кол. цифр в числе
 
        ; если число в ax отрицательное, то
        ;1) напечатать '-'
        ;2) сделать ax положительным
        or      ax, ax
        jns     @@Conv
        push    ax
        mov     dx, '-'
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        pop     ax
 
        neg     ax
 
@@Conv:
        xor     dx, dx
        div     cx              ; dl = num mod 10
        add     dl, '0'         ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стэк
        or      ax, ax
        jnz     @@Conv
        ; выводим из стэка на экран
@@Show:
        pop     dx              ; dl = очередной символ
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Show_AX endp
 
ShowLeadingZero proc
        cmp     ax,     10
        jae     @@Skip
        push    ax
        mov     al,     '0'
        int     29h
        pop     ax
@@Skip:
        call    Show_AX
        ret
ShowLeadingZero endp
 ;CLOSE FILE (OR DATA WILL BE LOST).
  mov  ah, 3eh
  mov  bx, handler
  int  21h 
end     main

Последний раз редактировалось nait123321; 23.05.2017 в 17:25.
nait123321 вне форума Ответить с цитированием
Старый 23.05.2017, 08:29   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..а где вывод в файл-то?
..где буфер для вывода и перевод 'Timetables' в ASCII?
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 23.05.2017, 17:27   #3
nait123321
Пользователь
 
Регистрация: 25.04.2017
Сообщений: 13
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
..а где вывод в файл-то?
..где буфер для вывода и перевод 'Timetables' в ASCII?
Переделал, но в файлах бред хранится.
result1.txt


result2.txt

Последний раз редактировалось nait123321; 23.05.2017 в 17:30.
nait123321 вне форума Ответить с цитированием
Старый 23.05.2017, 17:31   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от nait123321 Посмотреть сообщение
Переделал, но в файлах бред хранится.
так это не текстовые файлы, там и должны хранится ДВОИЧНЫЕ данные.

Вы ещё откройте в блокноте документ MS Office и удивитесь, что там вместо букв - бред!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.05.2017, 05:37   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

nait123321, посмотри на свою структуру, которую нужно вывести в файл:
Код:
Timetables      label
        TTrains  <1,'Kiev',   07,02, 12,15>
        TTrains  <2,'Lviv',   17,02, 19,01>
        TTrains  <3,'Odessa', 04,55, 07,15>
        TTrains  <4,'Moscow', 01,33, 11,22>
        TTrains  <5,'Paris',  02,27, 22,09>
        TTrains  <6,'Berlin', 05,43, 15,31>
ASCII - это те, что в кавычах. Они запишутся в файл нормально.
Но тут имеются и двоичные данные, в виде чисел через запятую.
Они будут выглядеть в файле как мусор.
Вот их и нужно тебе перевести в ASCII -формат.

Процедура перевода может быть такая. Создай буфер, куда будешь сохранять данные для вывода в файл. Настрой ES:DI на этот буфер и читая числа в AL переводи их в ASCII-формат. То, что в кавычках - пропускай в таком-же виде.
Код:
hex2asc proc             ; Функция переводит числа в символы
   pusha                 ; Вход:  АХ = число, BX = система счисления
   mov   bx,10           ; Выход: в буфере
   xor   cx,cx           ;
isDiv:                   ;
   xor   dx,dx           ;
   div   bx              ;
   push  dx              ;
   inc   cx              ;
   or    ax,ax           ;
   jnz   isDiv           ;
isOut:                   ;
   pop   ax              ;
   add   al,30h          ; число --> в ASCII символ
   stosb                 ; сохранить в буфере по адресу ES:DI (di+1)
;   int   29h             ; раскоментируй, если нужен вывод на экран.
   loop  isOut           ;
   popa                  ;
ret                      ;
hex2asc endp
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 24.05.2017 в 05:40.
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись структуры в файл Alexey! Visual C++ 2 14.11.2016 07:39
с++. Запись структуры в файл PotatoCaptain Помощь студентам 4 23.01.2012 09:58
Запись структуры в файл. Farrel Общие вопросы C/C++ 4 12.04.2011 20:32
Запись структуры в файл Error_kpi Общие вопросы C/C++ 8 28.12.2010 20:03
Запись структуры в файл. ssi Помощь студентам 0 10.04.2010 07:38