Проверка элемента структуры, а потом вывод - Assembler
Формулировка задачи:
Здравствуйте, 3 день думаю над задачей:
Гуглил, но там код связки С с ASM. А из учебников просто пример объявления структуры.
Вот что пока что есть:
Прошу помощи.
Сформировать записи, которые содержат информацию о N поездов, отправляющихся с вокзала станции Хмельницкий (номер поезда, станция назначения, время отправления, время прибытия).
Напечатать информацию о поездах, время в пути которых не превышает 17 часов.
Листинг программы
- 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
Объяснение кода листинга программы
- Объявляется структура
TTrains
с полямиFlight
,Destination
,DepartureHour
,DepartureMin
,ArrivalHour
,ArrivalMin
. - Создается метка
Timetables
. - Заполняются данные о поездах в структуру
TTrains
. - Вычисляется количество элементов в
Timetables
и сохраняется в переменнойN
. - В процедуре
main
инициализируются регистры и указатели для цикла. - В цикле проверяется время в пути каждого поезда.
- Если время в пути не превышает 17 часов, то выводится информация о рейсе (номер, станция назначения, время отправления и время прибытия) с использованием процедур
Show_AX
иShowLeadingZero
. - Происходит переход к следующему элементу и повторение цикла.
- Программа завершается с помощью команд
mov ax, 4C00h
иint 21h
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д