Сборка Преобразование MOV / MOVZX и MOVSX в код C (без встроенного ассемблера) - PullRequest
6 голосов
/ 14 октября 2011

Для эмулятора asm, который я пытаюсь написать, чтобы преобразовать код ASM в эквивалентный рабочий код, просто работающий ... лучший код - это тот, который может быть выполнен в одну строку или две-три чаще, все равноо скорости.

Из моего понимания.MOVZX будет таким же, как MOV .. если это будет сделано в C ++.

MOV преобразование.

MOV ESI,DWORD PTR [ESP+8]

будет похоже на

regs.d.esi = *(unsigned int *)(regs.d.esp+0x00000008);

MOVZX преобразование.

MOVZX EAX,BYTE PTR DS:[EDI]

было бы похоже на

regs.d.eax = *(unsigned char *)(regs.d.edi);

почти то же самое, без изменений, что когда-либо.

Теперь MOVSX У меня проблемы с преобразованием впростой код на Си ... кажется таким же, как и два выше ... за исключением того, что он пытается добавить как можно больше полностью установленных бит перед перемещенным значением, как это возможно .. как

000000C7 становится FFFFFFC7

Ответы [ 2 ]

4 голосов
/ 14 октября 2011

movsx - движение со знаком-удлинителем.Эти установленные биты являются копией знакового бита из исходного значения и будут понятны, если оригинал не будет отрицательным.Он работает так же, как и другие ваши преобразования, за исключением того, что вам нужно использовать подписанный тип вместо беззнакового.

regs.d.eax = *(signed char *)(regs.d.edi); // movsx eax, byte ptr ds:[edi]
0 голосов
/ 11 мая 2017

Самый быстрый способ найти очень быстрые C-эквиваленты MOVSX и MOVXZ - это просто целочисленное присвоение переменной от типа с младшими битами к типу с старшими битами. Обе переменные должны быть преобразованы по типу либо в тип со знаком (для MOVSX), либо в тип без знака (MOVZX).

Например, C эквивалент "movzx ebx, al" будет:

(unsigned int) ebx = (unsigned char) al;

C эквивалент "movsx ebx, al" будет:

(signed int) ebx = (signed char) al;

Просто убедитесь, что ваш тип char 8-битный, а тип int 32-битный и т. Д.

...