Я не могу сохранить элемент массива в регистр, используя сборку x86

Ниже приведен мой код в сборке:

    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 байтов), но это не так. Я не уверен, почему это происходит.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

al и ah — значения 8-битный (1 байт). test1 и test2, по вашему мнению, «длинные», то есть либо 32-битные (4 байта), либо 64-битные (8 байтов), в зависимости от вашего компилятора/системы.

Если вы хотите сохранить значения в соответствующих переменных, вы можете использовать movzx (если без знака) или movsx (если со знаком).


Кроме того, обратите внимание, что если MemberLvl является long, то перемещение его в esi, тогда выполнение [esi], вероятно, будет неопределённым поведением, если только MemberLvl не содержит действительный адрес указателя. Если MemberLvl — это long *, то, вероятно, это нормально, но тогда [esi] — это 32-битное или 64-битное значение, и поэтому вам вообще не следует использовать al или ah.

ООО Спасибо! Это имеет больше смысла, поэтому теперь мой код использует символы типа. Моя другая проблема сейчас заключается в том, что я сохраняю первый элемент в al, однако, когда я сохраняю al в test1, он показывает случайный символ вместо первого элемента в массиве. Вы знаете, почему это может происходить? Спасибо.

Jen 06.04.2022 21:32

@Jen, если он показывает «случайные символы», то я думаю, что вы сохраняете неотображаемые коды символов в массиве. Я бы рекомендовал создать новый вопрос с более подробной информацией (например, окружающий код, который заполняет значения, как вы печатаете и т. д.).

ChrisMM 06.04.2022 21:35

Хорошо, я попробую это. Спасибо

Jen 06.04.2022 21:41

Другие вопросы по теме