Проверка элемента структуры, а потом вывод - 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.