В чем разница между этими инструкциями по загрузке movw в AX и movb в AL от нечетного смещения в массиве .short?

.global main

.data
arr: .short 1, 0xEA, 0x2, 0x3, 0b1010

.text
main:

      lea (arr), %rbx
      movb 3(%rbx),%al #1

      movw arr+3, %ax #2

когда я пробую этот код, al получает значение 0x0, однако ax получает значение 0x200 можешь сказать почему так? какая разница между №1 и №2?

Один и тот же адрес загрузки (оба неэффективно используют 32-битную абсолютную адресацию, а не RIP-относительную), но один объединяет один байт в конец RAX, а другой объединяет 2 байта (слово).

Peter Cordes 09.04.2022 14:29

Разница должна быть очевидна, первый загружает только al (младшие 8 бит), а второй загружает ax (16 бит). Обратите внимание, что al равно нулю в обоих случаях, как и ожидалось. 3(%rbx) и arr+3 делают одно и то же, важно то, что movb против movw. Кроме того, в ассемблере используется байтовая адресация, а .short составляет 2 байта, поэтому arr+3 является старшим байтом 0xEA (который равен нулю) и адресация смещена.

Jester 09.04.2022 14:29

У нас были предыдущие вопросы и ответы о несоосных нагрузках и о том, какие данные вы получаете, некоторые с хорошими ответами. Однако я не могу найти его прямо сейчас и не уверен, что есть дубликат, который также явно покрывает очевидную разницу в загрузке 1 и 2 байта.

Peter Cordes 09.04.2022 14:40
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
3
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Поскольку x86 — это архитектура с прямым порядком байтов, данные в arr выглядят так:

arr+0   +1   +2   +3   +4   +5   +6   +7   +8   +9
 0x01 0x00 0xEA 0x00 0x02 0x00 0x03 0x00 0x0A 0x00

#1 считывает данные в al. al — это однобайтовый регистр, поэтому 0x00 загружается в +3, и значение становится 0x0.

#2 считывает данные в ax. ax — двухбайтовый регистр, поэтому загружается 0x00 0x02 и значение становится 0x200.

Разница заключается в размере регистров назначения.

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