Ассемблер мов выпуск - PullRequest
       23

Ассемблер мов выпуск

1 голос
/ 11 сентября 2010

У меня есть следующий код:

mov  ax,@data
mov  ds,ax

Почему я не могу так написать?

mov ds,@data

Весь источник:

   .MODEL small
   .STACK 100h
   .DATA
   HelloMessage DB 'Hello, world',13,10,'$'
   .CODE 
   .startup
   mov  ax,@data
   mov  ds,ax
   mov  ah,9
   mov  dx,OFFSET HelloMessage
   int  21h
   mov  ah,4ch
   int  21h
   END

Спасибо!

Ответы [ 3 ]

4 голосов
/ 11 сентября 2010

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

Подобные ограничения вполне нормальны для языков ассемблера.Большинство архитектур содержат некоторые регистры, которые обрабатываются особым образом (например, слово состояния процессора), хотя, как правило, меньше, чем архитектура x86.

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

1 голос
/ 11 сентября 2010

Регистр общего назначения как «топор» предназначен для хранения 16-битного числа, указывающего на данные (в вашем случае это строка внутри DATA)

Таким образом, если вы попытаетесь напрямую передать данные в специальный регистр (ds или сегмент данных здесь), он не будет работать правильно, поскольку не знает, как принять данные таким образом. Таким образом, мы сначала получаем этот «номер» или точку в ячейке памяти, где начинаются данные, и передаем эту точку в регистр DS.

0 голосов
/ 11 сентября 2010

Я не эксперт, но вот как я понимаю это ограничение для работы.

Регистры сегмента используются для управления тем, какой сегмент памяти используется инструкциями регистра, как, таким образом, последнее, что вы хотитедолжен загрузить регистр сегмента (DS в данном случае, который является регистром сегмента данных) из ячейки памяти.Модификация DS может привести к изменению читаемой области памяти в процессе обновления DS, то есть первые биты / байт, загруженные в DS, теперь заставляют его указывать на другой сегмент, прежде чем остальная часть будет прочитана.Безопаснее считывать значение в Аккумулятор (AX) или другой регистр общего назначения, поэтому теперь значение находится в процессоре, когда оно загружается в регистр сегмента, поэтому нет вероятности повреждения значения во время загрузки.

...