Ниже приведен мой код в сборке:
mov esi, MemberLvl
mov edi, OfficerLst
mov al, [esi]
mov test1, al
mov ah, [edi]
mov test2, ah
В основной программе C++ я объявил список типа long с именами MemberLvl и OfficerLst и два типа long — test1 и test1.
Всякий раз, когда я пытаюсь запустить свой код, он продолжает говорить о конфликте размера операнда с мов тест1, аль и мов тест2, ах.
Я думаю, что каждый массив хранится в esi и edi. Затем я сохраняю первый элемент в al или ah, получая их первый адрес памяти. Поскольку каждый long имеет 8 байтов, а регистр al или ah — 8 байтов, я думаю, что он сможет сохранить это в test1 и test2 (оба объявлены как длинные, 8 байтов), но это не так. Я не уверен, почему это происходит.
al
и ah
— значения 8-битный (1 байт). test1
и test2
, по вашему мнению, «длинные», то есть либо 32-битные (4 байта), либо 64-битные (8 байтов), в зависимости от вашего компилятора/системы.
Если вы хотите сохранить значения в соответствующих переменных, вы можете использовать movzx
(если без знака) или movsx
(если со знаком).
Кроме того, обратите внимание, что если MemberLvl
является long
, то перемещение его в esi
, тогда выполнение [esi]
, вероятно, будет неопределённым поведением, если только MemberLvl
не содержит действительный адрес указателя. Если MemberLvl
— это long *
, то, вероятно, это нормально, но тогда [esi]
— это 32-битное или 64-битное значение, и поэтому вам вообще не следует использовать al
или ah
.
@Jen, если он показывает «случайные символы», то я думаю, что вы сохраняете неотображаемые коды символов в массиве. Я бы рекомендовал создать новый вопрос с более подробной информацией (например, окружающий код, который заполняет значения, как вы печатаете и т. д.).
Хорошо, я попробую это. Спасибо
ООО Спасибо! Это имеет больше смысла, поэтому теперь мой код использует символы типа. Моя другая проблема сейчас заключается в том, что я сохраняю первый элемент в al, однако, когда я сохраняю al в test1, он показывает случайный символ вместо первого элемента в массиве. Вы знаете, почему это может происходить? Спасибо.