2016-04-12 5 views
0

У меня есть проблема с манипулируя каждый байт отдельно, из шестнадцатеричного числа, например:Как работать с каждым байтом в DDword отдельно в Assembly?

ключ: DD 0xCAEFBABE

из этого, я хочу взять CA и сделать еще один DWord как

0x CA notCA CA notCA

и работать с ним, а затем перейдите ко второму байту EF и выполните то же самое.

Можете ли вы дать мне несколько советов или способ обработки?

+0

Это не ясно из вашего вопроса, хотите ли вы сделать это во время компиляции или во время выполнения. – Michael

+0

Я хочу сделать это во время выполнения, на самом деле я должен сделать функцию, которая проходит через ключ и берет каждый байт и делает из него другой ключ. – IdelHamza

ответ

1

Это должно быть достаточно легко:

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) 
+0

Майкл, большое вам спасибо, и чтобы напечатать результат, я должен просто нажать eax на мою функцию C++? – IdelHamza

+0

Или новый ключ находится в foo? – IdelHamza

+0

Новое значение находится в 'foo'. Вы можете сохранить его в 'key', если хотите, но было бы проще обработать оставшиеся байты исходного ключа, если вы оставите его неповрежденным. – Michael

0

Да. В сборке x86 (я использую синтаксис MASM) это просто. Вы можете использовать реестр, чтобы исправить адрес и обратиться к нему:

lea esi, key 

Затем доступ к его содержимому и маскирует результат (В «Little Endian формате» х86 самый низкий байт идет первым в последовательном порядке памяти, так это работает).

mov eax, dword ptr [esi] 
and eax, 0FFh 

Доступ к следующей DWORD выглядит

mov eax, dword ptr [esi+1] 
and eax, 0FFh 
+0

Извините, но могу ли я спросить, что означает 0FFh? Благодарю. – IdelHamza

+0

'0FFh' просто обозначает шестнадцатеричное значение 255 в синтаксисе MASM. 'h' является суффиксом для« шестнадцатеричного »и« 0 »является префиксом для« числа следует ». --- Мой ответ отличается и, вероятно, не подходит, но если вы объедините оба ответа, вы, вероятно, получите хороший результат. – zx485

+0

Спасибо тебе, что таша :). – IdelHamza