Здравствуйте. Определен сегмент данных Код (Text): DATA SEGMENT _01h db "Razdelenie $" _02h db "File not found $" _03h db "Path or File not$" _04h db "No descriptors $" _05h db "Access denied $" _0Ch db "Bad value $" FNAME db 'c:\temp\test', 0 HANDLE dw ? DATA ENDS Функцией 03dh открываю файл. При возникновении ошибки устанавливается carry flag, и регистр al содержит ошибку, которые собственно и определены в DATA (пусть неправильно написал , извините). Каждое поле с ошибкой имеет длину 16 байт, сделал для собственного удобства. Итак, получаю ошибку №3 - Неправильный путь к файлу. Теперь мне нужно вывести соответствующее сообщение (_03Н). Так как поля по 16 байт, то для вывода через функцию 09Н 3 строки (_03h db "Path or File not$") я помещаю в dx инструкцией Код (Text): LEA DX, _01H+[BX], где BX = AL * 16 . Причем bx умножаю через четырехкратный сдвиг влево Код (Text): MOV cl, 4 SHL bx Вся соль в том, что при такой операции получается число в десятичном формате, почему-то. Что не так делаю?
Да, на Си я бы так может и сделал, или даже оператор свич использовал. Но на асме от этого отказался. Прежставьте - это DOS-функция открытия файла, а BIOS-функции ошибок еще больше наверное возвращают. Это ладно здесь всего 6 сообщений, а если больше? Я сейчас смотрю - вопрос несколько неправильно поставил. Возращает Асм конечно же в 16-ой системе счисления. Просто я не попадаю по вроде бы правильной формуле на нужный мне элемент. Задумка первоначальная была, чтобы использовать инструкцию LODSB, устанавливая предварительно DS:SI на нужный элемент без всяких заморочек типа умножения. Так работало. Но интерес сделать с функцией 09h. Подскажите, вот в чем проблема в коде? Не могу понять
Nikankin Код (Text): MOV cl, 4 SHL bx Странный какой-то сдвиг. Может лучше shl bx, 4? А почему не сделать нормальную таблицу, состоящую из offset-ов сообщений? Тогда эти сообщения могут иметь произвольную длину.
Да, а ведь действительно можно массив с размерами полей сделать А насчет сдвига, ассемблер может сдвигать только один бит, для сдвига нескольких надо инструкцию либо повторить, либо в СL число сдвигов кинуть. А вообще вопрос решился. Поля 16 байт, но я не учел символ конца строки $. Поэтому умножать надо на 17. Но все равно спасибо всем за ответы, а этот вариант с таблицей приму к разработке
Nikankin По моему выравнивать пробелами это большой изврат. если макросредства позволяют - почему не сделать как я предложил?
leo Вообще паскалевский компилятор считает, что логические сдвиги более, чем на один бит, доступны только с 286-го.
l_inc Видимо, да - у А.Фога есть примечание, что shifts and rotates by immediate ≠ 1 были добавлены в 80186...
leo Ну и тем не менее TASM компилирует их как без указания минимального процессора, так и с указанием директивы .8086.
q_q Мда. Как всегда поторопился ответить, а проверить поленился. С другой стороны... ну точнее со стороны TASM'а так нечестно. Почему бы тогда pusha и popa точно так же не "скомпилировать"?
l_inc Например, из-за размера кода. Вообще tasm понимает "команды" Код (Text): ... push ax bx cx ... pop cx bx ax ... только неудобно, что при выталкивании надо разворачивать список регистров.