Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 21.12.2013
Сообщений: 3
1

Ассемблерная вставка: копирование содержимого массива типа char в n-раз больший массив

11.05.2014, 11:13. Показов 1155. Ответов 6
Метки нет (Все метки)

Собственно задание: Написать программу, осуществляющую копирование содержимого массива типа char в n-раз больший массив, при этом каждый элемент массива должен повторяться n-раз, т. е., например, из массива 'a', 'b', 'c', при n=3, должен быть сформирован массив 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c' Ввод-вывод массивов осуществлять в виде строк. Основную часть программы заменить ассемблерной вставкой.
Вот код на паскале:
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var
mas,mas2: string;
n,m,i,j,t: integer;
begin
t:=1;
writeln('Введите количество элементов: ');
 readln(m);
 writeln('Заполните массив из ',m,' элементов: ');
  for i:=1 to m do
   readln(mas[i]);
 writeln('n=');
  readln(n);
for i:=1 to m do
   for j:=1 to n do
    begin
      mas2[t]:=mas[i];
       t:=t+1;
    end;
    for i:=1 to m*n do
     write(mas2[i],' ');
   readln;
end.

Собственно вопрос как в ассемблерной вставке обратиться к элементам массива?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
 asm
   mov ax, i
    @M: mov bx, j
        @N:
            // как вот тут обратиться к элементу массива?
           inc bx
            cmp bx, n
           jnz @N
    inc ax
     cmp ax,m
    jnz @M
  end;
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2014, 11:13
Ответы с готовыми решениями:

Из массива A скопировать в массив B элементы, величины которых лежат в диапазоне [-3;4] (C + ассемблерная вставка)
Здравствуйте. Помогите, пожалуйста, написать код на си с ассемблерной вставкой к заданию: Дан...

Копирование в текстовый файл из потока fstream массива типа char
Всем привет! У меня довольно простой, но очень важный для меня вопрос, ответ на который пока не...

Сформировать массив типа bool из массива типа char
Доброго времени суток! После ввода элементов массива вылазит ошибка "Необработанное исключение:...

Преобразование массива типа char в массив типа float
Хорош ли следующий способ преобразования массива типа char в массив типа float? #include...

6
0 / 0 / 0
Регистрация: 21.12.2013
Сообщений: 3
04.01.2017, 14:57  [ТС] 2
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var
mas: string;
MAS2:array[1..256]OF CHAR;
n,m: integer;
begin
   WRITE('Введите строку: ');
   READ(MAS);
   M:=LENGTH(MAS);
 writeln('n=');
  read(n);
    ASM
            //XOR EAX,EAX
            XOR EDX,EDX
            MOV ECX,1
        @1: MOV AL,BYTE PTR [MAS+ECX]
            MOV EBX,1
        @2: MOV BYTE PTR [MAS2+EDX],AL
            INC EDX
            INC BX
            CMP BX,N
            JLE @2
            INC CX
            CMP CX,M
            JLE @1
    END;
   for i:=1 to m*n do
     write(mas2[i]);
   readln;
   readln;
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
6177 / 3701 / 2560
Регистрация: 22.11.2013
Сообщений: 10,584
Записей в блоге: 1
05.01.2017, 12:06 3
Сильно сомневаюсь, что встроенный ассемблер 16-битного Turbo Pascal знает про расширенные регистры (edx, ecx, ebx).

Кроме того, не проще ли использовать строчные операции?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var ms, md: String;
begin
  Write('Строка: '); ReadLn(ms);
  asm
    mov  dx,ds
    mov  es,dx
    lea  di,md
    lea  si,ms
    xor  ax,ax
    lodsb
    mov  cx,ax
    mov  ah,3
    mul  ah
    stosb
    jcxz @done
@1:
    lodsb
    stosb
    stosb
    stosb
    loop @1
@done:
    mov  ds,dx
  end;
  WriteLn(md);
end.
Добавлено через 2 минуты
или
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var ms, md: String;
begin
  Write('Строка: '); ReadLn(ms);
  asm
    mov  dx,ds
    mov  es,dx
    lea  di,md
    lea  si,ms
    xor  ax,ax
    lodsb
    mov  cx,ax
    mov  ah,3
    mul  ah
    stosb
    jcxz @done
@1:
    lodsb
    mov  bx,3
    xchg bx,cx
    rep  stosb
    xchg bx,cx
    loop @1
@done:
    mov  ds,dx
  end;
  WriteLn(md);
