Как работать с каждым байтом в DDword отдельно в Assembly?
У меня проблема с манипулированием каждым байтом отдельно, начиная с шестнадцатеричного числа, например:
ключ: DD 0xCAEFBABE
Исходя из этого, я хочу взять CA и сделать еще один DWord, как
0x CA не CA CA не CA
и работать с ним, а затем перейти ко второму байту EF
и сделать то же самое.
Можете ли вы дать мне совет или метод для обработки?
2 ответа
Решение
Это должно быть достаточно просто:
key: dd 0xCAEFBABE
foo: dd 0
mov ah,[key + 3] ; 0xCA
mov al,ah
not al ; ax = (0xCA << 8) | not CA
mov [foo],ax
mov [foo+2],ax ; foo = 0xCA(not CA)CA(not CA)
Да. В сборке x86 (я использую синтаксис MASM) это просто. Вы используете регистр, чтобы исправить адрес и обратиться к нему:
lea esi, key
Затем вы получаете доступ к его содержимому и маскируете результат (в "Little Endian Format" x86 младший байт идет первым в последовательном порядке памяти, так что это работает).
mov eax, dword ptr [esi]
and eax, 0FFh
Доступ к следующему DWORD выглядит
mov eax, dword ptr [esi+1]
and eax, 0FFh