Программовонне трдАнон, я не понимаю ассемблер. Он меня просто ненавидит. Скажи, где я обосрался? Я не пойму почему все, кроме первого элемента равны нулю. Помоги анон, расскажи почему я мудак.Задание: Сформировать одномерный массив A={ai} (i=1...30), где i вычисляется по формуле - комментарий 12-й строкиКод: http://pastebin.com/XUjcXgGw
>>148713698 (OP)Вру, просто хуиту выводит, за исключение array[0]
bump
Bump 2
Bump 3
Bump 4
bump 5
bump 6
bump 7
>>148713698 (OP)imul результат складет в EDX:EAX, например. про idiv сам догадаешься?
>>148713698 (OP)mov [array+ECX-1],eaxECX у тебя 30,29,...1, а значение eax 32-битное, конечно, будет записываться хз. как. Надо, чтобы указатель шёл строго по 4 : 0, 4, 8,..232 для каждого шага.Я бы сделал так, но не уверен за порядок наполнения массива, сделано как у тебя - с конца. mov esi,offset array+29*4 mov ecx,30setelement: mov eax,ecx add eax,eax add eax,10 idiv ecx sub eax,ecx mov [esi],eax sub esi,4;декремент указателяloop setelementЕсли нужно всё таки с начала - надо в начале mov esi, offset array, а перед loop - add esi,4
не насилуй ECX, лучше возьми ещё регистр. У тебя дичь с адресацией творится
ВКАТИТЬСЯ В ПОГРОММИРОВАНИЕ
>>148714656>0,4,8...2320,4,8...(30-1)4fixed
>>148714534пример бы наглядный, а то я заплавал как с этим работать уже>>148714656Почему я не могу просто умножить ECX на 4? Вроде как получилось, судя по первым трём результатам11, 5, 2...
>>148716004fix, не те пикчи
>>148716004>я не могу просто умножить ECX на 4потому что ECX используется неявно командой loop которая вычитает по единице и проверяет на ноль, если не ноль - переход по метке.>Вроде как получилось, судя по первым трём результатам 11, 5, 2Потому что значение было однобайтовым, к тебя запись в массив 32 битными словами идёт. Ты уж определись тогда с разрядностью элементов массива, а исходя из этого - с шагом указателя и записью по указателю.
>>148716004>Почему я не могу просто умножить ECX на 4?Я понял. По той же причине - быстрее пррибавить 4 к указателю и не париться, не вычисляя каждый раз новое значение. Оптимизация не нужна - у нас гигабайты и гигагерцы, 2k17...По той же причине умножение на два - академически парвильно, но нифига не быстро. Проще сложить искомое само с собой.
>>148716319В косвенной адресации его расколбасит до [ECX3] ->[ECX+ECX2] ->[ECX+ECX+ECX]Не меняя значение регистра. По факту он выполняет lea и подставляет как операнд. Поэтому я предложил его умножить в адресе.>Потому что значение было однобайтовымПочему константа это слово?>>148716479По моему, это сейчас не существенно. Рефакторить то, что нихуя не работает. Ок, сейчас попробую не обосраться. Дай 5 минут
>>148716808>выполняет lea и подставляет как операнд. Поэтому я предложил его умножить в адресеДа кто ж спорит, можно и так.
>>148716479Падажди ебана, а как я тебе буду вычислять значение i после add ECX, 4. Примерно такая же асимптотика, если не идентичная
>>148717239так чтоб прибавлять быстро по 4 и заведён новый указатель в ESI, который сразу перед циклом инициализируется на массив. ECX используется только как счётчик.
>>148717400Но ведь память... Ок, ща секунду
>>148717400Так?
>>148718484Короче, ОП, ты есть заставить меня открыть асм. И вот что получилось у меня:
>>148719076Числа в ячейках 4..29 - отрицательные, вот и всё.Цикл заполнения был такой: push edx mov esi,offset sarray+29*4 mov ecx,30@@setelement: mov eax,ecx add eax,eax add eax,10 xor edx,edx idiv ecx sub eax,ecx mov [esi],eax sub esi,4 loop @@setelement pop edx
>>148719076Покажи код вывода
>>148719249Это вообще на паскале, лол. На асме только заполнение...program Project2;{$APPTYPE CONSOLE}uses SysUtils,windows;var sarray: array [0..29] of dword; i:word;function hexchar(hc:byte):char;beginif hc<$a then hexchar:=chr(hc+$30) else hexchar:=chr(hc+$37);end;function hex32(hc:longword):string;varii:byte;ns:string;beginns:='--------';for ii:=8 downto 1 do begin ns[ii]:=hexchar(hc and $0f); hc:=hc shr 4; end;result:=ns;end;begin { TODO -oUser -cConsole Main : Insert code here }asm push edx mov esi,offset sarray+29*4 mov ecx,30@@setelement: mov eax,ecx add eax,eax add eax,10 xor edx,edx idiv ecx sub eax,ecx mov [esi],eax sub esi,4 loop @@setelement pop edxend;for i:=0 to 29 do begin Writeln(inttostr(i)+' '+hex32(sarray)); end;end.
>>148719689>hex32(sarray))Парсер лох:hex32(sarray [ i ] ))
>>148719689Ты сделал меня грустить
>>148719970Я уже сомневаться начал, просто нету у меня асма под рукой на работке, вот сваял из того что было. Но ведь главное результат?
>>148721131Главное что мне скажет препод на мои извращения в NASM'е под UNIX, когда тот хочет на TASM'е под DOS. Вот тогда во мне проснется Рамзи Болтон