2010-09-11 6 views
1

У меня есть следующий код:Assembler мы вопрос

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 

Спасибо!

ответ

4

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

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

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

+0

+1 Вы также можете сказать, что причина неспособности изменить 'ds' с помощью одной из стандартных команд' mov' состоит в том, что в большинстве инструкций зарезервировано только 3 бита для кодирования регистра назначения, а это топор, bx, cx, dx, si, di, sp, bp уже используют все доступные возможности. Но это немного упростит ситуацию. –

+0

Да, это конкретное дизайнерское решение, чтобы инструкции были небольшими. – starblue

+0

В этом случае, когда в него входит 'mov ds, ax'? Я уверен, что это 'mov' с' ds' как регистр назначения;) У вас есть веский аргумент, и я просто играю! – Lazarus

0

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

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

+1

Я не думаю, что это причина, так как DS можно легко обновить после того, как прочитано полное значение. – starblue

+0

Если бы это было объяснение, не было бы никакой инструкции, такой как 'mul ax', потому что' ax' может быть «поврежден», поскольку он умножается. –

+0

@starblue, он может быть легко обновлен таким образом, если процессор имеет местоположение, в которое будет считываться значение, прежде чем загружать его в DS (например, «mov ax, @ Data», затем «mov ds, ax»), однако эффективность в дизайне может просто загрузите значение, направляемое в регистр. Я не говорю, что я определенно прав, я говорю, что это неправдоподобно. – Lazarus

1

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

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