Как бы я добавил 64-битный Big-Endian int в ASM? - PullRequest
2 голосов
/ 17 ноября 2011

Я новичок в сборке, но не новичок в программировании и в том, как оно работает в целом. Поскольку я уже знаю довольно много языков, я решил заставить свою первую программу ASM вычислять хэш SHA-1 входных файлов. У меня уже есть много отдельных частей, но у меня есть две проблемы; один я попрошу здесь помочь.

По сути, я запутался в понятиях порядковых чисел Big и Little и того, как их представлять в ASM. Цитировать из псевдокода SHA-1:

append length of message (before pre-processing), in bits, 
as 64-bit big-endian integer

Единственное, что приходит на ум, это, например, представить число 1 как:

[63 0's]1

Или

1[63 0's]

Или

[31 0's] 1 [32 0's]

По сути, моя мысль до сих пор такова:

mov    eax,  message ;Move message to be hashed into eax
shl    eax,  64      ;Shift message over enough bits to store 64-bits
or     eax,  msglen  ;Adds message length to the very end of message

Скорее всего, это неправильно, так как все это использует 32-битные регистры, поэтому смещение влево на 64-битное соединение приведет к огромному переполнению, но это еще одна проблема, которую мне еще предстоит решить.

Я думаю, что я сошел с пути, но в основном мой вопрос заключается в том, является ли приведенный выше код правильным способом добавления целого числа с прямым порядком байтов? Или у меня это задом наперед, или я просто полностью отключен во всем и т. Д. Не уверен, что это имеет смысл, слишком устал.

1 Ответ

1 голос
/ 17 ноября 2011

Двоичное представление числа 1 в виде 64-разрядного целого числа с прямым порядком байтов:

<- Start of message                                   End of message ->

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001

^ big (most significant) end
...