169 похожих чатов

@Disba1ancer @laurson Как сделать, чтоб Си нормально брал первое число

и последнее число?
getfirst(int):
mov eax, 0x20000001
.L4:
mov edx, eax
lea eax, [eax+15]
test edx, edx
cmovns eax, edx
sar eax, 4
cmp edx, 271
jg .L4
ret
Выходит намного медленнее, чем:
mov eax, 0x20000001

@@:
cmp eax, 0x10
jb @f
shr eax, 4
jmp @b
@@:

Получение последнего числа нормально сделал, через маску:
and eax, 0xF:
mov eax, 0x2000001
cdq
shr edx, 28
add eax, edx
and eax, 15
sub eax, edx
(Если что, я про HEX число - первое и последнее)

int getlast(int num) {
return (num % 0x10);
}

int getfirst(int num) {
while((num /= 0x10) > 0x10) { }
return num;
}

10 ответов

22 просмотра

Bit scan точно медленнее, чем твои циклы?

Entusiast- Автор вопроса
s54820
Bit scan точно медленнее, чем твои циклы?

Да, проверял всеми способами

Entusiast- Автор вопроса
s54820
Bit scan точно медленнее, чем твои циклы?

Ну при маленьких значениях типа 0x20 - конечно цикл медленнее

Во втором асмолистинге ошибка тебе нужен sar

Entusiast- Автор вопроса
disba1ancer
Во втором асмолистинге ошибка тебе нужен sar

Проверял с любыми случайными значениями - нет никакой ошибки, работает

Entusiast- Автор вопроса
disba1ancer
А отрицательные значения там были?

Да 0xF0001 0xE02 0xFFFFFF1 0x82918 0xFEFEFE 0xF0F0F0 Результат был: 0xF 0xE 0xF 0x8 0xF 0xF

Entusiast
Да 0xF0001 0xE02 0xFFFFFF1 0x82918 0xFEFEFE 0xF0F...

Тогда в сишном коде не используй инты или кастуй к беззнаковым, у тебя первый листинг, явно что-то шаманит со знаком

Entusiast- Автор вопроса
disba1ancer
Тогда в сишном коде не используй инты или кастуй к...

Спасибо, тоже вот только что думал добавлять unsigned

Entusiast
Спасибо, тоже вот только что думал добавлять unsig...

Ты можешь делать каст внутри функции

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта