различия между регистрами общего назначения в 8086 году - PullRequest
0 голосов
/ 20 декабря 2018

В 8086 году эта структура верна:

mov bh,[bx]

, но это не правильно:

mov bh,[cx]

Я не знаю почему.Я думаю, что регистры общего назначения (AX, BX, CX, DX, SP, BP, SI и DI) являются регистрами, которые мы можем использовать для любых целей, и утверждение, что BX для базового адреса или CX для счетчика, является простоконвенция, и они не отличаются вообще.Но, похоже, я не прав.Вы можете объяснить причину?И какая точная разница между этими регистрами?(Например, почему я не могу сохранить базовый адрес в регистре cx?)

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Общее назначение означает, что эти регистры могут использоваться в качестве операндов с «инструкциями общего назначения» , такими как mov или add.

Однако все эти регистры имеютхотя бы одна специальная функция (список неполон):

  • ax всегда предоставляет входные данные и получает результат mul / div операций
  • ax какрегистр аккумулятора по умолчанию имеет несколько более коротких кодировок различных инструкций
  • bx является одним из четырех регистров (bx, bp, di, si), которые можно использовать для косвенногоадресация памяти в 16-битных режимах адресации.
  • cx используется в качестве счетчика несколькими инструкциями, например, счетчиками сдвига, loop, а rep
  • dx содержитстаршие биты результата в умножениях от 16 до 32 разрядов, и те же самые входные данные в делениях от 32 до 16 разрядов
  • sp затрагиваются и используются push иpop инструкции, а также различные call и retТип управления передачей инструкции.Также используется асинхронно аппаратными прерываниями. На
  • bp влияют инструкции enter и leave.(Но не используйте enter, это медленно).
  • si и di используются строковыми инструкциями, такими как movsb
0 голосов
/ 20 декабря 2018

На 8086 доступны только следующие режимы адресации:

[bx]       [bx + foo]
[foo]      [bp + foo]
[si]       [si + foo]
[di]       [di + foo]
[bx + si]  [bx + si + foo]
[bx + di]  [bx + di + foo]
[bp + si]  [bp + si + foo]
[bp + di]  [bp + di + foo]

, где foo - это некоторое значение.Обратите внимание, что никакой режим адресации с участием cx не существует, поэтому [cx] не является допустимым операндом памяти.

Регистры ax, cx, dx, bx, sp, bp, si и di называются регистры общего назначения , потому что они доступны как операнды во всех инструкциях общего назначения.Это отличается от регистров специального назначения, таких как es, cs, ss, ds (регистры сегментов), ip (указатель инструкций) или регистра флагов, которые доступны только со специальными инструкциями, созданными только для этой цели.

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

В дополнение к этому ограничению существуют некоторые инструкции, которые неявно работают с фиксированными регистрами.Например, инструкция цикла работает исключительно на cx, а 32-битное значение imul работает исключительно на dx:ax.Если вы хотите эффективно использовать эти инструкции, полезно помнить о предполагаемой цели каждого регистра общего назначения.

...