Получить char в позиции индекса в массиве символов Встроенная сборка X86

У меня много проблем с доступом к значению в массиве символов в определенном месте. Я использую встроенную сборку на С++ и визуальную студию (если это поможет). Вот мой код:

char* addTwoStringNumbers(char *num1)
{
    // here is what I have tried so far:
    movzx eax, num1[3];
    mov al, [eax]
}

Когда я отлаживаю, я вижу, что num1[3] - это значение, которое я хочу, но я не могу сделать ни al, ни eax равным этому значению, кажется, это всегда какая-то ссылка на указатель. Я также безуспешно экспериментировал с Byte PTR.


person Quentin    schedule 30.10.2010    source источник
comment
Вы должны опубликовать настоящий код. Этот фрагмент недействителен, вы должны хотя бы сообщить компилятору C++, что тело кода является ассемблером, иначе он попытается проанализировать его как код C++. msdn.microsoft.com/en-us/ библиотека/5f7adz6y%28v=VS.71%29.aspx   -  person Clifford    schedule 31.10.2010


Ответы (2)


Я не силен ни во встроенном ассемблере, ни в синтаксисе MASM, но вот несколько советов:

1) Попробуйте это:

mov   eax, num1 ;// eax points to the beggining of the string
movsx eax, [eax + some_index] ;// movsx puts the char num1[some_index] in eax with sign extend.

(movzx для беззнаковых символов, поэтому мы использовали movsx)

2) Вам нужно передать значение из eax в C. Самый простой способ - объявить переменную и поместить туда результаты: int rez; __asm { mov rez, eax; };

3) Если вы хотите написать всю функцию на ассемблере, вам следует подумать об использовании ключевого слова naked (и прочитать о соглашениях о вызовах). Если нет, убедитесь, что вы сохранили регистры и не повредили стек.

person ruslik    schedule 30.10.2010
comment
работает отлично! Большое спасибо за помощь. Я посмотрю на голое ключевое слово - person Quentin; 31.10.2010
comment
@Quentin Также попробуйте NASM без каких-либо VS. Это поможет лучше понять, что происходит. - person ruslik; 31.10.2010

Похоже, кто-то делает домашнее задание по ICS 51! Следуйте совету Руслика, и все будет готово в кратчайшие сроки.

person Jack Black    schedule 30.10.2010