Проверка элемента структуры, а потом вывод - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д