Проблема с адресацией

Тема в разделе "WASM.BEGINNERS", создана пользователем Nikankin, 28 мар 2008.

  1. Nikankin

    Nikankin New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2008
    Сообщения:
    16
    Здравствуйте.
    Определен сегмент данных
    Код (Text):
    1. DATA    SEGMENT
    2.     _01h    db "Razdelenie      $"
    3.     _02h    db "File not found  $"
    4.     _03h    db "Path or File not$"
    5.     _04h    db "No descriptors  $"
    6.     _05h    db "Access denied   $"
    7.     _0Ch    db "Bad value       $"
    8.     FNAME   db 'c:\temp\test',  0
    9.     HANDLE  dw ?
    10. DATA    ENDS
    Функцией 03dh открываю файл. При возникновении ошибки устанавливается carry flag, и регистр al содержит ошибку, которые собственно и определены в DATA (пусть неправильно написал :), извините). Каждое поле с ошибкой имеет длину 16 байт, сделал для собственного удобства.
    Итак, получаю ошибку №3 - Неправильный путь к файлу. Теперь мне нужно вывести соответствующее сообщение (_03Н). Так как поля по 16 байт, то для вывода через функцию 09Н 3 строки (_03h db "Path or File not$") я помещаю в dx инструкцией
    Код (Text):
    1. LEA DX, _01H+[BX], где BX = AL * 16
    . Причем bx умножаю через четырехкратный сдвиг влево
    Код (Text):
    1. MOV cl, 4
    2. SHL  bx
    Вся соль в том, что при такой операции получается число в десятичном формате, почему-то. Что не так делаю?
     
  2. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    .if al = 3
    LEA DX, _03h
    .elseif al = 4
    LEA DX, _04h
    .elseif al = 5
    ..................

    так нагляднее.
     
  3. Nikankin

    Nikankin New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2008
    Сообщения:
    16
    Да, на Си я бы так может и сделал, или даже оператор свич использовал.
    Но на асме от этого отказался. Прежставьте - это DOS-функция открытия файла, а BIOS-функции ошибок еще больше наверное возвращают. Это ладно здесь всего 6 сообщений, а если больше?

    Я сейчас смотрю - вопрос несколько неправильно поставил. Возращает Асм конечно же в 16-ой системе счисления. Просто я не попадаю по вроде бы правильной формуле на нужный мне элемент. Задумка первоначальная была, чтобы использовать инструкцию LODSB, устанавливая предварительно DS:SI на нужный элемент без всяких заморочек типа умножения. Так работало. Но интерес сделать с функцией 09h. Подскажите, вот в чем проблема в коде? Не могу понять
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Nikankin
    Код (Text):
    1. MOV cl, 4
    2. SHL  bx
    Странный какой-то сдвиг. Может лучше shl bx, 4?

    А почему не сделать нормальную таблицу, состоящую из offset-ов сообщений? Тогда эти сообщения могут иметь произвольную длину.
     
  5. Nikankin

    Nikankin New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2008
    Сообщения:
    16
    Да, а ведь действительно можно массив с размерами полей сделать :)
    А насчет сдвига, ассемблер может сдвигать только один бит, для сдвига нескольких надо инструкцию либо повторить, либо в СL число сдвигов кинуть.

    А вообще вопрос решился. Поля 16 байт, но я не учел символ конца строки $. Поэтому умножать надо на 17.
    Но все равно спасибо всем за ответы, а этот вариант с таблицей приму к разработке
     
  6. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Nikankin

    По моему выравнивать пробелами это большой изврат.
    если макросредства позволяют - почему не сделать как я предложил?
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Nikankin
    Я имел в виду таблицу адресов строк (как в С массив строк).
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Nikankin
    Это что же за ассемблер такой странный ? shl bx,4 должно работать на всех х86
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    leo
    Вообще паскалевский компилятор считает, что логические сдвиги более, чем на один бит, доступны только с 286-го.
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    l_inc
    Видимо, да - у А.Фога есть примечание, что shifts and rotates by immediate ≠ 1 были добавлены в 80186...
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    leo
    Ну и тем не менее TASM компилирует их как без указания минимального процессора, так и с указанием директивы .8086.
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    l_inc
    TASM компилирует их
    Посмотрев листинг можно увидеть, как он это делает.
     
  13. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    q_q
    Мда. Как всегда поторопился ответить, а проверить поленился. С другой стороны... ну точнее со стороны TASM'а так нечестно. Почему бы тогда pusha и popa точно так же не "скомпилировать"?
     
  14. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    l_inc
    Например, из-за размера кода. Вообще tasm понимает "команды"
    Код (Text):
    1. ...
    2. push ax bx cx
    3. ...
    4. pop cx bx ax
    5. ...
    только неудобно, что при выталкивании надо разворачивать список регистров.