Vladimir
Shmelev
или разреверсить прошивку
Ned
Anonymous
lea для загрузки адреса
Anonymous
в задании просто присвоение реализовать
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
Андрей
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
Vladislav
Vladislav
Объяснить через флаги реестра
🦥Alex Fails
(В данном случае не уинт макс, а в макс. значение, которое можно хранить в регистре)
🦥Alex Fails
Но счетчик считается беззнаковым, поэтому число -1 в CX, по правилам чисел, представленных в дополнительном коде, превращается в 65535
🦥Alex Fails
Дополнительный код (представление числа) — Википедия
ru.wikipedia.org
Дополнительный код (англ. two’s complement, иногда twos-complement) — наиболее распространённый способ представления отрицательных целых чисел в компьютерах. Он позволяет заменить операцию вычитания на операцию сложения и сделать операции сложения...
Vladislav
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
а дальше по коду смотреть надо
Vladislav
Ned
zh
приехали...
Anatoly
run
atqr
фейк
Anatoly
подделка
настоящий не нашёл
Anonymous
не фейк, там же он на аве
Anatoly
с тобой хрен поспоришь
bilka00
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