...
asm
{
...
}
...
Работа с масивами на Си++ с асемблерными вставками
Здраствуйте, очень нужна помощь по лабораторке. Задача: написать прогу на Visual C++ (Win32 console application) которая описывает одномерный масив з 10ти значений и выводит результат обробки. (обробка масива с помощью ассемблерных вставок). Нужно найти среднее арифметическое елементов и минимальное значение.
С чем затруднения? С синтаксисом языка или алгоритмом? Что уже есть?
проблема с ассемблерной вставкой... есть только код ввода массива на Си++. Проблема в том, что не знаю с чего начать делать, как оформить ассемблерный код.
Код:
Не?
Нужно найти среднее арифметическое елементов и минимальное значение с помощью. ассемблерного кода
А ещё sub и inc.
И магическое число 30, которое нужно отнимать.
точнее 0x30
Точнее 30h, на ассемблере же.
Ну,если вспомнить про .radix,то ни 0x,ни даже h не понадобятся…:)
Код:
pusha
xor eax,eax
mov ecx, ArrayLength
mov ebx, ArrayPtr
mov eax, [ebx]
sub eax, 30h
label1:
sub [ebx],30h
cmp [ebx], eax
ja pass
mov eax,[ebx]
pass:
inc ebx
loop label1
nop ;в eax сейчас наименьшее
xor eax,eax
mov ecx, ArrayLength
mov ebx, ArrayPtr
label2:
add eax,[ebx]
inc ebx
loop label2
idiv ArrayLength ;среднее будет в eax
popa
xor eax,eax
mov ecx, ArrayLength
mov ebx, ArrayPtr
mov eax, [ebx]
sub eax, 30h
label1:
sub [ebx],30h
cmp [ebx], eax
ja pass
mov eax,[ebx]
pass:
inc ebx
loop label1
nop ;в eax сейчас наименьшее
xor eax,eax
mov ecx, ArrayLength
mov ebx, ArrayPtr
label2:
add eax,[ebx]
inc ebx
loop label2
idiv ArrayLength ;среднее будет в eax
popa
Но тут ещё есть парочка тонкостей и нюансов с переполнением при арифметических операциях, с типом данных - целым или с плавающей точкой, ну и с оптимизацией, которые я опустил.
P.S. Может и не в тему, но посоветуйте книгу по ассемблеру... именно чтоб ассемблерные вставки в визуал си. Потому как в ВУЗе материала не дают (лектору поф на нас, не любит студентов), а дают задание и говорят делайте как хотите...
Цитата:
#include <iostream>
using namespace std;
#include <conio.h>
void fillTheArray(int*, int);
void showTheArray(int*, int);
int main()
{
int summ=0,min=0;
int a[10];
fillTheArray(a, 10);
__asm {
mov eax,a[0]
mov edx,a[0]
mov ecx,9
jmp mult
more:
mov edx,ebx
dec ecx
jmp mult
mult:
mov ebx,a[ESI+4*ecx] //это 25ая строчка
push edx
add eax,ebx
pop edx
cmp ebx,edx
jl more
loop mult
mov summ,eax
mov min, edx
}
getch();
}
void fillTheArray(int *arr, int n){
for(int i=0; i<10; i++){
cout << "Enter the " << i+1 << " array element." << endl;
cin >> arr;
}
}
void showTheArray(int *arr, int n){
cout << "Here is an array:" << endl;
for(int i=0; i<n; i++)
cout << "- " << arr << endl;
}
using namespace std;
#include <conio.h>
void fillTheArray(int*, int);
void showTheArray(int*, int);
int main()
{
int summ=0,min=0;
int a[10];
fillTheArray(a, 10);
__asm {
mov eax,a[0]
mov edx,a[0]
mov ecx,9
jmp mult
more:
mov edx,ebx
dec ecx
jmp mult
mult:
mov ebx,a[ESI+4*ecx] //это 25ая строчка
push edx
add eax,ebx
pop edx
cmp ebx,edx
jl more
loop mult
mov summ,eax
mov min, edx
}
getch();
}
void fillTheArray(int *arr, int n){
for(int i=0; i<10; i++){
cout << "Enter the " << i+1 << " array element." << endl;
cin >> arr;
}
}
void showTheArray(int *arr, int n){
cout << "Here is an array:" << endl;
for(int i=0; i<n; i++)
cout << "- " << arr << endl;
}
Ну а если поменять есх на другой регистр? edi, например.
Цитата:
именно чтоб ассемблерные вставки в визуал си
Такой книги нет, коротенький мануал ещё найдётся. П[COLOR="silver"]р[/COLOR]очти Пирогов - Ассемблер и дизассемблирование, там как раз мягкое введение.
А вот у Юрова в его Ассемблерах для ВУЗов где-то странице на 94й будет и про виды адресаций.
Ну а сам я уже про адресацию ничего не помню, но прямой перебор регистров рулит.
Цитата: Alm3n
[COLOR="silver"]прямой перебор регистров рулит
Пошто человека на путь неверный наставляешь?:)
shotokan,вместо ECX напиши EBX,и будет тебе щастье.На самом деле,использовать можно только комбинацию [EDI/ESI]+[EBP/EBX],как-то так
[COLOR="#c0c0c0"](вернее,не то чтобы только её,но это самая распространённая,остальные имеют ряд ограничений)[/COLOR]
Цитата: @pixo $oft
Пошто человека на путь неверный наставляешь?:)
Так-так, а кто в jabber сказал, что код у него нормальный, а?
Просто я книгу не открывал,вот.А про перебор регистров слова не было:p