2016-04-24 3 views
2

Я пытаюсь написать простой цикл в ASM. Мне нужно получить доступ два массива, которые написаны за пределами фрагмента кода в C++ (будучи OrigChars и EncrChars)C++/ASM - «Конфликт размера операнда», «Неверный тип операнда»

char temporary_char;      

__asm {    
     xor ebx, ebx    
     jmp checkend    

     loopfor: inc ebx       

     checkend: cmp ebx, len    
     jge endfor1    

     mov bx, word ptr[ebx + OrigChars] 
     mov temporary_char, bx //error - "operand size conflict" 

     push eax 
     push ecx 

     movzx ecx, temporary_char  
     lea eax, EKey   

     push eax     
     push ecx 

     call encrypt1    
     add esp, 8    

     mov temporary_char, al  

     pop ecx 
     pop eax 

     mov EncrChars[ebx], temporary_char //error - "improper operand type" 

     jmp loopfor   
} 

строки с ошибками на уже комментировали выше.

В двух словах, почему не будет это работа для меня:

  • мов temporary_char, BX // temp_char = OChars [я];
  • mov EncrChars [ebx], tempor_char // EncrChars [ebx] = tempor_char;
+0

Вы уверены, что 'mov bx, word ptr [ebx + OrigChars]' не работает? Он выглядит как единственный правильный в списке маркеров проблемных insns. (Btw, см. [X86 tag wiki] (http://stackoverflow.com/tags/x86/info) для большого количества полезных ссылок. –

ответ

3
mov bx, word ptr[ebx + OrigChars] 
mov temporary_char, bx //error - "operand size conflict" 

С temporary_char имеет тип полукокса вам просто нужно заменить BX на BL.
Лучше по-прежнему использовать AL, потому что вы используете EBX в качестве индекса адресации!

mov al, byte ptr [OrigChars + ebx] 
mov temporary_char, al 

mov EncrChars[ebx], temporary_char //error - "improper operand type" 

Вы не можете иметь 2 ссылки памяти в одной и той же инструкции. Используйте регистр прерываний:

mov al, temporary_char 
mov byte ptr [EncrChars + ebx], al 
+0

Спасибо, исправил обе проблемы, а также объяснил, почему достаточно. – ozank

+0

@ozank: Если вы хотите обнулить остальную часть регистра при загрузке байта, используйте 'movzx ebx, byte ptr [mem]' или аналогичный. Существует также «movsx», который расширяет знак. Значимые или не имеющие нулевой нагрузки нагрузки не стоят ничего лишнего (за исключением пары байтов размера кода) и могут избежать замедления частичного регистра из более поздних инструкций. (Или на этом insn, на процессорах, отличных от семейств Intel P6 или SnB, где частичная запись reg имеет ложную зависимость от всей reg.) –

0

char тип обычно 8-разрядный. bx регистр 16 бит. Это ваше несоответствие.

+0

Хорошо, как я исправить это? Извините, что я новичок в ASM, необходимо урезать регистр или что-то в этом роде – ozank

+0

Наоборот, при первой ошибке ваше ограничение - это назначение (тип 'char'), которое меньше исходного (16-разрядный регистр). Вы должны использовать более крупный тип для своего' tempor_char'. – SomeWittyUsername

+0

Я изменил тип 'tempor_char' на строку, но по-прежнему получаю« неправильный тип операнда »внизу. – ozank

Смежные вопросы