Vladimir
Алсо, как переписать программу на конвейере в roshen?
Для начала спереть сырцы. Потом переписать.
Shmelev
или разреверсить прошивку
Ned
a) mov ebx,3 mul bx б) add eax,a mov ebx,2 mul,bx add eax,6
В б) подразумевается lea
Anonymous
lea для загрузки адреса
Anonymous
в задании просто присвоение реализовать
Ned
lea для загрузки адреса
mov eax, edi //eax = x add eax, esi //eax += a lea edi,[rax*2+0x6] //x = (x+a)*2 + 6
Ned
Это нужно оптимизировать
Ned
Ибо это тело функции, которая получает (int a, int &x)
Anonymous
2) реализовать наименьшим числом команд следующие присвоения
Ned
Но получится короче, потому что lea умеет в такие преобразования
Ned
Да блин, я тебе грю. Оптимизировать это - и будет меньше твоего
Ned
Просто лень ща думать, я бы сам сократил
Ned
Вот, их уже 5...
Ned
И так их уже 3
Anonymous
это же х64
Ned
Готово
Ned
mov eax, edi //eax = x add eax, esi //eax += a lea edi,[rax*2+0x6] //x = (x+a)*2 + 6
Ned
Во
Anonymous
это х64 ?
Ned
Нет, это x32
Ned
А не, 64
Ned
Но похуй, можно сделать 32
Ned
Просто rax -> eax
Anonymous
а что за rdi rsi были?
Ned
Это был код функции стыренный из дизассемблера
Ned
Я его ужал до самого решения задачи
Anonymous
А не, 64
в задаче, я думаю, подразумевался x32
Ned
Через rdi и rsi в неё передавались параметры. Через rsi - а, через rdi - адрес х (ибо ссылочный тип)
Ned
Да это не имеет значения, lea есть и в х32
Ned
Но решение такое
Ned
Я бы ещё подумал над shl, но тут ни к селу пока что...
Ned
Ned
X - ссылочный, чтобы его не оптимизировало. Потому вся херь с его адресами автоматом выгружается. Если считать, что в rdi лежит х, а в rsi - a, то достаточно трёх команд.
Ned
Может, и двух, но я не уверен
Ned
Типа add rdi, rsi lea rdi, [rdi*2 + 0x6]
Ned
Но я не уверен, что так можно
Ned
Да, так можно
Ned
Типа add rdi, rsi lea rdi, [rdi*2 + 0x6]
Итак, это конечный вариант
Андрей
https://toster.ru/q/429388
Vladislav
Всем доброго дня.
Vladislav
movCX,
Vladislav
mov CX, 0 inner: loop inner
Vladislav
Как получается, что такая запись выполняется 65536 раз?
Vladislav
Я понимаю, что сначало от 0 - 1, потом -1 сравнивается с 0...вот только как -1 превращяется в 65536 раз?
🦥Alex Fails
Луп декрементирует cx, потом проверяет его на 0
Vladislav
Тут скорее вопрос как -1 в 65536 превратилась)
🦥Alex Fails
Я понимаю, что сначало от 0 - 1, потом -1 сравнивается с 0...вот только как -1 превращяется в 65536 раз?
отрицательные числа превращаются в UINT_MAX при антипереполнении
Vladislav
Объяснить через флаги реестра
🦥Alex Fails
(В данном случае не уинт макс, а в макс. значение, которое можно хранить в регистре)
🦥Alex Fails
а можно...через фдаги?
Ну тут получается DEC CX, который OF задает в 1
🦥Alex Fails
Но счетчик считается беззнаковым, поэтому число -1 в CX, по правилам чисел, представленных в дополнительном коде, превращается в 65535
🦥Alex Fails
Дополнительный код (представление числа) — Википедия ru.wikipedia.org Дополнительный код (англ. two’s complement, иногда twos-complement) — наиболее распространённый способ представления отрицательных целых чисел в компьютерах. Он позволяет заменить операцию вычитания на операцию сложения и сделать операции сложения...
Vladislav
.data mes db ' aaa',lf,cr mes2 db ' bbb',lf,cr
Vladislav
meslen = $ - mes
Vladislav
вернет всю data
Vladislav
Как получить длины отдельных строк?
Vladislav
Уже решился вопрос
Vladislav
cmp AH,61h Что дает это сравнивание?
tanjmaxalb
Инструкция перехода ещё нужна, которая идёт далее
tanjmaxalb
Сама cmp лишь вычитает 0х61 из AH и выставляет соответствующие флаги, по которым осуществляется переход
да забаньте её уже
Barmaley
это сравнение на то, что а аh буква 'a'
Barmaley
а дальше по коду смотреть надо
zh
приехали...
Anatoly
run
atqr
фейк
Anatoly
подделка
настоящий не нашёл
Anonymous
не фейк, там же он на аве
Anatoly
с тобой хрен поспоришь
bilka00
мало? ecx/rcx используй
Ты сделал мой вечер
bilka00
(на самом деле нет но шутка все же зашла)
Vladislav
Андрей
ARM ассемблер, хочу сделать макрос для вывода числа на экран, естественно приходится использовать цикл, а значит и метки. Вызываю макрос один раз, всё работает, а если вызываю второй раз, то компилятор ругается, что несколько одинаково названных меток, что в принципе логично, но как тогда быть?
Андрей
var int bufForPrint 0 .macro printnum num loadvar r1 a mov r4, $0 loopForPrintNum1: push {r4} mov r2, $10 udiv r3, r1, r2 mls r4, r2,r3,r1 add r4, $48 mov r1, r3 cmp r1, $0 bne loopForPrintNum1 push {r4} loopForPrintNum2: pop {r4} storevar r4 bufForPrint writestr bufForPrint 1 cmp r4, $0 bne loopForPrintNum2 .endm