Проверка элемента структуры, а потом вывод - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, 3 день думаю над задачей:
Сформировать записи, которые содержат информацию о N поездов, отправляющихся с вокзала станции Хмельницкий (номер поезда, станция назначения, время отправления, время прибытия). Напечатать информацию о поездах, время в пути которых не превышает 17 часов.
Гуглил, но там код связки С с ASM. А из учебников просто пример объявления структуры. Вот что пока что есть:
masm
model   small
stack   256
.586P
trains STRUCT           ; тип данных СТРУКТУРА с именем DATE1 
number db ?      ; имя первого поля структуры 
station db ?      ; имя второго поля структуры 
v db ?      ; имя третьего поля структуры 
p db ?      ; имя четвертого поля структуры 
trains ENDS 
 
.data
max db 0
    
    train1 trains <1,"Kiev",12,18>
    
    train2 trains <1,"Lviv",8,10>
    
    train3 trains <1,"Odessa",4,22>
        
    .code   
main:   
    mov ax @data
    mov ds, ax
    
    xor dx,dx
    mov bx,3
    
    lea si,train1

    print:
    xor ch, ch
    mov bx, 1
    mov ah, 40h
    int 21h

exit:
    mov ax, 4c00h
    int 21h
end main
Прошу помощи.

Решение задачи: «Проверка элемента структуры, а потом вывод»

textual
Листинг программы
.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)
 
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        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
 
@@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
 
end     main

Объяснение кода листинга программы

  1. Объявляется структура TTrains с полями Flight, Destination, DepartureHour, DepartureMin, ArrivalHour, ArrivalMin.
  2. Создается метка Timetables.
  3. Заполняются данные о поездах в структуру TTrains.
  4. Вычисляется количество элементов в Timetables и сохраняется в переменной N.
  5. В процедуре main инициализируются регистры и указатели для цикла.
  6. В цикле проверяется время в пути каждого поезда.
  7. Если время в пути не превышает 17 часов, то выводится информация о рейсе (номер, станция назначения, время отправления и время прибытия) с использованием процедур Show_AX и ShowLeadingZero.
  8. Происходит переход к следующему элементу и повторение цикла.
  9. Программа завершается с помощью команд mov ax, 4C00h и int 21h.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы