Как я могу умножить два шестнадцатеричных 128-битных числа в сборке
У меня есть два 128-битных числа в памяти в шестнадцатеричном формате, например (little-endian):
x:0x12 0x45 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
y:0x36 0xa1 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Я должен выполнить беззнаковое умножение между этими двумя числами, чтобы мой новый номер был:
z:0xcc 0xe3 0x7e 0x2b 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Теперь я знаю, что я могу переместить половину числа х и у вrax
а такжеrbx
регистры и, например, сделатьmul
операция, и сделать то же самое с другой половиной. Проблема в том, что при этом я теряю перенос, и я понятия не имею, как мне этого избежать. Это около 4 часов, я сталкиваюсь с этой проблемой, и единственное решение, которое я могу увидеть, это преобразование в двоичном виде (and
<->shl,1
).
Можете ли вы дать мне некоторую информацию об этой проблеме?
Я думаю, что лучшее решение - взять один байт по времени.