Вопрос № 39942: Попытался ассемблировать файл первой главы командой
> ML.EXE PROG.ASM /AT
через "Пуск"->"Выполнить", но получил только .obj-файл.
А если запускаю через "Командную строку", то пишет "cannot open fil...Вопрос № 39961: Смотрю на процедуру в которой среди прочего есть такие 2 строки:
test ecx, ecx
jle short Метка
Согласно учебникам JLE прыгает если (LeftOp <= RightOp).
В данном случае LeftOp=RightOp всегда т.е. получается, что она всегда...Вопрос № 39991: Здравствуйте, уважаемые эксперты!
Подскажите, пожалуйста, как под ДОСом узнать количество расширенной памяти (extended memory) и список устройств? А также версию самой ОСи?
Заранее благодарю....
Вопрос № 39.942
Попытался ассемблировать файл первой главы командой
> ML.EXE PROG.ASM /AT
через "Пуск"->"Выполнить", но получил только .obj-файл.
А если запускаю через "Командную строку", то пишет "cannot open file: prog.asm". Почему так? Файл prog.asm лежит в папке BIN.
Приложение:
Отправлен: 10.04.2006, 23:34
Вопрос задал: Battler (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Пан Павел Константинович
Здравствуйте, Battler!
Попробуйте:
C:MASM611BINml /AT PROG.ASM или
C:MASM611BINml /AT C:MASM611BINPROG.ASM
Если пакет masm611 нормальный то всё должно получится.
Если это не помогло, то поколдуйте над переменой окружения %path% ОС MS-DOS, хотя %path% наврятли поможет.
С, Уважением MnEm0n!C.
--------- Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 6-ой класс)
Ответ отправлен: 11.04.2006, 00:55 Оценка за ответ: 5
Отвечает: mix_mix
Здравствуйте, Battler!
Возможно процедура из shell32.dll, отвечающая за показ диалога выполнить, меняет текущую папку у запускаемоего процесса на корневую для запускаемого процесса.
Короче, тебе надо из cmd запускать ассемблер так:
C:masm32inml /AT C:masm32inprog.asm
Ответ отправил: mix_mix (статус: 2-ой класс)
Ответ отправлен: 12.04.2006, 17:40 Оценка за ответ: 5
Вопрос № 39.961
Смотрю на процедуру в которой среди прочего есть такие 2 строки:
test ecx, ecx
jle short Метка
Согласно учебникам JLE прыгает если (LeftOp <= RightOp).
В данном случае LeftOp=RightOp всегда т.е. получается, что она всегда прыгает. Поскольку в процедуре еще полно кода мне в это не верится.
Копаю дальше.
Согласно определению найденному в сети.
JLE прыгает если (ZF=1 или SF<>OF)
ВОПРОС.
Теоретически это одно и тоже определение, но может на практике бывает так что Sign Flag = Overflow Flag (причем Zero Flag = 0)?
Т.е. может кто-нибудь придумать условия при котором JLE не прыгнет?
или даказать, что она всегда прыгнет, как и кажется на первый взгляд. Пример было бы чудесно.
Спасибо
Отправлен: 11.04.2006, 08:58
Вопрос задала: Janno (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Евгений Иванов
Здравствуйте, Janno!
JLE - это знаковая проверка на меньше (и на равно). Если Z=1, то это равно.
Таким же макаром проверяется не то, что меньше, а то, что число в ECX не знаковое (старший бит (31) не установлен).
удачи.
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор) Россия, Нижний Новгород Тел.: +79087645721 Организация: M2Media.ru Адрес: Нижний Новгород, ул.Малая Ямская WWW:Eugene Ivanov ICQ: 214;88;90;76 ---- Ответ отправлен: 11.04.2006, 09:32
Отвечает: Пан Павел Константинович
Здравствуйте, Janno!
И так...
> Теоретически это одно и тоже определение, но может на практике бывает так что Sign Flag = Overflow Flag (причем Zero Flag = 0)?
>> Да, может, но токой ответ явно не удовлетворяет к вас так и меня так что всё по порядку.
Для начала давайти посмотрим на команду test, что эта за команда и главное, как она действует на флаги.
Синтаксис:
TEST Приёмник, Источник
Логика работы команды TEST:
<Приёмник>AND<Источник>
Флаги на которые действует команда TEST:
OF = 0
SF = +
ZF = +
PF = +
CF = 0
Если коротко, то команда TEST, эта таже самая команда AND, только она НЕ! меняет содержимое Приёмника. При этом, как мы видем, команда TEST всегда устанавливает флаг OF = 0.
И с этими знаниями давайте напишем код:
CSEG segment
assume cs:CSEG,ds:CSEG,ss:CSEG,es:CSEG
org 100h
Begin:
mov cx,4000h ;0100 0000 0000 0000
test cx,cx
jle Begin ;jump
ret ; exit
CSEG ends
end Begin
Вот этот код, даст ответ на ваш вопрос. Т.е. "Т.е. может кто-нибудь придумать условия при котором JLE не прыгнет?".
Комментарии к программе:
Мы знаем что команда test сделает флаг OF = 0, запомнили это, теперь далее...
Мы знаем что test это, тоже самое что и AND, значит 4000h AND 4000h = 4000h, из этого следует что ZF = 0 (4000h > 0h). Остаётся токо узнать про флаг SF.
Мы знаем что флаг SF(Signum flag) - Флаг знака. Копируется старший бит результата выполнени команды. Так как test cx,cx даёт нам 4000h, при этом, это значение не имеет старший бит равный 1, следовательно SF = 0. Теперь объеденив всё в единный вывод, получим OF = SF = ZF = 0 что и требовалось доказать, как вы сказали "JLE прыгает если (ZF=1 или SF<>OF)", мы сопостовляем полученный нами вывод:
ZF = 0, прыжка может и не быть НО!
SF = OF = 0, вот теперь прыжка точно не будет, потому что SF не больше и не меньше OF, а SF равен OF.
C, Уважением MnEm0n!C.
--------- Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 6-ой класс)
Ответ отправлен: 11.04.2006, 23:35
Вопрос № 39.991
Здравствуйте, уважаемые эксперты!
Подскажите, пожалуйста, как под ДОСом узнать количество расширенной памяти (extended memory) и список устройств? А также версию самой ОСи?
Заранее благодарю.
Отправлен: 11.04.2006, 14:23
Вопрос задал: R4z3r (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Boriss
Здравствуйте, R4z3r!
Int15h - функция AH=88h определяет размер расширенной памяти
Возвращает в AX число непрерывных блоков размером в 1 Кб, располагающихся выше 1Мб
Int 21h - функция AH=30h - возвращает в AL главный номер версии DOS, в AL - дополнительный (minor). В версии DOS 3.20: AL = 3, AH = 14h (20), если версия не меньше 2.0. И еще в версиях выше 2.0 BX=CX=0, в меньших - не 0
С устройствами сложнее в DOS. Нет общего стандарта - например, для мыши нужно использовать прерывание 33h, чтобы обнаружить ее. Для LPT-порта - в системной области можно узнать, куда следует обращаться. По реакции на попытку обращения иногда можно узнать, что устройство имеется
По всем этим причинам лучше вызывать функции WinAPI :)) - ведь все равно Винды запускают нашу DOS-программу
Если нужно уточнение по конкретным устройствам, то в минифоруме отвечу
--------- Вывод - то место в тексте, где вы устали думать
Ответ отправил: Boriss (статус: Профессор) Россия, Саранск Организация: факультет Электронной техники, Мордовский госуниверситет Адрес: г. Саранск WWW:Программирование на Паскале ---- Ответ отправлен: 11.04.2006, 17:24 Оценка за ответ: 5