0 / 0 / 0
Регистрация: 19.04.2017
Сообщений: 1
1
FASM

Структура Printer с полями и массив C типа структуры

19.04.2017, 17:05. Показов 807. Ответов 2
Метки нет (Все метки)

помогите пожалуйста с программой на ассемблере, выдает ошибку
Дана структура Printer с полями: наименование, тип принтера, вид печати (ч/б или цветной), ресурс картриджа и массив C типа структуры, где собрана информация о 10 принтерах. Записать в регистр BX количество струйных цветных принтеров, а в регистр DX - количество принтеров, ресурс картриджа которых > 1000 страниц.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
include 'macro\struct.inc'
struct Printer
N db 20 dup(?)
T db 30 dup(?)
p dw 10 dup(?)
r dw ?
ends  
;array Printer 10 dup (?)      
;array_ Printer
<'HP','laser','ch/b',5000>,<'Epson','jet','color',2000>,<'Canon','jet','ch/b',1000>,<'HP','laser', 'color',3500>,<'Epson','laser','ch/b',6000>,<'HP',' jet', 'color',3500>,<'Epson','jet', 'color',1000>,<'Epson','laser', 'ch/b',5000>,<'Canon',' jet', 'color',1500>,<'Canon', 'jet', 'ch/b',6500>
use16           
org 100h        
mov bp,S    
mov cx,10   
mov dx,0       
lp:
    lea di,[bp+ Printer.r]  
    cmp word [di],1000  
    ja incdex
    jl next 
incdex: 
inc dx  
next:
        add bp,sizeof. Printer  
loop lp 
mov cx,10   
mov bx,0       
lp:
    lea di,[bp+ Printer.T]  
    cmp word [di], 'jet'    
    je greater
    jne next
greater: 
lea di,[bp+ Printer.p]  
cmp word [di], 'color'  
        je incdex
        jne next    
incdex: 
inc bx  
next:
        add bp,sizeof. Printer  
loop lp     
ret     
 
C   Printer 'HP','laser','ch/b' ,5000
C1   Printer 'Epson','jet','color',2000
C2 Printer 'Canon','jet','ch/b',1000
C3 Printer 'HP','laser', 'color',3500
C4   Printer 'Epson','laser','ch/b',6000
C5   Printer 'HP',' jet', 'color',3500
C6   Printer 'Epson','jet', 'color',1000
C7 Printer 'Epson','laser', 'ch/b',5000
C8 Printer 'Canon',' jet', 'color',1500
C9 Printer 'Canon', 'jet', 'ch/b',6500
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2017, 17:05
Ответы с готовыми решениями:

В текстовом файле структура – информация о компьютерах. Структура с полями: название, стоимость.
Ребят, помогите пожалуйста, 29 июня экзамен по &quot;Основы программирования&quot;,кто сколько сможет сделать...

Объявить и определить класс с динамическими полями: двумерный числовой массив вещественного типа
Объявить и определить класс с динамическими полями: двумерный числовой массив вещественного типа....

Объявить локальный массив типа структура
Чтобы глобально выделить место под например тройную структуру достаточно прописать вот так ...

Как создать динамически расширяемый массив объектов пользовательского типа (структура User)?
Здравствуйте, нужна ваша помощь с структурой ... Bот у меня пользователей при регистрации может...

2
Эксперт Hardware
Эксперт Hardware
5408 / 1949 / 359
Регистрация: 29.07.2014
Сообщений: 2,865
Записей в блоге: 4
20.04.2017, 14:18 2
Цитата Сообщение от Nadya23 Посмотреть сообщение
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
lp:
   lea   di,[bp+ Printer.T] 
   cmp   word [di], 'jet' 
   je    greater
   jne   next
greater: 
   lea   di,[bp+ Printer.p] 
   cmp   word [di], 'color' 
   je    incdex
   jne   next 
incdex: 
   inc   bx 
next:
   add   bp,sizeof. Printer 
   loop  lp
Так ты ничё не найдёшь, т.к. в операции(CMP) разная длина операндов.
'CMP WORD' проверит только первые-две буквы слова,
//например: 'je' (без t), или 'co' (без lor).
И вообще твой код FASM не собирает - ошибок много..

Как вариант, чтобы не искать подстроку-в-строке (в твоём случае заранее известную 'jet color'), можно просто снять с неё хэш-сумму, и проверять все строки на соответствие. Причём структуру я-бы вообще убрал и собрал-бы все данные в одну таблицу, выровнив поля по самому-длинному слову, например так:
Assembler
1
2
3
4
5
6
7
8
9
10
table   db   'HP     laser  ch/b '
        dw  5000
        db   'Epson  jet    color'
        dw  2000
        ;....
 
; что соответствует виду:
;-------------------------
     'HP     laser  ch/b '
     'Epson  jet    color'
