[Ответить в тред] Ответить в тред

02/12/16 - Конкурс визуальных новелл доски /ruvn/
15/11/16 - **НОВЫЙ ФУНКЦИОНАЛ** - Стикеры
09/10/16 - Открыта доска /int/ - International, давайте расскажем о ней!

Check this out!

Новые доски: /2d/ - Аниме/Беседка • /wwe/ - WorldWide Wrestling Universe • /ch/ - Чатики и конфочки • /int/ - International • /ruvn/ - Российские визуальные новеллы • /math/ - Математика • Создай свою

[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 31 | 9 | 6
Назад Вниз Каталог Обновить

Аноним 13/03/17 Пнд 15:06:58  148713698  
input.PNG (54Кб, 753x623)
output.PNG (22Кб, 678x203)
Программовонне трд

Анон, я не понимаю ассемблер. Он меня просто ненавидит. Скажи, где я обосрался? Я не пойму почему все, кроме первого элемента равны нулю. Помоги анон, расскажи почему я мудак.

Задание: Сформировать одномерный массив A={ai} (i=1...30), где i вычисляется по формуле - комментарий 12-й строки

Код: http://pastebin.com/XUjcXgGw
Аноним 13/03/17 Пнд 15:07:38  148713748
>>148713698 (OP)
Вру, просто хуиту выводит, за исключение array[0]
Аноним 13/03/17 Пнд 15:08:53  148713821
bump
Аноним 13/03/17 Пнд 15:11:43  148714008
Bump 2
Аноним 13/03/17 Пнд 15:13:43  148714147
Bump 3
Аноним 13/03/17 Пнд 15:14:25  148714183
Bump 4
Аноним 13/03/17 Пнд 15:15:15  148714237
bump 5
Аноним 13/03/17 Пнд 15:15:57  148714296
bump 6
Аноним 13/03/17 Пнд 15:18:32  148714490
bump 7
Аноним 13/03/17 Пнд 15:19:04  148714534
>>148713698 (OP)
imul результат складет в EDX:EAX, например. про idiv сам догадаешься?
Аноним 13/03/17 Пнд 15:20:38  148714656
>>148713698 (OP)
mov [array+ECX-1],eax
ECX у тебя 30,29,...1, а значение eax 32-битное, конечно, будет записываться хз. как. Надо, чтобы указатель шёл строго по 4 : 0, 4, 8,..232 для каждого шага.
Я бы сделал так, но не уверен за порядок наполнения массива, сделано как у тебя - с конца.
mov esi,offset array+29*4
mov ecx,30
setelement: 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
Аноним 13/03/17 Пнд 15:20:44  148714666
не насилуй ECX, лучше возьми ещё регистр. У тебя дичь с адресацией творится
Аноним 13/03/17 Пнд 15:21:04  148714685
14892985865130.png (382Кб, 1563x1242)
ВКАТИТЬСЯ В ПОГРОММИРОВАНИЕ
Аноним 13/03/17 Пнд 15:25:35  148715033
>>148714656
>0,4,8...232
0,4,8...(30-1)4
fixed
Аноним 13/03/17 Пнд 15:40:07  148716004
input.PNG (54Кб, 753x623)
output.PNG (22Кб, 678x203)
>>148714534
пример бы наглядный, а то я заплавал как с этим работать уже
>>148714656
Почему я не могу просто умножить ECX на 4? Вроде как получилось, судя по первым трём результатам
11, 5, 2...
Аноним 13/03/17 Пнд 15:42:35  148716158
input.PNG (36Кб, 748x310)
output.PNG (30Кб, 704x251)
>>148716004
fix, не те пикчи
Аноним 13/03/17 Пнд 15:45:22  148716319
>>148716004
>я не могу просто умножить ECX на 4
потому что ECX используется неявно командой loop которая вычитает по единице и проверяет на ноль, если не ноль - переход по метке.
>Вроде как получилось, судя по первым трём результатам 11, 5, 2
Потому что значение было однобайтовым, к тебя запись в массив 32 битными словами идёт. Ты уж определись тогда с разрядностью элементов массива, а исходя из этого - с шагом указателя и записью по указателю.
Аноним 13/03/17 Пнд 15:47:44  148716479
>>148716004
>Почему я не могу просто умножить ECX на 4?
Я понял. По той же причине - быстрее пррибавить 4 к указателю и не париться, не вычисляя каждый раз новое значение. Оптимизация не нужна - у нас гигабайты и гигагерцы, 2k17...
По той же причине умножение на два - академически парвильно, но нифига не быстро. Проще сложить искомое само с собой.
Аноним 13/03/17 Пнд 15:53:21  148716808
>>148716319
В косвенной адресации его расколбасит до
[ECX3] ->
[ECX+ECX
2] ->
[ECX+ECX+ECX]
Не меняя значение регистра. По факту он выполняет lea и подставляет как операнд. Поэтому я предложил его умножить в адресе.
>Потому что значение было однобайтовым
Почему константа это слово?
>>148716479
По моему, это сейчас не существенно. Рефакторить то, что нихуя не работает. Ок, сейчас попробую не обосраться. Дай 5 минут
Аноним 13/03/17 Пнд 15:56:41  148716983
>>148716808
>выполняет lea и подставляет как операнд. Поэтому я предложил его умножить в адресе
Да кто ж спорит, можно и так.
Аноним 13/03/17 Пнд 16:01:07  148717239
14564211826420.jpg (12Кб, 207x243)
>>148716479
Падажди ебана, а как я тебе буду вычислять значение i после add ECX, 4. Примерно такая же асимптотика, если не идентичная
Аноним 13/03/17 Пнд 16:03:11  148717400
>>148717239
так чтоб прибавлять быстро по 4 и заведён новый указатель в ESI, который сразу перед циклом инициализируется на массив. ECX используется только как счётчик.
Аноним 13/03/17 Пнд 16:05:24  148717550
0e9.jpg (27Кб, 600x600)
>>148717400
Но ведь память... Ок, ща секунду
Аноним 13/03/17 Пнд 16:17:42  148718484
input.PNG (57Кб, 711x689)
output.PNG (30Кб, 738x252)
>>148717400
Так?
Аноним 13/03/17 Пнд 16:25:21  148719076
Clipboard.png (9Кб, 558x439)
>>148718484
Короче, ОП, ты есть заставить меня открыть асм.
И вот что получилось у меня:
Аноним 13/03/17 Пнд 16:27:28  148719212
>>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
Аноним 13/03/17 Пнд 16:28:06  148719249
>>148719076
Покажи код вывода
Аноним 13/03/17 Пнд 16:34:33  148719689
>>148719249
Это вообще на паскале, лол. На асме только заполнение...
program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils,windows;

var
sarray: array [0..29] of dword;
i:word;

function hexchar(hc:byte):char;
begin
if hc<$a then hexchar:=chr(hc+$30)
else hexchar:=chr(hc+$37);
end;

function hex32(hc:longword):string;
var
ii:byte;
ns:string;
begin
ns:='--------';
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 edx
end;

for i:=0 to 29 do
begin
Writeln(inttostr(i)+' '+hex32(sarray));
end;
end.
Аноним 13/03/17 Пнд 16:35:48  148719788
>>148719689
>hex32(sarray))
Парсер лох:
hex32(sarray [ i ] ))
Аноним 13/03/17 Пнд 16:38:05  148719970
14812680463050.jpg (52Кб, 460x460)
>>148719689
Ты сделал меня грустить
Аноним 13/03/17 Пнд 16:51:48  148721131
>>148719970
Я уже сомневаться начал, просто нету у меня асма под рукой на работке, вот сваял из того что было. Но ведь главное результат?
Аноним 13/03/17 Пнд 17:10:24  148722594
>>148721131
Главное что мне скажет препод на мои извращения в NASM'е под UNIX, когда тот хочет на TASM'е под DOS. Вот тогда во мне проснется Рамзи Болтон

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 31 | 9 | 6
Назад Вверх Каталог Обновить

Топ тредов
Избранное