Встроенная сборка X86, запись в массив C - PullRequest
0 голосов
/ 31 октября 2010

Информация о сборке: использование 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 ]

2 голосов
/ 01 ноября 2010

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

mov resNum[ebx], edx

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

mov byte ptr resNum[ebx], dl

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

0 голосов
/ 31 октября 2010

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

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

0 голосов
/ 31 октября 2010

Большинство встроенных ассемблеров позволяют использовать 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
0 голосов
/ 31 октября 2010

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

; Before you start your loop
xor EAX, EAX ; If you're sure you won't overflow an 8 bit number by adding 48, this can go outside the loop
; ... code here to setup loop
mov EBX, posNum3
mov AL, resNum[EBX]
add AL, 48
; ... rest of loop

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

...