Исходная константа(HASH) в секции данных вычисляется так (с пробелами):
Assembler
1
hash     =   'j'+'e'+'t'+' '+' '+' '+' '+'c'+'o'+'l'+'o'+'r'
0
Эксперт Hardware
Эксперт Hardware
5408 / 1949 / 359
Регистрация: 29.07.2014
Сообщений: 2,865
Записей в блоге: 4
26.04.2017, 05:23 3
Nadya23, так и ничего не поняла видимо. Всё готовенькое подавай вам..
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
org   100h
jmp   start
; Таблица с данными
;----------------------------------
table   db   'HP     laser  ch/b '
        dw  5000
        db   'Epson  jet    color'
        dw  2000
        db   'Canon  jet    ch/b '
        dw  1000
        db   'HP     laser  color'
        dw  3500
        db   'Epson  laser  ch/b '
        dw  6000
        db   'HP     jet    color'
        dw  3500
        db   'Epson  jet    color'
        dw  1000
        db   'Epson  laser  ch/b '
        dw  5000
        db   'Canon  jet    color'
        dw  1500
        db   'Canon  jet    ch/b '
        dw  6500
; Константы для перемещения в таблице
;----------------------------------------------------------------------
oneWord   =    7        ; длина первого поля в байтах (Epson  )
sheets    =    19       ; смещение 'ресурса картриджа' от начала строки
count     =    10       ; элементов в таблице
hashLen   =    12       ; символов в хеш-сумме
hash      =    'j'+'e'+'t'+' '+' '+' '+' '+'c'+'o'+'l'+'o'+'r'
                        ; ^^^ получаем: hash = 03E2h
                        ; ...(и не надо проверять всю строку по-символьно)
 
; Точка входа
;-------------
start:  mov   si,table         ; SI = адрес начала таблицы
        add   si,oneWord       ;    ..без первого слова
        mov   cx,count         ; СХ = элементов в таблице (всего строк)
 
;//==== Ищем в таблице строку: 'JET COLOR'
        xor   ax,ax            ; АХ = 0
        xor   bx,bx            ; ВХ = счётчик найденых
@fullCalculate:
        xor   dx,dx            ; DX будет хэш-сумма
        mov   bp,hashLen       ; BP = символов для получения хэш-суммы
@getHash:
        lodsb                  ; AL = очередной байт из DS:SI
        add   dx,ax            ; считаем 2-байтный хэш в DX..
        dec   bp               ; всё посчитали?
        jnz   @getHash         ; нет - продолжить..
 
        cmp   dx,hash          ; наш клиент? (сравнить получившийся хэш с константой)
        jne   @01              ; нет!
        inc   bx               ; иначе: счётчик +1
@01:    add   si,(oneWord+2)   ; переходим на сл.строку
        loop  @fullCalculate   ; повторить СХ-раз...
 
        mov   ax,bx    ;<------; Выводим результат(ВХ) на экран!
        call  Print            ; Зовём процедуру...
 
        mov   al,10            ; __<- перевод строки
        int   29h              ;
 
;//==== Ищем ресурс картриджа >1000 листов
        mov   si,table         ;
        add   si,sheets        ; SI = адрес первого значения в таблице
        mov   cx,count         ; всего значений
        xor   dx,dx            ; обнулим счётчик найденых
@getSheets:
        lodsw                  ; берём в АХ очередное значение
        cmp   ax,1000          ;
        jle   @02              ; ..если меньше-равно
        inc   dx               ; иначе: счётчик +1
@02:    add   si,sheets        ; сл.значение в таблице
        loop  @getSheets       ; мотаем СХ-раз..
 
        mov   ax,dx    ;<------; Выводим результат(DХ) на экран!
        call  Print            ;
 
;//==== Выход в DOS по клавише.  На экране: 04, 08
        xor   ax,ax            ;
        int   16h              ;
        int   20h              ;
;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
;"""""" ПРОЦЕДУРА =PRINT= """"""
; на входе требует АХ = двузначное число
;----------------------------------------
Print:  aam                    ;
        add   ax,3030h         ;
        xchg  ah,al            ;
        int   29h              ;
        xchg  ah,al            ;
        int   29h              ;
retn                           ;
;-------8<------------8<--------
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.04.2017, 05:23
Помогаю со студенческими работами здесь

Структура с полями
Помогите пожалуйста, никак не могу реализовать эту программу((( Запись о товаре на складе...

Структура с битовыми полями
Написать программу, которая реализует сохранение в структуре с битовыми полями времени (часы,...

Массив Структуры данных, проблемы с выводом переменных типа char
Писать не мастер, суть проблемы такова, есть задание (по учебе если что) − Описать структуру с...

Структура со сложными полями не читается
Есть тип-структура с различными полями - юнионами и структурами. Но почему-то в исходной форме...

Структура Военкомат с битовыми полями
Разработайте структуру, используя битовые поля для обозначения логических (битовых) значений....

Задана структура со следующими полями:
Имя,Фамилия,год рождения,номер 1. Фильтровать несовершенолетних 2. Сортировать все записи по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru