Консультация № 196617
09.10.2019, 14:06
0.00 руб.
0 17 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

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

Обсуждение

давно
Посетитель
7438
7205
10.10.2019, 14:58
общий
Здравствуйте, Алина!
Ну так покажите, что там получается.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
403326
11
10.10.2019, 15:52
общий
10.10.2019, 15:55
Адресаты:
Здравствуйте!
[code lang=asm]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[/code]

Хотя бы ход мысли правильный у меня? Получается я должна заменить все 8 символов таким методом. Или хотя бы подскажите каков должен быть алгоритм решения этой задачи. Спасибо!
давно
Посетитель
7438
7205
10.10.2019, 16:06
общий
10.10.2019, 16:10
Адресаты:
Для начала, подправил код, чтобы был корректным: [code lang=asm]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'
[/code]Кстати, после буквы d идет e, а не i
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
10.10.2019, 16:09
общий
Адресаты:
Теперь о задаче: требуетя сделать "круговую перестановку с первого по восьмой символ исходной строки"
Что это значит? Полагаю, например, надо записать нулевой элемент на первое место, первый - на второе, ... шестой - на седьмое, а седьмой на нулевое.
Ведь так?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
403326
11
10.10.2019, 16:09
общий
Адресаты:
Спасибо! Я просто с телефона писала.
Я так думаю необходимо использовать loop? Или можно без циклов обойтись?
давно
Посетитель
7438
7205
10.10.2019, 16:12
общий
Адресаты:
Да как хотите... Все пути ведут в Рим... Пробуйте... Потом покажете, вместе посмотрим
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
403326
11
10.10.2019, 23:22
общий
Адресаты:
Доброй ночи!
Но ведь не может же это задание так просто решаться
Все же алгоритм для решения так и не пришел мне в голову. все же я хотела бы хоть маленькую, но подсказку

Код:
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'
давно
Посетитель
7438
7205
11.10.2019, 17:06
общий
Цитата: Алина
Но ведь не может же это задание так просто решаться
Ну почему? Задание-то простое. Почему у него должно быть сложное решение?
В принципе, правильно. И, разумеется, можно оптимизировать, например, зациклить...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
12.10.2019, 20:01
общий
Адресаты:


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


Вы это называете просто?
[code lang=asm]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[/code]

Есть вариант по "простеее"
[code lang=asm]lea si,array
lea di,array
mov cx,8-1
lodsb
rep movsb
stosb[/code]
Будет сдвигать на один символ влево.

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

Это задание на алгоритмичность, а не на знание команды MOV.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403326
11
12.10.2019, 20:17
общий
Адресаты:
Спасибо большое за помощь! Совершенству нет предела. Как все задания сделаю попробую сделать с циклом
давно
Посетитель
403326
11
12.10.2019, 20:20
общий
Адресаты:
Здравствуйте! Спасибо за комментарий)) Я выбрала направление c# поэтому думаю сильно не буду углубляться в ассемблер Если честно я даже таких команд ещё не видела
давно
Старший Модератор
31795
6196
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;
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403326
11
12.10.2019, 20:55
общий
Адресаты:
Начала читать эти команды: lea, rep и тд. Я сейчас делаю задание с арифметическими операциями. Думаю там уже посерьезней будет)))
давно
Старший Модератор
31795
6196
12.10.2019, 21:11
общий
12.10.2019, 21:12
Адресаты:
Цитата: Алина
Думаю там уже посерьезней будет

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

Это много проще, чем "куча" функций в "куче" импорта в шарп.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403326
11
12.10.2019, 21:47
общий
Адресаты:
Разбираться в том что мне не пригодится не очень хочется. Да, почти все говорят что ассемблер это основа, но ведь много программистов которые его не знают и занимаются программированием. Конечно, процессор это все умеет делать, но дело-то в том что мне необходимо указать ему как и что делать, то есть необходимо прочитать литературу понять её, а это занимает много времени. И я заметила, что литературы и каких-то алгоритмов по решению задач в интернете много по языкам высокого уровня, а вот с ассемблерам информации почти нет. На самом деле мой уровень с# это небольшие программы с привязанной базой данных sql. Чувствую, что сейчас в меня тапки полетят, но на данный момент это вот так
давно
Старший Модератор
31795
6196
12.10.2019, 22:52
общий
Адресаты:
Цитата: Алина
Разбираться в том что мне не пригодится не очень хочется.

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

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


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

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

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

Но вся проблема, что все DLL-ки с базавыми функциями, которые дает ОСь, написаны на С.

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


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

Ну нет у меня тапков, я в кедах.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
19.10.2019, 00:44
общий
это ответ
Здравствуйте, Алина!
Переведу программу, которая получилась
после обсуждения в мини-форуме.
Восемь первых символов массива циклически сдвигается влево на один символ.
[code lang=asm]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'[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа