Я - программист новичка, который делает попытку блока впервые. Извините заранее, если это - невероятно хромой вопрос.
Мне сохранили символ в регистре EAX, но я должен переместить его в свой регистр DL. Когда я пробую: mov dl, eax я получаю ошибку C2443: конфликт размера операнда. Я знаю, что регистр eax составляет 32 бита, в то время как dl составляет 8 битов... я на чем-то?? Как я иду о решении этого.
Может, попробовать
xor edx,edx
mov dl, al
? Первая инструкция обнулить «ненужные» старшие биты edx (необязательно), а затем просто переместить младшие 8 из eax в edx.
Как отмечали другие, movzx делает это за один шаг. Стоит упомянуть, что в том же духе, если у вас было подписанное значение в al, вы могли бы использовать "movsx edx, al" для заполнения старших битов edx копией старшего разряда al, тем самым помещая 32-битное представление al со знаком в edx.
Если вы просто хотите получить доступ к младшим 8 битам eax, используйте al:
mov dl, al
Вы можете получить доступ к младшим 8 битам, 16 битам или 32 бита каждого регистра общего назначения путем изменения букв в начале или в конце. Для регистра eax использование eax означает использование всех 32 бита, ax - младшие 16 бит, а al - младшие 8 бит. Эквивалент для ebx - ebx, bx и bl соответственно, и так далее.
Обратите внимание, что если вы изменяете младшие 16 или 8 бит регистра, то старшие биты не изменяются. Например, если вы загрузите все единицы в eax, а затем загрузите ноль в al, тогда младшие 8 битов eax будут нулями, а старшие 24 бита будут единицами.
mov eax, -1 ; eax is all ones
mov al, 0 ; higher 24 bits are ones, lower 8 bits are zeros
Вероятно, вы хотите:
movzx edx, al
Это скопирует al в dl, а остальную часть edx заполнит нулями. Эта единственная инструкция эквивалентна этим двум инструкциям:
xor edx, edx
mov dl, al