Нужна помощь с базовым ASM - PullRequest
3 голосов
/ 27 апреля 2010

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

char encode(char plain){
    __asm{
        mov eax, plain
        add eax, 2      
        ret
    }
    //C code
    /*
    char code;
    code = plain+2;

    return code;*/
}

Первая проблема заключается в том, что visual studio жалуется, что размер регистра не совпадает, т. Е. Eax слишком мал / велик для char. У меня сложилось впечатление, что они оба были DWORD. Кроме того, если я оставлю переменную в eax и ret в сборке, она на самом деле вернет эту переменную, верно?

Ответы [ 4 ]

2 голосов
/ 27 апреля 2010

Помните, вы всегда можете посмотреть на вывод ассемблера файла c для подсказок о том, как что-то перевести. Обычно это один флаг, который вы должны включить.

1 голос
/ 27 апреля 2010

Да, по крайней мере, с большинством компиляторов C на x86 (хотя это теоретически не гарантировано) все, что вы положили в [[e] a] x, будет рассматриваться как возвращаемое значение 1/2/4 байта.

Нет, символ (обычно) не будет мечом - это будет байт.

char encode(char plaintext) { 
    __asm { 
        mov al, plaintext
        add al, 2
        leave
        ret
    }
}
1 голос
/ 27 апреля 2010
  1. C char s обычно составляют один байт, поэтому попробуйте использовать AL вместо EAX (это относится к младшему байту того же регистра).
  2. Строго говоря, инструкция RET просто извлекает адрес возврата из стека и передает туда управление. Стандартное соглашение о вызовах x86 говорит, что возвращаемые значения должны быть помещены в EAX.
0 голосов
/ 27 апреля 2010

Символ - это 8 бит или один байт. Регистр eax составляет 32 бита, или 4 байта, или два 16-битных слова, или одно 32-битное слово. И то, что распознается как возвращаемое, зависит от компилятора и кода, но помещение значения в eax, вероятно, вернет это 32-битное значение.

...