LINUX.ORG.RU

Помогите решить задачу на Assembler

 


0

1

Задание:

Создать массив структур mas_sotr2 worker 7 dup (<>). Инициализировать массив структур в программе. На экран выдать сообщение в окне MessageBoxA. Сообщение должно содержать все данные структуры для самого старшего сотрудника.



Последнее исправление: Dotcom (всего исправлений: 2)

Hint: модераторы могут переносить темы, не надо их плодить.

И ты таки ищешь кого-нибудь, кто за тебя твоё задание выполнит или пытаешься сам разобраться?

Если первое, то тему я тебе перенесу. Если второе, то выкладывай, что уже достиг и где ты что понять не можешь. За просто так никто за тебя думать не будет.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 2)

MessageBoxA

я смотрю, сессия скоро?

уже сказали, в job

а лучше на винфак

false ★★★★★
()
Последнее исправление: false (всего исправлений: 1)

Если нужно сделать всё за тебя, то сколько готов заплатить за работу?
Если пытаешь сам всё сделать, но где-то «забуксовал», то выкладывай что сделал, что пытаешься сделать, что не получается.

blackst0ne ★★★★★
()

Ля... Задроты добрались и до преподавания.

Лекции, конечно, прогуливать было не надо. Ну да хрен с тобой...

1. Такого понятия как структура не существует в рантайме. Если брать C, то выражения вида foo.bar является более удобной записью (bar_t) *(foo_ptr + bar_ofs), где bar_t — тип поля bar, foo_ptr — адерс начала структуры foo, bar_ofs — смещение относительно начала структуры foo.

2. Поскольку, ты не удосужился огласить вводную целиком, будем примеры брать с потолка. Положим у нас есть структура работника типа фамилия — имя — отчетство — табельный номер. У нас два принципиальных пути.

Мы можем определить нашу структуру как кортеж указателей, т.е.первое слово — указатель на 0-терминированную строку с фамилией, второе слово — указатель на строку с именем и т.д. Табельный номер можно оформлять и так и сяк... Но я бы оформил тоже как указатель, с целью конкретно потролить преподавателя-задрота.

Мы можем поступить по-другому. От балды задать размер полей нашей структуры. Тогда она будет являть собой кортеж например 50 байт — фамилия, 20 — имя, 30 — отчество, 4 — табельный номер.

Расписывать преимущества и недостатки обозначенных подходов мне лень. Не маленький, сообразишь чай. Но, лично я бы выбрал подход с указателями, даже не смотря на траходром с их разыменовыванием. Во-первых, текстовая строка — это нихрена не массив байт, man Unicode. Во-вторых, нужно же показать преподавателю что прикладные задачи на ассемблере решают только такие мудаки как он сам.

3. С массивами — все то же самое. Можно сделать кортеж указателей, а можно и кортеж структур.

Как видно из вышеперечисленного, «массив структур» можно реализовать ажно четырьмя способами. Если мы выбрали подход «указателями», то чтобы получить поля имя второго элемента «массива», то: а) рассчитываем смещение относительно начала кортежа указателей (в нашем случае 1*размер слова); б) разыменовываем указатель, теперь у нас есть адрес начала нашей «структуры»; в) рассчитываем смежение относительно начала нашей «структуры»; г) получаем адрес нашей строки с именем сотрудника.

4. С нахождением максимума все просто. Для начала нужно определить некий критерий старшинства. Его проще оформить в виде отдельной процедуры. На вход она будет принимать указатель на структуру А и структуру B, а возвращать A больше B, A меньше B, A равно B. После чего пользуемся стандартным алгоритмом нахождения максимума.

5. С формированием сообщения все гораздо прикольнее. За одно только это препода нужно заставить мыть сортиры, что б не корчил из себя. Задача проста: а) расчитываем размер нужного буфера: размер Ф, И и О плюс размер *строкового* представления табельного номера, плюс размер всех разделителей; б) выделяем буфер (не забываем, что мы работаем с 0-терминированными строками); в) формируем буфер; в) передаем его в MessageBox, ясен пень, нулей кроме так в конце буфера быть не должно, т.к. она жрет 0-терминированные строки.

Лично я бы решил эту часть на C, а потом бы все слинковал. Чтобы у препода не было повода для вони, использовал бы юникодовские версии WINAPI, а в сишной части заюзал бы фундаментальную библиотечку ICU.

ЗЫ: Использую не очень употребительное слово «кортеж», чтобы лишний раз подчеркнуть что мы работаем с буферами фиксированного размера. Наверное лучше было бы говорить «вектор» (хотя те же яйца по сути), но это слово перегружено, в отличие от.

Macil ★★★★★
()
Ответ на: комментарий от Macil

Открой для себя flatasm, такая портянка для тупенького студента, ты троллиш его не хуже препода.

anonymous
()
Ответ на: комментарий от blackst0ne

Удивительно, насколько ты не уважаешь собственное время.

Слепая десятипальцевая печать. Слышал про такое?

Macil ★★★★★
()
Ответ на: комментарий от Macil

Еще пара таких портянок и можно делать автобота для разговора с подобиями ТС.

baverman ★★★
()

Если мне надо что-то большое написать на ассемблере и это не требует (а иногда даже когда требует) специальных видов инструкций, то блин я сначала наваяю на С, скомпилирую gcc (или llvm) с -S а уж потом доведу до совершенством выпиливая лишнее. И не важно как называется процессор. Или у вас все «по приличному» сначала ассемблер, потом C?

io ★★
()

MessageBoxA

Dotcom

ты сайтом ошибся, дружок.

nanoolinux ★★★★
()
Ответ на: комментарий от Macil

Слепая десятипальцевая печать

Я не только слышал, но и умею. йцукен/dvorak. Но всё равно не писал такой простыни бы.

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

dvorak

Хм, я почему-то тоже :) «программерский» вариант...

Macil ★★★★★
()
Ответ на: комментарий от Macil

Схорони как пасту и тыкай в неё носом в последующем.

Dark_SavanT ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.