Можно ли использовать регистр указателя дважды? - PullRequest
0 голосов
/ 29 мая 2018

Привет всем, я новичок в сборке, и мне трудно понять, почему код ниже работает.Я узнал, что si содержит адрес сегмента данных, и поскольку a и b находятся в разных местах сегмента данных, он не может использоваться для них обоих, и мне пришлось бы использовать di для b.Но по какой-то причине приведенный ниже код (который копирует первый символ a в первый символ b) работает нормально

.model  small
.stack  100H
.data
  a  db   '     This      is     a          test     $'
  b   db   100 dup('$')
.code
  mov si,0
  mov al,a[si]
  mov b[si],al
.exit
end

Мое основное недоразумение - в чем разница между a [si] и b [si] и [Си] любое объяснение будет высоко оценено.

1 Ответ

0 голосов
/ 29 мая 2018

Я узнал, что si содержит адрес сегмента данных

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

Мое основное недоразумение - в чем разница между [si] и b [si] и [si] [...]

  • [si] принимает адрес в si и ссылается на данные по этому адресу.
  • a[si] принимает адрес в si плюс адресная константа a для справочных данных.
  • b[si] принимает адрес в si плюс адресную константу b для справочных данных.

Линия

mov al, a[si]

перемещает байт в a + si в al.

mov b[si], al

перемещает байт в al в байт в b + si.Это транзитивная цепочка операций, поэтому a[si] = b[si] после этого.

...