Встроенная сборка 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 для получения подробной информации и ознакомления с соглашениями о вызовах.