Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Assembler

Автор: MeDveD3A9l
Дата сообщения: 20.09.2009 16:55
Помогите пожалуйста с задачами)))) скоро экзамен!!!! Буду очень благодарен)

1. С клавиатуры вводится строка, содержащая прописные и строчные буквы. Выбрать из строки прописные буквы и вывести их на экран.

2. Даны две строки. Необходимо символы, стоящие на четных позициях первой строки, заменить символами, стоящими на четных позициях второй строки и наоборот. Результат вывести на экран.
Автор: akaGM
Дата сообщения: 20.09.2009 17:51
MeDveD3A9l
а что ты сам написал, где непонятки?
ведь экзамен по ассемблеру не продавцы и таджики-дворники сдают...
Автор: bomzzz
Дата сообщения: 20.09.2009 20:57
от сесси до сессии живут студенты весело - все в последние три дня делается. хотя конечно странно если ассемблер то специальное образование должно быть
Автор: akaGM
Дата сообщения: 21.09.2009 12:40
bomzzz

Цитата:
специальное образование должно быть

вернее он это спецальное образование только получает...
он будет программистом!
Автор: bomzzz
Дата сообщения: 21.09.2009 16:44
никто не может на пальцах объяснить как запросы идут при создании окна - пытаюсь дебугировать программу и все ранвоне могу понять, что кого вызывает и как месаги обрабатываются. английский не настолько хорошо знаю - видимо какие то ньюансы не понял, перевод дебильный, а нормальной статейки не могу найти. все ограничиваются однотипными штампами.
Автор: Avenger2009
Дата сообщения: 29.09.2009 00:39
Помоги пожалуйста с задачками по ассму! пожалуйста
1)Составить программу на языке высокого уровня (Pascal, C++) с использованием ASM-вставок или подпрограмм. На Asm написать ввод-вывод или обработку массива. Найти обратную матрицу.
Конкретно нужна ассемблерная вставка для обработки массива для нахождения обратной матрицы))
2)Создать 32-х разрядное приложение – стандартное окно, которое является видимым по умолчанию и его граница является «тонкой», имеющее системное меню в строке заголовка и вертикальную полосу прокрутки. Содержимое диалогового окна должно быть следующим:
•    3 флажка (checkbox);
•    1 список (list);
•    1 обычная кнопка (button).
При выборе флажка в список добавляется соответствующая запись со словом “yes”, а при его отключении флажка в список добавляется соответствующая запись со словом “no”. Если была нажата обычная кнопка список очищается.

Огромное спасибо ! Очень помощь нужна
Автор: bomzzz
Дата сообщения: 29.09.2009 00:52
врядли кто нибудь будет такую чушь писать - если бы у тебя было что то и не работало....
Автор: akaGM
Дата сообщения: 29.09.2009 10:57
Avenger2009
запрос на курсовые и дипломы для "программистов" на этом форуме в другом месте, вот здесь, например...
Автор: bomzzz
Дата сообщения: 29.09.2009 18:35
люди че у меня не работают ползунки дурацкие? уже перепробовал все стили

Автор: Lyrik
Дата сообщения: 29.09.2009 23:29
bomzzz
ну а ты как-то обрабатываешь их? если ты пишешь на чистом апи, то ты как бы сам заботишься об этом
Автор: bomzzz
Дата сообщения: 30.09.2009 01:10
чтож это зааползунки такие? ну ладно подождем, доберусь и до этого. а какое они сообщение посылают???
Lyrik
а как от чужого окна сообщение перехватить? или это не реально? как узнать какое сообщение получается експлорер при изменении свойств папки когда он обновляет свою конфигурацию без перезагрузки????
хендл получил рабочего стола - и как бы написал чтоб сообщения получались для этого хендла, ну и нолики подряд идут. может че неправильно было.
Автор: Lyrik
Дата сообщения: 30.09.2009 12:46
bomzzz

Цитата:
чтож это зааползунки такие? ну ладно подождем, доберусь и до этого. а какое они сообщение посылают???

при создании окна задайте стили WS_VSCROLL и WS_HSCROLL. потом в цикле обработке сообщений виндовс обрабатывайте WM_VSCROLL и WM_HSCROLL. более детально - как всегда в мсдн.

Цитата:
а как от чужого окна сообщение перехватить? или это не реально?

воспользуйте утилитой spy++, которая входит в комплект с визуал студио. там узнаете необходимое сообщение для интересующего окна.

Цитата:
хендл получил рабочего стола - и как бы написал чтоб сообщения получались для этого хендла, ну и нолики подряд идут. может че неправильно было.

может и так. здесь не телепаты. привидите, пожалуйста, код. посмотрим и постараемся найти ошибку.
Автор: bomzzz
Дата сообщения: 30.09.2009 12:57
да я так сляпал на ходу - не сохранился код. с визуал студио ну надо искать ставить пробовать. сделаим.

посоветуй пожалуйста книгу хорошую по MASM-у- чета ниче хорошего не могу найти. воды налито или простого не объясняют совсем. седня час не мог поделить - даже смешно, вот где написано что надо edx сначала обнулить. случайно нагуглил код. и вот так продираюсь сквозь дебри. даже не книгу а что то бы типа справочника - команды и расписано детально как работает. кратко но понятно и с примером.

Цитата:

Assembler&Win32. Курс молодого бойца.
Туториалы Iczelion'а
Ассемблер под Windows для чайников
MASM32 Help


поставил SPY++ и WINID свойства окон они показывают но сообщения чета не могу найти где.
Автор: Infinite Retrieval
Дата сообщения: 30.09.2009 23:31
Подскажите, где бы попроще почитать про модель памяти в Windows, и про то, как указатели и адресса переменных в программе связанны с реальными адресами в памяти.
Автор: bomzzz
Дата сообщения: 30.09.2009 23:44

Цитата:

В 16-разрядном программировании, сегменты необходимы. К счастью, эта проблема решена в 32-разрядном Windows (95 и выше). Вы все еще имеете сегменты, но вам не нужно заботиться о них, потому, что они уже не 64kb (как в 16-разрядном), а 4 Гб. Windows вероятно даже "повиснет", если вы попытаетесь изменить один из сегментных регистров. Это называеся плоской моделью памяти (flat). Здесь есть только смещения и они теперь 32-разрядные (в диапазоне от 0 до 4,294,967,295). Каждая ячейка в памяти указывается смещением. Это действительно одно из лучших преимуществ 32-разрядного программирования над 16-разрядным. Так что теперь вы можете забыть о сегментных регистрах и сосредоточиться на других регистрах.
Но 4ГБ может и не быть на машине, поэтому эта память называется виртуальной. Мало того, каждый процесс выполняется в своём виртуальном адресном пространстве. А это значит, что никакой другой процесс не сможет получить доступ к вашей памяти. Для этого существуют специальные API функции, но для их использования нужно иметь специальные привилегии в системе. Память 0-0000FFFF не используется и служит для выявления нулевых указателей, значит, если вы укажете адрес 0000С567, то он будет считаться нулевым, удобно, не правда ли? Любая попытка обратится к этой памяти приводит к ошибке. Память выше 80000000 одна для всех процессов. В этой памяти находится код нулевого кольца, структуры ядра, код планировщика задач, код драйверов, диспетчер ввода вывода, таблица прерываний и т.д. Любая попытка обратиться к памяти ядра приводит к ошибке и к немедленному завершению приложения. Память в диапазоне 00001000-7FFFFFFF доступна для 3 кольца, т.е. для вашего приложения. С ней вы, что хотите то и делаете, в неё также грузятся Дллки.
Автор: Infinite Retrieval
Дата сообщения: 01.10.2009 00:06

Цитата:
Память в диапазоне 00001000-7FFFFFFF доступна для 3 кольца, т.е. для вашего приложения.

тобишь, например:

push EDI;
mov EDI, 1000h; (насколько я помню мы потом должны востановить входные значение всех регистров, кроме EAX, который возвращает значения)
mov EAX, 5;
mov [EDI], EAX;
pop EDI;
retn;

будет корректно работать, а вот если я обращусь не в 00001000-7FFFFFFF , то будет ошибка.

И ещё вопрос: если для каждой программы память своя, то зачем сделали доступным прямое обращение по адрессу памяти, ведь я могу взять, и перетереть всё третье кольцоЮ убив все пользовательские программы. Мне кажется, что это невозможно.
Автор: bomzzz
Дата сообщения: 01.10.2009 04:56

можешь.
Автор: Lyrik
Дата сообщения: 02.10.2009 16:00
bomzzz

Цитата:
поставил SPY++ и WINID свойства окон они показывают но сообщения чета не могу найти где.

выбираешь нужное окно - ПКМ - Messages. Потом меню Messages-Stop Logging. и потом в Messages-Logging Options ставишь все, что хочешь.

Цитата:
посоветуй пожалуйста книгу хорошую по MASM-у- чета ниче хорошего не могу найти.

книг не встречал. справка масма и гугль в помощь. а по поводу обнуления edx может просто глюк в алгоритме был. или автор где-то раньше его обнулил.
Infinite Retrieval

Цитата:
push EDI;
mov EDI, 1000h; (насколько я помню мы потом должны востановить входные значение всех регистров, кроме EAX, который возвращает значения)
mov EAX, 5;
mov [EDI], EAX;
pop EDI;
retn;
будет корректно работать

будет, если память по адресу 1000h уже выделена и дотсупна для записи. иначе - ACCESS_VIOLATION.

Цитата:
ведь я могу взять, и перетереть всё третье кольцоЮ убив все пользовательские программы

можешь, только для этого программе надо обладать необходимыми привилегиями и использовать специальные функции, т.е. разработчик знает на что идет и неумышленно тут не может получится.
Автор: Abs62
Дата сообщения: 02.10.2009 16:20

Цитата:
можешь.

Агащазблин.
Один и тот же адрес в разных приложениях смапируется на разные физические адреса, так что не всё так просто. Читайте про страничную организацию доступа к памяти. Здесь, например.

Lyrik

Цитата:
можешь, только для этого программе надо обладать необходимыми привилегиями

Доступ к страничному регистру CR3 возможен только с кольца 0.
Автор: bomzzz
Дата сообщения: 02.10.2009 17:13

Цитата:

ведь я могу взять, и перетереть всё третье кольцоЮ убив все пользовательские программы

он может
Автор: Lyrik
Дата сообщения: 02.10.2009 21:09
Abs62
А кто говорил про CR3? и, кстати, насколько мне известно CR3 у каждого процесса свой, так что все равно будет гемор с затиранием чужой памяти. для затиратия чужого адресного простраства юзаются функции VirtualProtectEx, WriteProcessMemory. под ХР раньше можно было писать прямо в физическую память из ринг-3, обладаю конечно правами админа. сейчас (после сп3) это не проверял.
Автор: Abs62
Дата сообщения: 02.10.2009 21:47
Lyrik

Цитата:
А кто говорил про CR3?

Дык, память мапируется на уровне процессора, без CR3 всё равно никуда.

Цитата:
для затиратия чужого адресного простраства юзаются функции VirtualProtectEx, WriteProcessMemory.

Упомянутые функции именно с таблицей страниц и работают, насколько я понимаю. То бишь это средства, предоставляемые ОС, естественно, имеющей доступ из-под кольца 0. А речь шла, насколько я понял, об доступе чисто ассемблерными методами, прямым заданием значений регистров.

Автор: Lyrik
Дата сообщения: 02.10.2009 22:25
Abs62

Цитата:
Упомянутые функции именно с таблицей страниц и работают, насколько я понимаю.

угу.

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

мда, значит я не так условие понял. я понял: что можно ли затереть код приложений, работающих в ринг-3 средставми ринг-3.
Автор: bomzzz
Дата сообщения: 03.10.2009 10:20
сломать дело не хитрое.

никто не может объяснить, смотрел примеры кодов с использованием 21 h прерывания для создания файлов и их записи. в примерах из одного источника все коды снабжаются вот таким пассажем:
mov ax, cs
mov ds, ax
mov es, ax
установкой сегментных регистров - так и написано в каментарии. особо смысла в этом не видно - поробовал без этого - работает, прогнал на эмуляторе, сегментные регистры сразу с таким значением. начал искать еще примеры гуглой - нашел такие где нету такого. вот на фига это мога быть????
Автор: Abs62
Дата сообщения: 03.10.2009 12:42
bomzzz
Пример есть пример. В общем случае программист сам должен следить за правильным содержанием регистров. Ему виднее, надо в данном случае менять его, или оно и так какое надо.
Автор: bomzzz
Дата сообщения: 03.10.2009 14:10
но если пример состоит только из примера использования прерывания 21 h какой смысл в него пихать что то???
Автор: Abs62
Дата сообщения: 03.10.2009 14:38
bomzzz
А для напоминания того, что необходимо сделать в общем случае. Потому и включают в него то, что в данном конкретном варианте может быть излишне.
Автор: bomzzz
Дата сообщения: 03.10.2009 16:11
ну тогда в примере так и надо было написать что это пример не прерывания а вообще...

ну то есть никакого смысла в изменении регистров нету скорее всего
Автор: Abs62
Дата сообщения: 03.10.2009 16:29
bomzzz
В описании каждой функции прерывания указано, что должно быть в регистрах. Вот и надо смотреть на это описание, на свой код, и тогда уже решать, есть смысл в изменении или нет.
Автор: bomzzz
Дата сообщения: 03.10.2009 16:37

Цитата:

org 100h
jmp start
filename db "MyFile",0
handle dd 0
start:
mov ax, cs
mov ds, ax
mov es, ax
mov cx, 0
mov ah, 3ch
mov dx, offset filename
int 21h
mov handle, ax
mov bx, handle
mov ah, 3eh
int 21h
retf

в описании прерываний как раз ни слова об этом нет. вот зачем тут регистры сегментные трогать??? которые в ком файле и так указывают на сегмент кода.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

Предыдущая тема: .NET GUI компоненты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.