Язык ассемблера Абсолютные адреса и регистры сегментов - PullRequest
2 голосов
/ 13 декабря 2011

проблема обзора перечисляет эти регистры в шестнадцатеричном виде:

cs = ????  sp = 0300  ax = a66a  ip = 01cf
ds = 4100  bp = 0003  bx = 1234  
ss = 48ee  si = 0100  cx = 00ff
es = 4cee  di = 1000  dx = 0000
  1. Абсолютный адрес следующей команды, которая должна быть выполнена, равен 40f0f.

    40f0f  
    -01cf
    _____
    40d40 / 10 = 40d4 = cs
    
  2. Всегда ли размер сегмента данных в байтах всегда равен сегменту стека минус сегмент данных * 10?48ee - 4100 = 7ee0.Аналогично, всегда ли сегмент кода в байтах всегда равен сегменту данных минус сегмент кода * 10?48ee - 40d4 = 81a0.

  3. Для mov cx,[bx + si] абсолютный адрес исходного операнда 42334.

    bx = 1234
    si = 0100
    _________
         1334
    
    ds = 4100 * 10 = 41000 + 1334 = 42334
    
  4. Для mov cx,[di - 4], абсолютный адрес исходного операнда равен 41ffc.

    di = 1000
         -  4
    _________
         0FFC
    
    ds = 4100 * 10 = 41000 + 0ffc = 41ffc
    
  5. Для mov cx,[bp + si - 3] абсолютный адрес исходного операнда равен 48fe0.

    bp = 0003
    si = 0100
          - 3
    _________
         0100
    
    ss = 48ee * 10 = 48ee0 + 0100 = 48fe0
    

Собираюсь ли я решить их правильно?Как узнать, когда использовать сегмент стека для этих вычислений и когда использовать сегмент данных?

1 Ответ

1 голос
/ 13 декабря 2011

Для вычислений адресов, включающих bp или sp или операции со стеком, такие как push или pop, регистр сегмента неявно ss, для других адресов ds.Исключение: если вы используете строковую инструкцию, регистр сегмента назначения неявно равен es.

...