end.
Добавлено через 17 часов 48 минут
Кстати, последний mov ds,dx -- не нужен, поскольку ds в этом фрагменте не меняется. Нужен был бы внутри процедуры, пришлось бы указатель на источник грузить как lds si,ms, на приёмник как les di,md.
1
3388 / 1808 / 487
Регистрация: 28.02.2015
Сообщений: 3,678
06.01.2017, 18:39 4
bormant,
правельнее было бы так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
var
  a,b:string;
  c,d:integer;
begin
  write('enter string:');
  readln(a);
  write('enter count:');
  readln(d);
  b:='error :(';
  asm
    push es
    push ds
    pop  es
    lea  si,a
    lea  di,b
    xor  dx,dx
    xor  ax,ax
    lodsb
    mov  cx,d
    mul  cx
    or   ah,ah
    jnz  @@02
    mov  cx,ax
    stosb
@@01:
    lodsb
    push cx
    mov  cx,d
    rep  stosb
    pop  cx
    loop @@01
@@02:
    pop  es
  end;
  write('result:',b);
  readln;
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
6177 / 3701 / 2560
Регистрация: 22.11.2013
Сообщений: 10,584
Записей в блоге: 1
06.01.2017, 21:36 5
Constantin Cat,
не совсем. Про переменную величину N проглядел, виноват.
В остальном замечания следующие:
1) сохранять ES не требуется
2) пересылка через стек медленнее, чем через регистр,
3) строки в 255 символов, незачем умножать на 16-битное d,
4) d: Byte было б в самый раз, сл-но mov cl,d; mul cl -- свободны dx, bx, в них можно хранить множитель.

Итого в сухом остатке:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var
  a, b: String;
  d: Byte;
begin
  Write('enter string: '); ReadLn(a);
  Write('enter count: '); ReadLn(d);
  b:='error :(';
  asm
    mov  dx,ds
    mov  es,dx
    lea  si,a
    lea  di,b
    xor  ax,ax
    lodsb
    mov  cl,d
    mul  cl
    or   ah,ah
    jnz  @2
    mov  cx,ax
    stosb
    xor  bx,bx
@1:
    lodsb
    xchg cx,bx
    mov  cl,d
    rep  stosb
    xchg cx,bx
    loop @1
@2:
  end;
  Write('result: ',b); ReadLn;
end.
0
3388 / 1808 / 487
Регистрация: 28.02.2015
Сообщений: 3,678
06.01.2017, 23:33 6
Цитата Сообщение от bormant Посмотреть сообщение
сохранять ES не требуется
В именно этом коде нет, а вообще - да;
Цитата Сообщение от bormant Посмотреть сообщение
пересылка через стек медленнее, чем через регистр,
в учебных программах - это не имеет значения.
Цитата Сообщение от bormant Посмотреть сообщение
строки в 255 символов, незачем умножать на 16-битное d,
Да, но в вопросе было:
Цитата Сообщение от _kaktus_ Посмотреть сообщение
массива типа char
Строка это только частный случай массива символов. Правильнее было бы получить длину строки(снова этот частный случай), выделить n-памать, скопировать и посимвольно вывести.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
6177 / 3701 / 2560
Регистрация: 22.11.2013
Сообщений: 10,584
Записей в блоге: 1
07.01.2017, 04:56 7
Constantin Cat,
При написании отдельных частей программы на языке ассемблера следует иметь в виду, что необходимо сохранить содержимое регистров ВР, SP, SS и DS. Если их необходимо изменить, то исходные значения следует запомнить, а затем восстановить. Остальные регистры можно безболезненно изменять.
ES в списке отсутствует, нет?

Про учебные задачи - отклоняется. В учебных задачах имеет значение не приобретать дурных привычек. В ассемблер пошли зачем, сэкономить такты? Вот и экономьте такты.

Про массив типа Char - отклоняется - 1) сохраняете однобайтную длину, 2) string часть условия.

Добавлено через 11 минут
Получение длины строки есть (xor ax,ax; lodsb), память под приемник выделена, ограниченв 255 байтами. Нормальные условия вполне. Проверку на выход за его пределы вы дописали.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.01.2017, 04:56

Дан массив типа char подсчитать все буквы входящие в текст 1 раз
Дан массив типа char подсчитать все буквы входящие в текст 1 раз Помогите пожалуйста! Прошу...

ассемблерная вставка, динамический массив
добрый день! pA - указатель на int _asm { mov eax, dword ptr pA mov result, eax } ...

Ассемблерная вставка и динамический массив
Здравствуйте! У меня задание: увеличить в два раза элементы массива с нечётными индексами. ...

Ассемблерная вставка и аналогичный код на С++ (массив)
Начали изучать на заочке ассемблер (до С++ ещё не дошли), лекций не было, сразу практика....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru