21.10.2019, 01:56 [+3 UTC]
в нашей команде: 3 890 чел. | участники онлайн: 2 (рекорд: 21)

:: РЕГИСТРАЦИЯ

задать вопрос

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
7.77 (31.05.2019)
JS-v.1.34 | CSS-v.3.35

Общие новости:
28.04.2019, 09:13

Форум:
11.10.2019, 14:47

Последний вопрос:
21.10.2019, 00:06
Всего: 150654

Последний ответ:
20.10.2019, 20:38
Всего: 259251

Последняя рассылка:
20.10.2019, 19:45

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
02.12.2009, 08:46 »
Иванов Виктор Олегович
Огромное спасибо! Это то, что мне нужно. Я еще не работал с этим компонентом, мало знаю о нем. Вы меня очень выручили! [вопрос № 174748, ответ № 257181]
09.01.2012, 16:43 »
lamed
Большое спасибо, Андрей Владимирович! С уважением. [вопрос № 185125, ответ № 269507]
14.08.2011, 07:53 »
korsar
Спасибо за подробный ответ [вопрос № 183865, ответ № 268031]

РАЗДЕЛ • Assembler

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 438
solowey
Статус: Бакалавр
Рейтинг: 304
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 238

Перейти к консультации №:
 

Консультация онлайн # 196617
Раздел: • Assembler
Автор вопроса: Алина (Посетитель)
Отправлена: 09.10.2019, 14:06
Поступило ответов: 1

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

Дана строка из 15 символов. Разработать программу, осуществляющую круговую перестановку с первого по восьмой символ исходной строки. Пытаюсь сделать на компиляторе FASM так как учу его способ написания программ ассемблера. Заранее благодарю Вас!

Состояние: Консультация закрыта

Ответ # 278941 от Лысков Игорь Витальевич (Старший модератор)

Здравствуйте, Алина!
Переведу программу, которая получилась
после обсуждения в мини-форуме.
Восемь первых символов массива циклически сдвигается влево на один символ.

Код (Assembler) :: выделить код
Format pe console 4.0
Entry Start 
 
include 'win32a.inc'
 
Section '.text' code readable executable
Start:
lea esi,Array
lea edi,Array
mov ecx,8-1 
lodsb 
rep movsb 
stosb
Exit:
invoke ExitProcess,0
 
Section '.data' data readable writeable
Array db 'a','b','c','d','е','f','g','h','i','j','k','l','m','n','o' 
 
section '.idata' import data readable writeable
 
  library kernel,'KERNEL32.DLL' 
 
  import kernel,\
    ExitProcess,'ExitProcess'


Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 19.10.2019, 00:44

Рейтинг ответа:

+1

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 196617

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 1

= общий = | 10.10.2019, 14:58 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Здравствуйте, Алина!
Ну так покажите, что там получается.

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Алина
Посетитель

ID: 403326

# 2

= общий = | 10.10.2019, 15:52 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Здравствуйте!

Код (Assembler) :: выделить код
Format pe console
Entry start
Include ‘win32a.inc’
Section ‘.text’ code readable executable 
Start:
Mov ebx, array
Mov al, [ebx+6] ; копирую 7 элемент из массива

mov [ebx+1], al ; присваиваю значение al второму элементу массива

Exit:
Push 0
Call [exitprocess]

Section ‘.data’ data readable writeable
Array db a,b,c,d,i,f,g,h,i,j,k,l,m,n,o


Хотя бы ход мысли правильный у меня? Получается я должна заменить все 8 символов таким методом. Или хотя бы подскажите каков должен быть алгоритм решения этой задачи. Спасибо!

-----
Последнее редактирование 10.10.2019, 15:55 Лысков Игорь Витальевич (Старший модератор)

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 3

= общий = | 10.10.2019, 16:06 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Алина:

Для начала, подправил код, чтобы был корректным:

Код (Assembler) :: выделить код
Format pe console 4.0
Entry Start

include '..\..\include\win32a.inc'

Section '.text' code readable executable
Start:
Mov ebx, Array
Mov al, [ebx+6] ; копирую 7 элемент из массива 
 
mov [ebx+1], al ; присваиваю значение al второму элементу массива 
 
Exit:
invoke ExitProcess,0
 
Section '.data' data readable writeable
Array db 'a','b','c','d','е','f','g','h','i','j','k','l','m','n','o'

section '.idata' import data readable writeable
 
  library kernel,'KERNEL32.DLL'

  import kernel,\
    ExitProcess,'ExitProcess'
Кстати, после буквы d идет e, а не i

-----
Последнее редактирование 10.10.2019, 16:10 Лысков Игорь Витальевич (Старший модератор)

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 4

= общий = | 10.10.2019, 16:09 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Алина:

Теперь о задаче: требуетя сделать "круговую перестановку с первого по восьмой символ исходной строки"
Что это значит? Полагаю, например, надо записать нулевой элемент на первое место, первый - на второе, ... шестой - на седьмое, а седьмой на нулевое.
Ведь так? smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Алина
Посетитель

ID: 403326

# 5

= общий = | 10.10.2019, 16:09 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Спасибо! Я просто с телефона писала.
Я так думаю необходимо использовать loop? Или можно без циклов обойтись?

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 6

= общий = | 10.10.2019, 16:12 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Алина:

Да как хотите... Все пути ведут в Рим... Пробуйте... Потом покажете, вместе посмотрим smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Алина
Посетитель

ID: 403326

# 7

= общий = | 10.10.2019, 23:22 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Доброй ночи!
Но ведь не может же это задание так просто решаться smile
Все же алгоритм для решения так и не пришел мне в голову. все же я хотела бы хоть маленькую, но подсказку smile

Format pe console 4.0
Entry Start 
 
include 'win32a.inc'
 
Section '.text' code readable executable
Start:
Mov ebx, Array 
Mov al, [ebx] ; копирую 1 элемент из массива
mov cl, [ebx+1]
mov dl, [ebx+2]
mov bl, [ebx+3]
mov ah, [ebx+4]
mov ch, [ebx+5]
mov dh, [ebx+6]
mov bh, [ebx+8]

mov [ebx+1], al ; присваиваю значение al второму элементу массива
mov [ebx+2], cl
mov [ebx+3], dl
mov [ebx+4], bl
mov [ebx+5], ah
mov [ebx+6], ch
mov [ebx+7], dh
mov [ebx], bh

Exit:
invoke ExitProcess,0 
 
Section '.data' data readable writeable
Array db 'a','b','c','d','е','f','g','h','i','j','k','l','m','n','o' 
 
section '.idata' import data readable writeable
 
  library kernel,'KERNEL32.DLL' 
 
  import kernel,\
    ExitProcess,'ExitProcess'

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 8

= общий = | 11.10.2019, 17:06 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

© Цитата: Алина
Но ведь не может же это задание так просто решаться
Ну почему? Задание-то простое. Почему у него должно быть сложное решение? smile
В принципе, правильно. И, разумеется, можно оптимизировать, например, зациклить... smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 9

 +1 
 
= общий = | 12.10.2019, 20:01 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Алина:



© Цитата: Алина
Но ведь не может же это задание так просто решаться

smile
Вы это называете просто?
Код (Assembler) :: выделить код
Mov al, [ebx] ; копирую 1 элемент из массива
mov cl, [ebx+1]
mov dl, [ebx+2]
mov bl, [ebx+3]
mov ah, [ebx+4]
mov ch, [ebx+5]
mov dh, [ebx+6]
mov bh, [ebx+8]
mov [ebx+1], al ; присваиваю значение al второму элементу массива
mov [ebx+2], cl
mov [ebx+3], dl
mov [ebx+4], bl
mov [ebx+5], ah
mov [ebx+6], ch
mov [ebx+7], dh
mov [ebx], bh


Есть вариант по "простеее" smile
Код (Assembler) :: выделить код
lea si,array
lea di,array
mov cx,8-1
lodsb
rep movsb
stosb

Будет сдвигать на один символ влево.
smile
Этот вариант не зависит от задания, на 8-мь символов у Вас регистров хватило, а если нужно 100 или 500 символов, где взять столько регистров?

