Как работать с каждым байтом в 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
Другие вопросы по тегам