Бред

Ответить в тред Ответить в тред
Check this out!
Аноним 02/12/21 Чтв 15:30:57 2589148831
16383962833412.mp4 3846Кб, 496x360, 00:01:30
496x360
Кто тут в ассемблере шарит? (fasm)
Есть лаба - возвести число X в 32 степень.
Из команд можно использовать только умножение не более пяти раз. Окей, пять раз перемножить число само на себя много ума не надо, и как раз получается 32 степень, но что делать с ебучим переполнением? Можно как-то использовать несколько регистров в качестве одной переменной?
Если использовать тупой подход, то нужна переменная размером 8 байт хотя бы, но таких, вроде бы, нет.
Может какие-то хитрые алгоритмы есть?

Короче, спасайте, это пиздец какой-то. У всех остальных задачки вроде «посчитать число сотен в числе» или «найти объем куба со стороной X», а мне такой вот хардкор достался.

Блять, двач, я должен решить эту херню на чистом ассемблере, встроенном в C++, хотя бы ради того, чтобы не чувствовать себя говном.

В общем, решаем всем двачом двумя вариантами:
1. Законно: с использованием только умножения не более пяти раз, можно изменять и баловаться только с регистрами.
2. На похуях: любые варианты, лишь бы работало.
Аноним 02/12/21 Чтв 15:32:11 2589149532
>>258914883 (OP)
>Окей, пять раз перемножить число само на себя много ума не надо, и как раз получается 32 степень
Нифига новости.
Аноним 02/12/21 Чтв 15:32:54 2589149963
Аноним 02/12/21 Чтв 15:34:56 2589150914
>>258914953
Бля, ну ты дурак, смотри, возьмём X = 2;

2 2 = 4;
4
4 = 16;
16 16 = 256;
256
256 = 65536;
65536 * 65336 = 4294967296;

232 = 294967296;

Для этого как раз подходит команда MUL, она делает то, что нужно, но ебучее переполнение всё портит.
Аноним 02/12/21 Чтв 15:35:50 2589151365
>>258914996
Да какой нахуй цикл, когда проблема в ПЕРЕПОЛНЕНИИ, а не в алгоритме.
Аноним 02/12/21 Чтв 15:36:38 2589151696
Аноним 02/12/21 Чтв 15:36:46 2589151757
Аноним 02/12/21 Чтв 15:37:13 2589151968
Аноним 02/12/21 Чтв 15:37:59 2589152239
>>258914883 (OP)
Прикол ещё в том, что 2 - самое малое значение X уже вызывает переполнение, а как тогда считать, например, 9532?
Аноним 02/12/21 Чтв 15:41:08 25891536710
>>258915196
>SHL SHR
Окей, но как внести переменную long long в __asm? Как здесь быть, если long long - 8 байт, а eax - 4 байт?
Аноним 02/12/21 Чтв 15:43:17 25891549111
Не помню особо АСМ, но вроде при умножении емкость ответа в 2 раза больше емкости операндов. То есть делай mul bx, а ответ смотри в dx:ax.
Аноним 02/12/21 Чтв 15:45:58 25891564312
Аноним 02/12/21 Чтв 15:56:49 25891615313
>>258915643
Нихуя не понимаю, что там и как это использовать. Я, блять, с ассемблером первый раз в жизни встретился.

>>258915491
И как его там смотреть-то, блять?
Вывожу по-отдельности eax, ebx, edx и там числа что-то вроде 24473687, 0 и 9, а что это значит, я не представляю.
Аноним 02/12/21 Чтв 15:58:31 25891623114
>>258915491
типа блять, что мне с пикрилом делать?
Аноним 02/12/21 Чтв 15:58:58 25891625815
image.png 31Кб, 523x490
523x490
Аноним 02/12/21 Чтв 16:04:14 25891650816
02/12/21 Чтв 16:06:11 25891660617
нахуй тебе ассемблер чушка?
учи нормальные языки js например.
сажи зумер
Аноним 02/12/21 Чтв 16:06:31 25891663018
Результат команды mul находится в регистрах edx:eax.
Аноним 02/12/21 Чтв 16:08:31 25891673019
>>258916630
Ну и что дальше-то, блять?
А мой хуй у тебя за щекой находится.
Аноним 02/12/21 Чтв 16:09:38 25891678620
>>258916153
Ну блин, я не буду ради тебя масм ставить. Что-то вроде
mov ax, [num1]
mov bx, [num2]
mul bx
mov [mulResult],ax
mov [mulResult+2],dx
mov eax,[mulResult]
Аноним 02/12/21 Чтв 16:13:07 25891697221
>>258916730
>А мой хуй у тебя за щекой находится
Ясно. Удачи.
Аноним 02/12/21 Чтв 16:18:44 25891724222
Используй сдвиг, дурень. Какое нахуй mul.
Аноним 02/12/21 Чтв 16:19:27 25891727823
>>258916786
Какой толк от кода, если я его не понимаю?
Я хочу понять, а не тупо скопипастить ответ, тем более он не работает.
Аноним 02/12/21 Чтв 16:19:49 25891729324
>>258917242
Окей, но как внести переменную long long в __asm? Как здесь быть, если long long - 8 байт, а eax - 4 байт?
Аноним 02/12/21 Чтв 16:20:38 25891734425
>>258917242
Он в сдвиги не шарит. Выше кинули идею - хуй отдуплил.
Аноним 02/12/21 Чтв 16:21:17 25891738626
>>258917293
Использовать несколько регистров для одного числа. В инете можно найти примеры умножения огромных чисел, там так и организовано. Также использовать флаг переполнения в качестве детектора.
Аноним 02/12/21 Чтв 16:21:38 25891740627
>>258917344
А, ну тогда хз. По-другому я не знаю.
Аноним 02/12/21 Чтв 16:22:44 25891746628
>>258917344
Блять, какой смысл от сдвига, если результат некуда записать?
Аноним 02/12/21 Чтв 16:23:19 25891749729
oekaki.png 12Кб, 400x400
400x400
>>258917344
Блять, какой смысл от сдвига, если результат некуда записать?
Аноним 02/12/21 Чтв 16:24:00 25891754330
>>258917344
Ничего, голову поломает пару дней, станет повежливее, и поумнее. Поймет важность деталей. Ему только на пользу.
Аноним 02/12/21 Чтв 16:28:26 25891778731
>>258914883 (OP)
> Может какие-то хитрые алгоритмы есть?
Использовать 64-битные команды, дурачок.
Аноним 02/12/21 Чтв 16:28:59 25891782732
>>258917344
Это не умножение на степень двойки, это возведение в степень. Здесь сдвиги не помогут.

5х5 = 25

Где здесь сдвиги? Ему нужно умножить как здесь >>258915091 только нужно увидеть, что переполнения там нет нигде, кроме последнего умножения.
Аноним 02/12/21 Чтв 16:30:11 25891788833
Below is the algorithm of 64-bit multiplication:

x, y: 64-bit integer
x_h/x_l: higher/lower 32 bits of x
y_h/y_l: higher/lower 32 bits of y

xy = ((x_h2^32 + x_l)(y_h2^32 + y_l)) mod 2^64
= (x_hy_h2^64 + x_ly_l + x_hy_l2^32 + x_ly_h2^32) mod 2^64
= x_l
y_l + (x_hy_l + x_ly_h)2^32

Now from the equation you can see that only 3(not 4) multiplication needed.

movl 16(%ebp), %esi ; get y_l
movl 12(%ebp), %eax ; get x_l
movl %eax, %edx
sarl $31, %edx ; get x_h, (x >>a 31), higher 32 bits of sign-extension of x
movl 20(%ebp), %ecx ; get y_h
imull %eax, %ecx ; compute s: x_l
y_h
movl %edx, %ebx
imull %esi, %ebx ; compute t: x_hy_l
addl %ebx, %ecx ; compute s + t
mull %esi ; compute u: x_l
y_l
leal (%ecx,%edx), %edx ; u_h += (s + t), result is u
movl 8(%ebp), %ecx
movl %eax, (%ecx)
movl %edx, 4(%ecx)
Аноним 02/12/21 Чтв 16:34:25 25891808334
>>258914883 (OP)
Бля, я учился лет 15 назад, ассемблер решал всей параллели, щас конечно уже не вспомню. Эхх надо было пограмистом идти, а щас уж все мозги пропил.
Аноним 02/12/21 Чтв 16:35:42 25891814635
image.png 12Кб, 384x296
384x296
image.png 13Кб, 422x316
422x316
image.png 18Кб, 719x347
719x347
>>258917543
>>258917344
Ну, вот, блять, юзаю сдвиги.
Сдвиг на 10 бит - окей, ибо нет переполнения.
Сдвиг на 15 бит - окей, ибо опять нет переполнения.
Сдвиг на 31 бит - всё, пиздец, переполнили 4 ебучих байта.

Какие детали я должен понять?

Аноним 02/12/21 Чтв 16:36:20 25891818636
>>258918146
тут решение
>>258917888
Формула для умножения части чисел в регистрах.
Аноним 02/12/21 Чтв 16:36:58 25891821737
>>258914883 (OP)
Число с плавающей точкой, мат. сопроцесор, возводишь число в квадрат, повторить 5 раз, удачи
Аноним 02/12/21 Чтв 16:38:22 25891828738
>>258918146
Было бы заебись, если бы можно было бы два 4-байтовых регистра в один 8-байтовых, но нельзя, потому что архитектура x32, а не x64, если я правильно понимаю.

