Size: a a a

Ассемблер

2021 September 04

D

Den in Ассемблер
Да вот сюда кину не секрет, делаю пары чтобы числа побольше оперировать, пока только add работает до 11 знаков, но с минусами вот такая история получается!
источник

d

disba1ancer in Ассемблер
так что за операцию ты реализуешь инверсию?
источник

D

Den in Ассемблер
ну с 10-ю девятками все нормально прокатывает хотя там есть уже в edx 2-ки
источник

E

Entusiast in Ассемблер
Так а что  делать-то для реализации ошибки?
источник

D

Den in Ассемблер
можно исходник запустить у него точка останова по int3 в этом месте будет
источник

E

Entusiast in Ассемблер
Да это я вижу
А что вводить?
источник

D

Den in Ассемблер
вводить -99999999999   11 девяток с минусом в каждое поле и add
источник

d

disba1ancer in Ассемблер
кажется 2 neg не делают инверсию для регистровой пары
источник

D

Den in Ассемблер
на 10-ти символах нормально делают вроде
источник

d

disba1ancer in Ассемблер
имхо надо так хотя бы:
not edx
neg eax
jc @f
add edx, 1
@@:
источник

D

Den in Ассемблер
inv такой комманды не знал :)
источник

d

disba1ancer in Ассемблер
чёрт память подводит, not
источник

D

Den in Ассемблер
эх а я уж подумал багаж пополнил! :))
источник

d

disba1ancer in Ассемблер
есть ещё вариант:
not eax
not edx
stc
adc eax, 0
adc edx, 0
источник

d

disba1ancer in Ассемблер
можно без stc:
not eax
not edx
add eax, 1
adc edx, 0
источник

D

Den in Ассемблер
Спасиб, завтра попробую обязательно, вообще странно до 11 символов норм работает!
источник

d

disba1ancer in Ассемблер
оно может работать рандомно, если нижняя половинка 0 не содержит, то всё хорошо, хотя там ещё старшая половинка должна на единицу отличаться от правильного
источник

E

Entusiast in Ассемблер
У тебя ещё не с этим проблема..

1111111111+1111111111 = 80000000002072745074

И проблема в функции WriteNum
(Потому что в EAX лежало правильное число, но после вызова WriteNum - туда перезаписался мусор)

И я почти уверен, что с отрицательными значениями тоже самое
источник

E

Entusiast in Ассемблер
Ну да, как и думал @Quriositer
Вся проблема в WriteNum
Когда вводишь число, больше 9 - он ломается, и вводит мусор, потому что таких чисел в представлении нет. Нужно их разбивать.
Как и с единицами вышло:
-999999999 - (-999999999) = -1999999998
-9999999999 - (-9999999999) = -80000000015705032702

(Ещё насчёт больших девяток - перепроверь, какие значения кладутся в память, потому что мне казалось, что там что-то не то лежало, наверное ещё проблема с получением чисел)
источник

d

disba1ancer in Ассемблер
я там свой гист с memcpy обновил, добавил проверок, чтобы не было переполнений буфера
источник