TASM - физический, логический, эффективный адрес; получение адр.

Тема в разделе "WASM.BEGINNERS", создана пользователем crashtua, 2 мар 2012.

  1. crashtua

    crashtua New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    4
    Есть некоторые непонятки с видами адресов. Прошу поправить меня если я не правильно что то описал.
    Логический адрес:dntknw:сегментная часть):dntknw:эффективный адрес), где сегментная часть-содержание сегментного регистра.
    Эффективный адрес=смещение=offset:содержимое базового регистра (base) + содержимое индексного регистра (index) + смещение (displacement).
    Физический адрес:dntknw:сегментная часть)*16+(эффективный адрес).
    И вобщем вопросы, по коду:
    Код (Text):
    1. .386
    2. ASSUME CS:CODE, DS:DATA, SS:STK    
    3. DATA SEGMENT USE16
    4.     DB 33d dup (?)
    5. DATA ENDS
    6. STK SEGMENT USE16 STACK
    7.     DB 100h dup(?)
    8. STK ENDS
    9. CODE SEGMENT USE16
    10. start:
    11.     JMP @run
    12.     STRING DB   'qwerty qwertyuiopasdf, qwert, qwe qwe'
    13.     l equ 33d
    14.     @run:
    15.     mov AX, DATA
    16.     mov DS, AX
    17.     LEA ax, cs:[0044h]
    18.     MOV AX, 0B800h  ; адрес видеобуфера
    19.     MOV ES, AX ; адрес видеобуфера в ES
    20.     MOV EBX, 0 ; счетчик в 0
    21.     LEA EDI, STRING ; адрес рядка(смещение относительно чего?)
    22.     MOV AH, 6 ; цвет
    23.     @loop: 
    24.     MOV AL, CS:[EBX + edi] ; в AL символ
    25.     MOV ES:[3520d + EBX*2], AX ; с AL в видеобуфер, 25 строчка
    26.     MOV DS:[EBX], AL ; символ в сегмент данных
    27.     MOV SS:[EBX], AL ; символ в сегмент стека   
    28.     INC EBX ; счетчик +1
    29.     CMP EBX, l ; сравниваем счетчик с длиной строки
    30.     JB  @loop ; переходим по CF=1
    31.     MOV AH, 1              
    32.     INT 21h            
    33.     MOV AX, 4c00h          
    34.     INT 21h    
    35. code ends
    36. END start
    LEA даст нам смещение относительно того сегмента в котором находится наш STRING?
    Как узнать логический адрес операнда ES:[3520d + EBX*2] в MOV ES:[3520d + EBX*2], AX?
    Каким будет логический и физический адрес JMP @run(фактически адреса метки start:? препод задавал вопрос именно про адрес метки, но метка же адреса не имеет?)?
    Как процессор будет вычислять эффективный адрес ES:[3520d + EBX*2] ? Какие части из "содержимое базового регистра (base) + содержимое индексного регистра (index) + смещение (displacement)" тут присутствуют? Только смещение?
    препод уже достал валить этими вопросами, 4 лабы как то сдал, а на 5 завалился:) очень надеюсь на помощь
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    crashtua
    Содержимое индексного регистра умножается на масштаб (scale factor), на 2 в приведенном коде.
    Только для реального режима. Т.е. да для сдачи Вашего предмета. :) В общем случае, нет.
    Какое из приведенных lea? Вообще префикс переопределения сегмента для lea не играет никакой роли (ставьте хоть cs, хоть ss, хоть...) и игнорируется. Всё, что делает lea, — это вычисляет то, что передано вторым параметром (хотя корректно говорить "вычисляет эффективный адрес второго операнда", но смысл тот же).
    Поэтому написать LEA ax, cs:[0044h] будет равносильно mov ax,44h, только mov ещё и на байт короче.

    Аналогично с lea edi, STRING (было бы, если бы было di, а не edi. С какой стати 32-разрядный регистр?). Нет смысла здесь в lea, т.к. STRING — просто число (адрес метки, точнее метка — это и есть обозванный адрес). Поэтому lea di, STRING равносильно записи mov di,offset STRING, где вместо offset STRING подставляется число, высчитываемое в процессе трансляции (в Вашем случае было бы 3), только аналогично lea на байт длиннее.
    С учётом того, что эта инструкция находится в цикле, где ebx постоянно растёт, логический адрес, естесственно, тоже меняется с каждой итерацией. А так естесственно подставить значения и посчитать. На первой итерации будет
    0B800h:3520d+0*2 <=> 0B800h:3520 — это и есть логический адрес.
    Метка — это и есть адрес (хотя часто под меткой понимают содержимое по адресу). "Адрес метки start" равносильно "адрес с именем start".
    Адреса (ни логический, ни физический) без запуска определить невозможно, т.к. нет значения cs, определяемого DOS при загрузке образа.
    Будет умножать и складывать :). Как было показано выше.
    Ну ebx используется здесь в качестве индексного регистра. Поэтому есть смещение и индексный регистр со scale factor присутствуют.
     
  3. crashtua

    crashtua New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    4
    l_inc, понятно расписал:) Еще 1 вопросик и можно быть спокойным:
    MOV ES:[3520d + EBX*2], AX
    вычислит оно 0B800h:3520d, и соответственно у нас в сегменте кода будет что то типа (код мува)0B800h:3520d(что то там для указания на AX)? Если да, то как можно узнать логический адрес именно той записи (0B800h:3520d) в сегменте кода?
    (допустим значение сх=080ch)
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    crashtua
    Нет. Такого не будет. Вычисление адреса происходит во время исполнения. То, что в сегменте кода будет, определяется во время компиляции (если не рассматривать модифицируемый код). Поэтому в сегменте кода будет:
    префикс переопределения сегмента на указываемый es, опкод mov идентификатор регистра ebx (как индексного), множитель 2, а также значение 3520. Кроме того, будет префикс переопределения размера адреса 67h (т.к. присутствует 32-битный регистр в адресном выражении в 16-битном режиме), а также код регистра ax.
    Эта запись и есть логический адрес и к сегменту кода он отношения не имеет. Физический адрес можно узнать по приведенной Вами формуле:
    0B800h*16 + 3520 = 0B8000h + 0DC0h = 0B8DC0h.

    Причём здесь значение cx, честно говоря, не понял. Видимо перепутано с cs, которое в свою очередь тоже не имеет смысла.
     
  5. crashtua

    crashtua New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    4
    l_inc, большое спасибо, думаю теперь лабу сдам без проблем.
     
  6. Miyamoto

    Miyamoto New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2010
    Сообщения:
    46
    crashtua
    Кстати можно узнать, по каким учебникам ныне в вузах учат?
     
  7. crashtua

    crashtua New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    4
    Miyamoto, по методичкам собственного производства. Толкового в них минимум, куски кода, короткие пояснения типа "mov пересылает туда то сюда то...".