Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2012, 21:53   #1
Juffin
Форумчянин
Форумчанин
 
Аватар для Juffin
 
Регистрация: 05.04.2009
Сообщений: 446
Смущение Они что, издеваются?

Нет, тема не о политике и выборах. Просто хочу поделиться с вами мозгоскручиванием, которое нам дали сегодня на контрольной. Речь в задании идет о том, что надо переписать код на NASM.
Цитата:
Выписать директивы и команды, эквивалентные следующему фрагменту на языке Си (считать sizeof(short)=2)
Код:
static short c[12],**q;
...
*q=&(c[10]);
*(q[-4])++;
++*++*q;
Что вы об этом думаете ? И кто-нибудь может объяснить, что делает конструкция ++*++q?
Nobody expects Spanish Inquisition!

Последний раз редактировалось Juffin; 06.03.2012 в 22:06.
Juffin вне форума Ответить с цитированием
Старый 06.03.2012, 22:04   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

эмм, а это не работает в общем то.
указатель q не инициализирован.
да и q не являеться указателем на массив, потому q[-4] некорректное действие.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 06.03.2012 в 22:07.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.03.2012, 22:09   #3
Juffin
Форумчянин
Форумчанин
 
Аватар для Juffin
 
Регистрация: 05.04.2009
Сообщений: 446
По умолчанию

Не имеет значения, работает или нет. Надо просто транслировать на язык ассемблера. На бумаге.
Nobody expects Spanish Inquisition!
Juffin вне форума Ответить с цитированием
Старый 06.03.2012, 22:21   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

перевожу построчно(но это фасм).

Код:
;static short c[12],**q;
dw c[12];не помню как точно массивы делать
dd q

;*q=&(c[10]);
mov eax,c
add eax,20;10*sizeof(word/short)
mov ebx,q
mov [ebx],eax

;*(q[-4])++;
mov eax,q
sub eax,16
mov eax,[eax]
add [eax],4;если не ошибаюсь то идет сначало разименование, а потом инкремент.

;++*++*q, тут вроде все справо налево выходит
mov eax,q
mov eax,[eax]
add eax,4
inc [eax]
вроде так, я не гуру С, потому мог ошибиться в приоритете операций С кода.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.03.2012, 22:48   #5
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Код:
c_array db 12 dub(0)
q dd 0

lea q,[c_array+10]
inc [q-4]
inc [q] ; вот последняя конструкция меня немного смущает, там действительно ++*++*q;?
Если мне не изменяет память, то даже так это работает.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 06.03.2012, 22:52   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
lea q,[c_array+10]
не, тут не +10 нужен поидее, а +20, ибо это уже часть синтаксиса самой lea.
ну и q то не массив же, потому никак там так, через [q-4] нельзя.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.03.2012, 22:57   #7
Juffin
Форумчянин
Форумчанин
 
Аватар для Juffin
 
Регистрация: 05.04.2009
Сообщений: 446
По умолчанию

Цитата:
Сообщение от Ivan_32 Посмотреть сообщение
вот последняя конструкция меня немного смущает, там действительно ++*++*q;?
В том-то и дело, что там действительно так. И я не могу понять, как это происходит, потому что оба инкремента выполняются перед другими действиями.
Nobody expects Spanish Inquisition!
Juffin вне форума Ответить с цитированием
Старый 07.03.2012, 07:43   #8
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
++*++*q
Если мне не изменяет память, то унарные операции правоассоциативны. Тогда порядок будет такой:

1. Разыменовывается q..
2. Потом инкриминируется.
3. Снова разыменовывается.
4. Вновь инкриминируется
Вадим Мошев вне форума Ответить с цитированием
Старый 07.03.2012, 08:22   #9
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Код:
array_c dw 12 dup(0)
q 		dw 0

lea ax,[array_c + 20]
mov [q],ax 
inc [ax - 8]
mov ax,[ax]
inc ax
mov ax,[ax]
inc ax
По моему этот код будет вполне компилируемым.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 07.03.2012, 13:33   #10
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

[ЧСВ]Скажите, я был прав в своём предыдущем посте?[/ЧСВ]
Вадим Мошев вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нарисовать несколько окружностей, включая то, что они могут быть поверх друг друга smith732 Помощь студентам 4 19.12.2011 14:48
LGPL/BSD/GPL/MIT - что в реальности они подразумевают? Ivan_32 Свободное общение 6 10.11.2010 11:00
Подскажите как исправить отображение пузырьков в столбик, так что бы они отображались в строчку и... Harle Помощь студентам 2 12.01.2010 20:21
Они нас прослушивают... ds.Dante Свободное общение 9 04.12.2009 15:28
Что такое коды ASCII и зачем они?? Ларик Помощь студентам 2 27.01.2008 19:41