14 / 14 / 11
Регистрация: 14.11.2016
Сообщений: 284

Вычисление количества элементов в массиве. Паскаль + ассемблерная вставка

27.04.2017, 19:09. Показов 1556. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Необходимо написать программу на языке Pascal, обработку данных (в том числе циклы, если они необходимы) осуществить в ассемблерной вставке.

Написать программу, вычисляющую количество элементов в массиве до первого нулевого элемента, в случае если нулевого элемента нет, должно возвращаться количество элементов в массиве.

Помогите пожалуйста, очень прошу
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.04.2017, 19:09
Ответы с готовыми решениями:

ассемблерная вставка в Delphi Циклический сдвиг элементов в массиве.
задание: написать ассемблерную вставку для Delphi программы циклический сдвиг элементов в массиве.

Количество элементов в массиве до первого нулевого элемента (Ассемблерная вставка в коде pascal)
Задание такое: Написать программу, вычисляющую количество элементов в массиве до первого нулевого элемента, в случае если нулевого...

Ассемблерная вставка в паскаль (вычислить значение выражения)
программа вычисляет выражение X = (((a+b)*(c-d))/K)+10 (точнее кусок проги что внутри) но в строке mul ax,bx вибиває ошибку "Invalid...

9
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6765 / 2010 / 233
Регистрация: 14.12.2014
Сообщений: 4,232
Записей в блоге: 12
27.04.2017, 21:26
Лучший ответ Сообщение было отмечено KatrinLuxury как решение

Решение

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
const
  N = 100;
type
  TArr = array [1..N] of Integer;
var
  Arr: TArr;
 
function GetArr(A: TArr): Integer; assembler;
asm
  cld
  mov di,word ptr [A]
  mov dx,N
  mov cx,dx
  xor ax,ax
  repne scasw
  jne @@nodec
  dec dx
@@nodec:
  sub dx,cx
  mov ax,dx
end;
 
var i: Integer;
begin
  for i := 1 to N do
    {if i = 87+1 then Arr[i] := 0
    else} Arr[i] := i*10;
  WriteLn(GetArr(Arr));
end.
2
3408 / 1827 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
28.04.2017, 11:51
Jin X, в данном коде это не существенно, но на будущее.
1)Паскаль генерирует код в моделях памяти Huge или Large, т.е. несколько сегментов кода и возможно несколько сегментов данных.
2)Переменная передается как параметр или как значение. В любом случае передается указатель сегмент : смещение.
3)Различия начинаются в генерации кода:
-значение(нет var в описании переменной)
Assembler
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
seg000:0000 sub_10000       proc near
seg000:0000 
seg000:0000 var_CC      = word ptr -0CCh
seg000:0000 var_CA      = byte ptr -0CAh
seg000:0000 var_2       = word ptr -2
seg000:0000 arg_0       = dword ptr  4
seg000:0000 
seg000:0000         push    bp
seg000:0001         mov     bp, sp
seg000:0003         mov     ax, 0CCh ; 'М'
seg000:0006         call    @__StackCheck$q4Word ; Stack overflow check (AX)
seg000:000B         sub     sp, 0CCh
seg000:000F         mov     bx, ss
seg000:0011         mov     es, bx
seg000:0013         mov     bx, ds
seg000:0015         cld
seg000:0016         lea     di, [bp+var_CA]
seg000:001A         lds     si, [bp+arg_0]
seg000:001D         mov     cx, 0C8h ; 'И'
seg000:0020         repe movsb
seg000:0022         mov     ds, bx
seg000:0024         mov     [bp+var_CC], 1
seg000:002A 
seg000:002A loc_1002A:
seg000:002A         mov     di, [bp+var_CC]
seg000:002E         shl     di, 1
seg000:0030         cmp     [bp+di+var_CC], 0
-переменная(есть var в описании переменной)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
seg000:0000 sub_10000       proc near
seg000:0000 
seg000:0000 var_4       = word ptr -4
seg000:0000 var_2       = word ptr -2
seg000:0000 arg_0       = dword ptr  4
seg000:0000 
seg000:0000         push    bp
seg000:0001         mov     bp, sp
seg000:0003         mov     ax, 4
seg000:0006         call    @__StackCheck$q4Word ; Stack overflow check (AX)
seg000:000B         sub     sp, 4
seg000:000E         mov     [bp+var_4], 1
seg000:0013 
seg000:0013 loc_10013:
seg000:0013         mov     ax, [bp+var_4]
seg000:0016         shl     ax, 1
seg000:0018         les     di, [bp+arg_0]
seg000:001B         add     di, ax
seg000:001D         cmp     word ptr es:[di-2], 0
в первом случае значение переменной копируется в стековый фрейм, во втором работа идет с самой переменной.
У Вас код написан для парметра-переменной и сегментные регистры не настраиваются
Assembler
11
mov di,word ptr [A]
2
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6765 / 2010 / 233
Регистрация: 14.12.2014
Сообщений: 4,232
Записей в блоге: 12
28.04.2017, 13:00
Constantin Cat, спасибо за замечание. Давно не имел дела с паскалем
Тогда надо заменить mov di,word ptr [A] на les di,A