Это задание на алгоритмичность, а не на знание команды MOV.
smile

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Алина
Посетитель

ID: 403326

# 10

= общий = | 12.10.2019, 20:17 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Спасибо большое за помощь! Совершенству нет предела. Как все задания сделаю попробую сделать с циклом smile

Алина
Посетитель

ID: 403326

# 11

= общий = | 12.10.2019, 20:20 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Зенченко Константин Николаевич:

Здравствуйте! Спасибо за комментарий)) Я выбрала направление c# поэтому думаю сильно не буду углубляться в ассемблер smile Если честно я даже таких команд ещё не видела smile

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 12

= общий = | 12.10.2019, 20:49 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Алина:

Шарп-шарпом, но смысл алгоритма:
AH = [ N ];
CX = count-1
;дальше rep movsb
@@label;
AL = [N +1];
[ N ] = AL;
N = N + 1;
loop @@label;
;закончилось rep movsb
[ N ] = AH;

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Алина
Посетитель

ID: 403326

# 13

= общий = | 12.10.2019, 20:55 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Зенченко Константин Николаевич:

Начала читать эти команды: lea, rep и тд. Я сейчас делаю задание с арифметическими операциями. Думаю там уже посерьезней будет)))

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 14

= общий = | 12.10.2019, 21:11 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Алина:

© Цитата: Алина
Думаю там уже посерьезней будет

Я Вас умоляю.
Процессор умеет далать:
  • складывать два двоичных числа(в том числе +1);
  • инвертировать двоичное число и прочая логика;
  • вычитать два двоичных числа(это два первых пункта);
  • свигать двоичное число, влево вправо;
  • переходить по адресу;
  • читать-писать память в регистр.

Это много проще, чем "куча" функций в "куче" импорта в шарп.
smile

-----
Последнее редактирование 12.10.2019, 21:12 Зенченко Константин Николаевич (Старший модератор)

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Алина
Посетитель

ID: 403326

# 15

= общий = | 12.10.2019, 21:47 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Зенченко Константин Николаевич:

Разбираться в том что мне не пригодится не очень хочется. Да, почти все говорят что ассемблер это основа, но ведь много программистов которые его не знают и занимаются программированием. Конечно, процессор это все умеет делать, но дело-то в том что мне необходимо указать ему как и что делать, то есть необходимо прочитать литературу понять её, а это занимает много времени. И я заметила, что литературы и каких-то алгоритмов по решению задач в интернете много по языкам высокого уровня, а вот с ассемблерам информации почти нет. На самом деле мой уровень с# это небольшие программы с привязанной базой данных sql. Чувствую, что сейчас в меня тапки полетят, но на данный момент это вот так smile

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 16

= общий = | 12.10.2019, 22:52 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Алина:

© Цитата: Алина
Разбираться в том что мне не пригодится не очень хочется.

Вы так ничего и не поняли.(печалька)

Вот алгоритм:


Знакомый. Да?
Не важно на каком языке будет написано, он будет выводить : Привет мир.
Ассемблер дает Вам возможность, при ограниченом числе регистров(их всего раз, два и все) реализовывать любой алгоритм. Любой ЯВУ прячет от Вас эту возможность. Дизассемблированый код любого ЯВУ, показывает столько "хлама", который подключается к коду.

Все импорты в любом ЯВУ, это надстройка над базовыми функциями, которые предоставляет ОСь.

Ассемблер позволяет Вам убрать из кода этот "хлам", делать чистый алгоритм.

Но вся проблема, что все DLL-ки с базавыми функциями, которые дает ОСь, написаны на С.
smile
и каждый раз читая релизы: мы исправили баг(залатали дыру), задаюсь вопросом, а сколько добавили новых.
т.е. чем функциональней и проще код, тем сложнее добится не правильной его работы.


© Цитата: Алина
Чувствую, что сейчас в меня тапки полетят,

Ну нет у меня тапков, я в кедах.
smile

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.14993 сек.

© 2001-2019, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.77 от 31.05.2019
Версия JS: 1.34 | Версия CSS: 3.35