>>258917787
Например какие?

>>258917827
Верхняя граница - 4294967295, если я правильно понял.
Аноним 02/12/21 Чтв 16:40:08 25891837839
>>258915223
Ты охуеешь насколько это большое число, ОЗУ на всех пекарнях в мире не хватит чтобы его сохранить, а ОП тролль
Аноним 02/12/21 Чтв 16:41:19 25891842840
>>258917888
>>258918186
Решение приведено на GNU ASSEMBLER, а FASM не поддержииват 95% из этого.
Аноним 02/12/21 Чтв 16:42:19 25891847741
>>258918146
ты нахуя пользуешься 32-битным eax, когда есть 64-битный rax?
Аноним 02/12/21 Чтв 16:42:34 25891848742
>>258918378
Да нет, спокойно считается и сохраняется, всего то 1.9371148e+63
Аноним 02/12/21 Чтв 16:42:33 25891848943
>>258918217
Банка сгущёнки, твоя жопа, вставляешь банку сгущёнки в жопу, повторить 5 раз, удачи
Аноним 02/12/21 Чтв 16:42:34 25891849344
>>258914883 (OP)
умножение на 2 эквивалентно сдвигу слево на оди разряд.
Аноним 02/12/21 Чтв 16:43:32 25891855045
>>258918428
Для 32 бит:
mov esi, y_low
mov eax, x
mov edx, eax
sar edx, 31
mov ecx, y_high

imul ecx, eax ; ecx = y_high {signed} x

mov ebx, edx

imul ebx, esi ; ebx = sign_extension(x)
{signed} y_low

add ecx, ebx ; ecx = y_high {signed} x_low + x_high {signed} y_low

mul esi ; edx:eax = x_low {unsigned} y_low

lea edx, [ecx + edx] ; edx = high(x_low
{unsigned} y_low + y_high {signed} x_low + x_high {signed} y_low)

mov ecx, dest
mov [ecx], eax
mov [ecx + 4], edx
Аноним 02/12/21 Чтв 16:46:27 25891869746
Я думаю, что правильное решение то, которое ты нашёл, а препод про ошибку просто не подумал. Тем более у других такие лёгкие задачи. Такие неудачные задания у меня были в учёбе,препод потом признавал, что сделано все правильно, хотя результата нет.
Аноним 02/12/21 Чтв 16:48:42 25891878947
>>258918489
настоящий_русский.жпег
Аноним 02/12/21 Чтв 16:48:59 25891880348
>>258918550
Опять же какой мне смысл от готовой программы, если я её, блять, не понимаю?
Я даже не могу её запустить.
Аноним 02/12/21 Чтв 16:50:00 25891885749
>>258914883 (OP)
Берёшь и спрашиваешь препода, надо ли учитывать переполнение. Решаешь только если сказал да и нет возможносьи взять другое задание/препода.
Аноним 02/12/21 Чтв 16:50:54 25891889250
>>258918697
>>258918857

Ну, смотри. Соль тут уже просто в том, чтобы найти способ, решить это говно.
До появления 64-битной архитектуры каким-то же образом должны были считать большие числа ассемблером.
Аноним 02/12/21 Чтв 16:52:38 25891895451
>>258918857
Алсо скажу, что переполнение возникает уже на числе 2.
То есть без переполнения можно посчитать только единицу и нуль.
Аноним 02/12/21 Чтв 16:53:07 25891897352
>>258918378
Умножение на себя удваивает число разрядов. Так что опу понадобится 32 байта если исходное число один байт.
А если там инт32, то 4х32 = 128 байт.

Так что опу нужна плавающая запятая. Там можно читать и писать через поинтер 32, 64 и 80 бит.
Аноним 02/12/21 Чтв 16:55:28 25891908153
>>258918892
>каким-то же образом
Так не за 5 уножений же.

Не, ну можно 0 умножений сделать, заменить умножение на сложение в цикле, но это будет костыль страшный.
Аноним 02/12/21 Чтв 16:56:36 25891913054
>>258914883 (OP)
ввод x
a=xx // 2 степень
x=a
a // 4 степень
a=xx // 8 степень
x=a
a // 16 степень
a=x*x // 32 степень

Или я не прав?
Тред выше не читал
Аноним 02/12/21 Чтв 16:57:29 25891917055
>>258919081
> сложение в цикле
Всё равно переполнение никуда не уйдет
Может возможно как-нибудь части числа раскидать по разным регистрам, но как потом собрать их в кучу и вывести результат?
Аноним 02/12/21 Чтв 16:58:03 25891919256
>>258919130
В первом же посте то же самое написано, долбоёб
Аноним 02/12/21 Чтв 16:58:22 25891920457
>>258917293
Так используй rax регистр в х64 лол
Аноним 02/12/21 Чтв 17:01:02 25891933358
Аноним 02/12/21 Чтв 17:01:28 25891935559
>>258914883 (OP)
Всё проще. Тебе даден асс-эмблер, а ты пытаешься применить на нём что-то из высокоровневых языков. Используй сдвиг.
Аноним 02/12/21 Чтв 17:02:00 25891937860
А чо, юзать rax, rbx итд не варик? Они вроде 8 байт как раз
Аноним 02/12/21 Чтв 17:02:06 25891938561
Аноним 02/12/21 Чтв 17:04:12 25891948262
>>258919385
Ну так разбей результат и запиши в верхнем и нижнем регистрах. Асс-эмблер позволяет работать с любыми числами, на сколько хватит ячеек памяти.
Аноним 02/12/21 Чтв 17:06:17 25891956563
Screenshot20211[...].jpg 286Кб, 720x1560
720x1560
Screenshot20211[...].jpg 287Кб, 720x1560
720x1560
Аноним 02/12/21 Чтв 17:08:08 25891964964
>>258919482
>Ну так разбей результат и запиши в верхнем и нижнем регистрах
Каким образом? Каким образом потом продолжать двигать регистры? Каким образом вывести результат во внешнюю переменную?
Аноним 02/12/21 Чтв 17:13:24 25891992065
>>258919649
Алгоритм я тебе скинул на Википедии. Сдвиги не нужны, не слушай даунов. Тебе придется для честного решения ворочать массивы на ассемблере и объявлять подпрограммы.

И определись, ты на fasm или на вставках ищешь решение? Фасм это отдельный от си проект.
Аноним 02/12/21 Чтв 17:17:12 25892011566
>>258919920
Определись, какой размер входной переменной. Определись, используешь ты плавающую запятую или длинную арифметику.

Можешь оба варианта сделать, раз уж собрался выебнуться перед преподом.
Аноним 02/12/21 Чтв 17:20:36 25892030267
>>258919920
Да, спасибо за статью и за исправление.
Нужно всё сделать на вставках си.

Думаю, придётся ворочать массивы и объявлять подпрограммы.
Больше всего меня напрягает вывод данных. Я не представляю как собрать данные разных регистров во внешней 64-битной переменной.
Скорее всего придётся писать новый класс, а это снова отход от принципа, что на языке должен выполняться только ввод и вывод данных, а вся логика внутри ассемблера.
Аноним 02/12/21 Чтв 17:21:23 25892034568
Если выберешь большие числа, то есть два варианта: использовать обычный массив unsigned int и потом ебаться с делением, чтобы вывести на экран результат.
Или использовать массив BCD (https://ru.m.wikipedia.org/wiki/Двоично-десятичный_код)
Аноним 02/12/21 Чтв 17:22:11 25892038369
>>258920115
Размер переменных хотелось бы, конечно 8 байт, но вставки в C++ поддерживают только 4 байта, так что буду брать их.
Скорее всего буду работать с длинной математикой.
Аноним 02/12/21 Чтв 17:24:02 25892047870
>>258920345
О, двоично-десятичный код, судя по всему, классная штука.
Буду брать её.
Аноним 02/12/21 Чтв 17:27:20 25892066971
>>258920383
Тогда начни с того, что объяви массив unsigned int и передай его по ссылке в ассемблер и попробуй что-нибудь с ним сделать, увеличить на единицу все элементы, например.
Это нужно чтобы понять формат хранения массива, который сделает компилятор.
Аноним 02/12/21 Чтв 17:32:00 25892093372
>>258920383
Для 4 байт на входе будет 128 байт на выходе. В любом случае передавать нужно будет ссылку на число, а не само число. Так что не важно, что он там поддерживает.
Аноним 02/12/21 Чтв 17:57:50 25892234673
Вроде нет алгоритма, который позволил бы по частям посчитать степень, так что юзать только регистры вообще не вариант. Создавай массив на 128 байт, если ввод на 4 байта, запиши туда X и возведи в квадрат 5 раз, как ты и предлагал. Единственная проблема на твоём пути это тупо функция возведения в квадрат, которая как аргумент должна брать не регистр, а указатель на массив байт, которые ты и будешь возводить.
Настройки X
Ответить в тред X
15000
Макс объем: 20Mб, макс кол-во файлов: 4
Кликни/брось файл/ctrl-v
X
Ваш шидевор X
Стикеры X
Избранное / Топ тредов