p.s. Насколько я помню, в TP/BP нужно сохранять только DS и BP/SP, остальные регистры можно юзать свободно?
И никто не обещает DF=0 (CLD), верно?
0
3408 / 1827 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
28.04.2017, 13:32
Jin X,
Использование регистров:
Правила использования регистров в ассемблерных операторах такие же как и у External процедур или функций.

Ассемблерные операторы должны сохранять регистры:
BP SP SS DS

Ассемблерные операторы могут свободно изменять регистры:
AX BX CX DX SI DI ES Flags

При запуске встроенного ассемблера, определены значения только регистров BP, SP, SS и DS. Значения других регистров могут быть любыми.
0
14 / 14 / 11
Регистрация: 14.11.2016
Сообщений: 284
07.05.2017, 11:27  [ТС]
Jin X, А можете пожалуйста пояснить эту вставку?
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6765 / 2010 / 233
Регистрация: 14.12.2014
Сообщений: 4,232
Записей в блоге: 12
07.05.2017, 12:40
KatrinLuxury, какую именно? les di? Заносит в пару es:di значения из двойного слова по указанному адресу, т.е. адрес массива.
0
14 / 14 / 11
Регистрация: 14.11.2016
Сообщений: 284
07.05.2017, 13:01  [ТС]
Jin X, Первый раз сталкиваюсь в ассемблером в задаче, поэтому если можно, исправьте, что не так поняла
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
asm
  cld
  les di, A    {заносим в пару es:di  адрес массива}
  mov dx,N  {помещение в dx значение N}
  mov cx,dx { перемещает  данные из dx  в регистр cx}
  xor ax,ax  {обнуление ax}
  repne scasw   {?}
  jne @@nodec {если нет, прыгаем на @@nodec , если да, идем на следующую команду}
  dec dx           {уменьшаем счетчик циклов}
@@nodec:
  sub dx,cx   {вычесть dx из cx}
  mov ax,dx { перемещает  данные из dx  в регистр ax}
end;
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16355 / 7671 / 1078
Регистрация: 11.11.2010
Сообщений: 13,730
07.05.2017, 14:06
Цитата Сообщение от KatrinLuxury Посмотреть сообщение
repne scasw * {?}
KatrinLuxury,
Электронный учебник https://www.cyberforum.ru/cgi-bin/latex.cgi?\to "Глава 17. СТРОКОВЫЕ КОМАНДЫ"
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6765 / 2010 / 233
Регистрация: 14.12.2014
Сообщений: 4,232
Записей в блоге: 12
07.05.2017, 22:01
Лучший ответ Сообщение было отмечено KatrinLuxury как решение

Решение

Цитата Сообщение от KatrinLuxury Посмотреть сообщение
перемещает *данные из dx *в регистр cx
Я бы сказал "копирует значение"
Цитата Сообщение от KatrinLuxury Посмотреть сообщение
repne scasw
поиск значения ax в буфере по адресу es:di длиной cx слов (w)
Цитата Сообщение от KatrinLuxury Посмотреть сообщение
если нет, прыгаем на @@nodec , если да, идем на следующую команду
если не нашли, прыгаем на @@nodec
Цитата Сообщение от KatrinLuxury Посмотреть сообщение
уменьшаем счетчик циклов
каких циклов? просто уменьшаем dx на 1 (изначально в dx длина массива - кол-во элементов; после repne scasw в cx будет содержаться размер массива минус кол-во проверенных элементов: если элемент не найден, то 0, а если найден, то на 1 меньше нужного кол-ва, т.к. найденный элемент тоже считается... в принципе, можно заменить dec dx на inc cx – разницы нет, т.к. дальше идёт sub dx,cx)
Цитата Сообщение от KatrinLuxury Посмотреть сообщение
вычесть dx из cx
вычесть cx из dx
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.05.2017, 22:01
Помогаю со студенческими работами здесь

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

Вычисление арифметического выражения (ассемблерная вставка)
v=-3-\frac{ (x+5)(y-4)-3}{ z+3 } где z-байт, x,y,v-слова Решила сначала начать с числителя, потому что пока неуверенна в правильности...

Вычисление целочисленного арифметического выражения (Ассемблерная вставка в C++)
помогите пожалуйста написать вставку для вычисления значения следующего выражения c2-2((a·b) Mod (d+10)) - исходное выражение

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

Вычисление целочисленного арифметического выражения (Ассемблерная вставка)
Пожалуйста. Помогите. Напишите, пожалуйста, ассемблеровскую вставку (вообще не понимаю как она работает, а нужно срочно, не успею...


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

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

Новые блоги и статьи
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
Взаимодействие Python с REST API
py-thonny 27.03.2025
REST API - это архитектурный стиль взаимодействия компонентов распределённого приложения в сети. Python располагает функциональным набором инструментов для работы с REST API и основная библиотека для. . .
sshd restrictions, ssh access limitations
jigi33 26.03.2025
sshd restrictions | ssh access limitations рестрикции доступа на сервер sshd статья: https:/ / www. golinuxcloud. com/ restrict-allow-ssh-certain-users-groups-rhel
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru