0x0c0de
03.10.2007, 18:19
23 способа получить в регистре единицу.
От самых простых до самых извратных. Хорошая разминка для мозгов.
1. непохек
mov eax,1.
Просто положить в регистр единицу
2.
sub eax,eax /xor eax,eax (по отдельности не рассматриваю)
inc eax
Красиво, довольно коротко. Обнуляем, инкрементируем....
3. imul eax,0
inc eax
Тоже красиво. Обнуляем, инкрементируем
4. Сопроцессор, но тут нужна дополнительная переменная. mem dword ?
finit
fld1
fist mem
mov eax,mem
в eax - теперь 1
Сначала мы инициализируем сопроцессор (finit), потом загружаем в st0 1, потом отправляем
содержимое st0 в mem, mem ложим в eax )
5. Еще сопроцессор ( mem dword ?)
finit
fldpi
fcos
fchs
fist mem
mov eax,mem
То есть ложим в st0 число пи, находим косинус пи (-1), меняем знак, сохраняем значение
6. А теперь больше тригонометрии
finit
fldz
fcos
fist mem
mov eax,mem
Ищем косинус от нуля))))) А это 1)))
7. А еще можно так
sub eax,eax
sub al,-1
это 4 байта.
8. Самый мой любимый способ
sub eax,eax
bfs eax,0
В нулевой бит ложим 1=)
9. lea eax,[1]
Длинно, но все же....
10. Разновидность 5 метода, но беру модуль
finit
fldpi
fcos
fabs
fist mem
mov eax,mem
11.
sub eax,eax
dec eax
imul eax,eax
Ну это всем наверное ясно -1*(-1)=1
12. Этот способ я тоже люблю.
Делим двоичный логарифм 10 сам на себя.Аналогичный способ с любым др. числом (например с натуральным логарифмом 2 -
оба способа рассматриваются)
finit
fld2t
fld2t
fdiv st0,st1
fist mem
mov eax,mem
и соответственно
finit
fldln2
fldln2
fdiv st0,st1
fist mem
mov eax,mem
а можно еще с числом пи и десятичным логарифмом 2
finit
fldpi
fldpi
fdiv st0,st1
fist mem
mov eax,mem
и
finit
fldlg2
fldlg2
fdiv st0,st1
fist mem
mov eax,mem
13. Тригонометрия. Что-то меня тригонометрия в последнее время вдохновляет. Вариация на тему основного тригонометрического
тождества.
finit
fldln2 ; натуральный логарифм 2
fcos ; получаем косинус
fldln2
fcos
fmul st,st(1) ; (cos(ln2))^2
fldln2
fsin ; теперь синус
fldln2
fsin
fmul st(1),st ; (sin(ln2))^2
fincstp
fadd st,st(1) ; st0+st1=1 по основному тригонометрическому тождеству
fist mem
14. Красивый способ
stc ; установка флага переноса в 1
sbb eax,eax ; вычитание с заемом
neg eax ; -(-1)=1
15. В еax будет true, то есть 1
sub eax,eax
cmp eax,eax
sete al
16. Еще извратный способ
sub eax,eax
sub ecx,ecx
dec eax
mov cx,1fh
m1:
btc eax,ecx ; фишка в этой команде. инвертируем все биты, кроме последнего, тогда в самом регистре будет 1
loop m1
17.А еще можно так
sub eax,eax
stc ; установка флага переноса в 1
adc eax,eax ; сложнение с учетом флага переноса CF
18.Простенько, но со вкусом
sub eax,eax
or eax,1
19. Почти тоже самое
xor eax,eax
xor eax,1
20.Обалденный способ. 4 bsr над -1 и получаем 1)
sub eax,eax
dec eax
bsr eax,eax
bsr eax,eax
bsr eax,eax
bsr eax,eax
21. Тоже вариант
sub eax,eax
dec eax
shr eax,1fh ; логический сдвиг вправо
22. Скушный метод, но результат тот же
xor eax,eax
dec eax
and eax,1
23. Довольно неинтересно.. но все же
xor eax,eax
dec eax
neg eax
Пока на этом все......
От самых простых до самых извратных. Хорошая разминка для мозгов.
1. непохек
mov eax,1.
Просто положить в регистр единицу
2.
sub eax,eax /xor eax,eax (по отдельности не рассматриваю)
inc eax
Красиво, довольно коротко. Обнуляем, инкрементируем....
3. imul eax,0
inc eax
Тоже красиво. Обнуляем, инкрементируем
4. Сопроцессор, но тут нужна дополнительная переменная. mem dword ?
finit
fld1
fist mem
mov eax,mem
в eax - теперь 1
Сначала мы инициализируем сопроцессор (finit), потом загружаем в st0 1, потом отправляем
содержимое st0 в mem, mem ложим в eax )
5. Еще сопроцессор ( mem dword ?)
finit
fldpi
fcos
fchs
fist mem
mov eax,mem
То есть ложим в st0 число пи, находим косинус пи (-1), меняем знак, сохраняем значение
6. А теперь больше тригонометрии
finit
fldz
fcos
fist mem
mov eax,mem
Ищем косинус от нуля))))) А это 1)))
7. А еще можно так
sub eax,eax
sub al,-1
это 4 байта.
8. Самый мой любимый способ
sub eax,eax
bfs eax,0
В нулевой бит ложим 1=)
9. lea eax,[1]
Длинно, но все же....
10. Разновидность 5 метода, но беру модуль
finit
fldpi
fcos
fabs
fist mem
mov eax,mem
11.
sub eax,eax
dec eax
imul eax,eax
Ну это всем наверное ясно -1*(-1)=1
12. Этот способ я тоже люблю.
Делим двоичный логарифм 10 сам на себя.Аналогичный способ с любым др. числом (например с натуральным логарифмом 2 -
оба способа рассматриваются)
finit
fld2t
fld2t
fdiv st0,st1
fist mem
mov eax,mem
и соответственно
finit
fldln2
fldln2
fdiv st0,st1
fist mem
mov eax,mem
а можно еще с числом пи и десятичным логарифмом 2
finit
fldpi
fldpi
fdiv st0,st1
fist mem
mov eax,mem
и
finit
fldlg2
fldlg2
fdiv st0,st1
fist mem
mov eax,mem
13. Тригонометрия. Что-то меня тригонометрия в последнее время вдохновляет. Вариация на тему основного тригонометрического
тождества.
finit
fldln2 ; натуральный логарифм 2
fcos ; получаем косинус
fldln2
fcos
fmul st,st(1) ; (cos(ln2))^2
fldln2
fsin ; теперь синус
fldln2
fsin
fmul st(1),st ; (sin(ln2))^2
fincstp
fadd st,st(1) ; st0+st1=1 по основному тригонометрическому тождеству
fist mem
14. Красивый способ
stc ; установка флага переноса в 1
sbb eax,eax ; вычитание с заемом
neg eax ; -(-1)=1
15. В еax будет true, то есть 1
sub eax,eax
cmp eax,eax
sete al
16. Еще извратный способ
sub eax,eax
sub ecx,ecx
dec eax
mov cx,1fh
m1:
btc eax,ecx ; фишка в этой команде. инвертируем все биты, кроме последнего, тогда в самом регистре будет 1
loop m1
17.А еще можно так
sub eax,eax
stc ; установка флага переноса в 1
adc eax,eax ; сложнение с учетом флага переноса CF
18.Простенько, но со вкусом
sub eax,eax
or eax,1
19. Почти тоже самое
xor eax,eax
xor eax,1
20.Обалденный способ. 4 bsr над -1 и получаем 1)
sub eax,eax
dec eax
bsr eax,eax
bsr eax,eax
bsr eax,eax
bsr eax,eax
21. Тоже вариант
sub eax,eax
dec eax
shr eax,1fh ; логический сдвиг вправо
22. Скушный метод, но результат тот же
xor eax,eax
dec eax
and eax,1
23. Довольно неинтересно.. но все же
xor eax,eax
dec eax
neg eax
Пока на этом все......