Nano Hash - криптовалюты, майнинг, программирование

Почему CX работает в «[]» в 16-битной сборке, если это не базовый или индексный регистр?

При использовании MASM 6.15 под DOSBox всякий раз, когда я пытаюсь сделать:

mov al, [cx]

or

mov al, [cx + bx]

or

mov al, [cx + 4]

Я получаю сообщение об ошибке: «Разрешены только базовые или индексные регистры».

Но опять же, допустим, у меня есть массив var1. Если я сделаю:

.model small
.stack 4096

.data
 var1 BYTE 1, 2, 3, 4, 5, 6, 7, 8, 9

.code
main proc
mov ax, @data
mov ds, ax

mov cx, 5
mov al, [var1 + cx]

mov ah, 4Ch
int 21h
main endp
end main

Он отлично работает. Почему он не дает ту же ошибку, что и выше? CX не является базовым или индексным регистром.

В чем вся рабочая суть оператора []?

22.10.2018

  • Возможный дубликат 16-разрядной сборки: невозможно удалить некоторые регистры 22.10.2018
  • mov al, [var1 + cx] на самом деле не должно работать. cx нельзя использовать в качестве базового или индексного регистра (базовые регистры — bx и bp, индексные регистры — si и di. Любой из них или оба могут быть опущены). Я подозреваю, что вы неверно истолковали вывод ассемблера здесь. 22.10.2018
  • @fuz Проверьте код, который я вставил выше. Собирается нормально, без ошибок. Я использую masm615 (DOSBox). Это не дубликат, я не говорю, какие регистры должны работать. Я задаю конкретный вопрос кода, почему он работает, когда не должен. 22.10.2018
  • Какой код генерирует для этого ассемблер? 22.10.2018
  • @prl Что ты имеешь в виду? Вы имеете в виду бинарник? Как я могу это предоставить? 22.10.2018
  • @ParkerQueen Спасибо за разъяснения. Закрытое голосование отозвано. Возможно, вы захотите обновить заголовок вопроса, чтобы сделать его более понятным. Что-то вроде «Почему mov al, [var1 + cx] ассемблируется, несмотря на то, что cx не является действительным базовым или индексным регистром?» 22.10.2018
  • @ParkerQueen Используйте любой дизассемблер для дизассемблирования бинарного файла. В DOS debug вы можете использовать команду u для дизассемблирования кода. 22.10.2018
  • Посмотрите на файл листинга ассемблера. 22.10.2018

Ответы:


1

Это ошибка в некоторых версиях MASM. Бывают такие случаи, когда MASM пытается неправильно закодировать инструкцию, что невозможно. Это должно было вызвать ошибку при попытке закодировать это, так как CX нельзя использовать в качестве базы или индекса в 16-битной адресации.

mov al, [var1 + cx]

Вместо того, чтобы генерировать ошибку, он неправильно генерирует ее как:

mov bh, var1[bx+si]

Недопустимая инструкция кодируется как:

8A B8 xx xx

Где xx xx — это смещение var1.

22.10.2018
  • Можете ли вы порекомендовать версию masm, которая этого не делает? Я использую masm615 прямо сейчас. 22.10.2018
  • @ParkerQueen Если вы пытаетесь создать 16-битные исполняемые файлы для использования в DOS, то MASM615 — это последняя версия, где это возможно. Если вы переключитесь на другой ассемблер, это может решить эту проблему. JWASM в целом близок к MASM и в этом случае выдаст ошибку. JWASM можно найти здесь: sourceforge.net/projects/jwasm/files. Вы можете собрать файл сборки с помощью jwasm -mz file.asm, который сгенерирует file.obj, который затем можно слинковать с помощью сегментированного компоновщика DOS. 22.10.2018
  • @MichaelPetch: я собрал пример OP с ML версии 10.00.40219.01 (с переключателем /OMF) - и ошибка все еще существует. MASM 5.1 и более ранние версии выдают правильное сообщение об ошибке. TASM также показывает правильное поведение. 22.10.2018
  • Эта ошибка есть даже в MASM 14.10.25019.0, поэтому похоже, что она существует в MASM 6 или более поздней версии и, вероятно, никогда не будет исправлена. (В противном случае вы можете использовать последнюю версию MASM для создания 16-разрядных исполняемых файлов MS-DOS, хитрость заключается в том, чтобы найти компоновщик, который может это сделать.) 22.10.2018
  • @RossRidge: Вероятно, вам придется вернуться к версии 5.1, как предлагает rkhb, но тогда она не будет работать под 64-битной Windows, поскольку эти версии были для DOS и OS/2. Я рекомендую JWASM, поскольку он основан на совместимом с MASM ассемблере Watcom; ассемблер работает на платформах Win32+; не показывает эту ошибку. Что касается компоновщика, который может генерировать 16-битные исполняемые файлы, его можно найти здесь: capp- sysware.com/downloads/link16.exe 22.10.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..