Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 425
от 16.04.2006, 17:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 305, Экспертов: 18
В номере:Вопросов: 3, Ответов: 5


Вопрос № 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.30 (beta) от 09.04.2006
Яндекс Rambler's Top100

В избранное