Встроенная сборка X86, запись в массив C

Информация о сборке: Использование Visual Studio 2010 для написания встроенной сборки, встроенной в C

Здравствуйте, я пытаюсь записать в массив символов в C и пытается имитировать действие этого кода C:

resNum[posNum3] = currNum3 + '0';

В настоящее время это то, что у меня есть:

mov ebx, posNum3; 
mov resNum[ebx], edx; //edx is currNum3
add resNum[ebx], 48; // add 48 because thats the value of the char '0'

Я также попытался сделать это:

mov ebx, posNum3;
mov   eax, resNum[ebx] ;// eax points to the beggining of the string
mov eax, edx; // = currnum3
add eax, 48; // + '0'

Не повезло ни с чем из этого, помощь более чем ценится!

4 ответа

Решение

Проблема в инструкции

mov resNum[ebx], edx

перемещает 4 байта (целое слово) в пункт назначения, а не один байт. Вы, вероятно, хотите

mov byte ptr resNum[ebx], dl

вместо. Хотя ассемблер позволит вам не указывать префикс "size ptr" в адресе, вы, вероятно, этого не захотите, так как неправильное его использование приводит к тому, что ошибки будут плохо видны.

Большинство встроенных ассемблеров позволяет использовать name вместо size ptr [name]так что вы можете просто написать

mov al, currNum3
add al, 0x30 //'0'
mov edx, posNum3
mov ecx, resNum
mov byte ptr [edx+ecx], al

если resNum - глобальный массив, а не аргумент функции или локальная переменная, вы можете написать более короткий код:

mov al, currNum3
add al, 0x30 //'0'
mov edx, posNum3
mov byte ptr [resNum+ecx], al

Мой X86 asm ржавый, но... Если вы используете символы (8 бит), вам нужно сначала, прежде чем начать цикл, обнулить EAX, а затем переместить символ в AH или AL, что-то вроде:

; Прежде чем начать свой цикл
xor EAX, EAX; Если вы уверены, что не переполните 8-битное число, добавив 48, это может выйти за пределы цикла; ... код здесь для настройки цикла
mov EBX, posNum3
mov AL, resNum[EBX]
добавить AL, 48; ... остаток цикла

Обратите внимание, что компилятор справится с этим лучше, чем вы... Если вы не Майк Абраш или кто-то вроде него:)

Избегайте использования таких выражений, как

mov resNum[ebx], edx;

потому что вы никогда не знаете, что resNum, Это может быть выражение как esp + 4и нет кода операции для mov [esp + ebx + 4], edx, поэтому используйте вместо этого маленькие шаги.

Также, ebx это регистр, который должен быть сохранен при вызовах. См. http://msdn.microsoft.com/en-us/library/k1a8ss06%28v=VS.71%29.aspx для получения подробной информации и ознакомления с соглашениями о вызовах.

Другие вопросы по тегам