Member
Статус: Не в сети Регистрация: 05.12.2005 Откуда: Rostov-on-Don
L.A.W. Если бы мне нужны были только эти задания... Кроме этих у меня ещё партия. С ними вожусь, просто время ограничено - вот и хотел обратиться за помощью на родной форум
Member
Статус: Не в сети Регистрация: 12.07.2005 Откуда: Млечный путь
Код:
AnComStr Proc Near mov si,81h mov di,offset SourceFileName mov al,byte ptr cs:[80h] or al,al jz AbProg ;Если нет параметров anc1: ;Missing first spaces mov al,[si] or al,al jz ancZ cmp al,' ' jnz anc2 inc si jmp anc1 anc2: ;Read SourceFileName mov al,[si] or al,al jz ancZ cmp al,' ' jz ancZ ;! mov [di],al inc si inc di jmp anc2
ancZ: mov [di-1],byte ptr 0 ; Erase 0Dh symbol ret AnComStr Endp
Вообщем написал это для считывания из командной строки имени файла, над котрым нужно производить действия.
Дальше работаю с 4eh для открытия совпадающего файла, т.к. могут использоваться шаблоны в имени файла. Возникла проблема: открываются только файлы с именем в 1 символ. В чем проблема не могу разобраться. Плохая процедура чтения из PSP или может из-за того, что SourceFileName не ASCIIZ строка (не знаю как ее сделать). Может предложите свой вариант.
_________________ В этом мире меня подводят доброта и порядочность...
?Am(d)ber? Гы! Ну ты крут! А она у тебя нормально выходит? Вообще-от переход из процедуры на метку, которая не в этой процедуре находится - плохая идея...
А программа у тя COM или EXE? Возможно стоит просто в явном виде поставить сегментные регистры.
И вобще - не мучайся ты с определеением конца строки. Просто используй значение из cs:[80h] в качестве счетчика символов. Т.е. сначала сделай mov CL,СS:[80h], сравни с нулем, если равно - выход (но не переход на метку вне процедуры), если не равно - удаляешь пробелы из начала и при этом уменьшаешь СL. Когда пробелы кончились просто запускаешь цикл со счетчиклм и переносишь посимволь имя файла из PSP в переменную.
Я использовал такой код:
Код:
mov CL,ES:[80h] ;получаем длинну параметра cmp CL,0 ;из PSP je wrong ;длинна равна нулю - параметров нет. переходим на соответствующую метку mov CH,0 mov DI,81h ;ES:DI - хвост в PSP cyc: cmp byte ptr ES:[DI]," " ;сканируем хвост, пока пробелы inc DI je cyc mov BX,0 mov SI,0 mcopy: mov AL,byte ptr ES:[DI] mov smask+SI,AL ;посимвольно переносим маску из PSP в переменную smask inc SI inc DI cmp SI,CX ;пока не кончится строка параметров je cont cmp byte ptr ES:[DI]," " ;или пока не наткнемся на пробел jne mcopy
Он немного отличается от того что я тебе предлагал т.к. у меня после маски в строке параметров еще кой-че передавалось.
_________________ I L.A.W. you, baby!
For a GNU dawn! For freedom!
Member
Статус: Не в сети Регистрация: 12.07.2005 Откуда: Млечный путь
Программа COM, а в COM программе все сегментные регистры на PSP установлены по-умолчанию. Переход из процедуры по метке, конечно, плохая идея, вот только странно, почему считывает "1.txt", но не считывает "11.txt".
Спасибо за код, буду пробовать. Добавлено спустя 8 минут, 19 секунд Еще есть вопрос - может кто знает где можно найти описание алгоритмов вычисления тактовой частоты процессоров до P5 с помощью системного таймера. Старше легко считать при помощи rdtsc, но нужна поддержка старых моделей.
_________________ В этом мире меня подводят доброта и порядочность...
Еще есть вопрос - может кто знает где можно найти описание алгоритмов вычисления тактовой частоты процессоров до P5 с помощью системного таймера. Старше легко считать при помощи rdtsc, но нужна поддержка старых моделей.
Хм... Задачка довольно не тривиальная... Буду дома - гляну. Добавлено спустя 5 минут, 43 секунды Кстати, чуть раньше в этой теме был дискуссия по поводу того что RDTSC поддерживают 4-ки и некоторые 3-ки. Попробуй прямо так!
А процами младше 286 я думаю можно и пренебречь.
_________________ I L.A.W. you, baby!
For a GNU dawn! For freedom!
Member
Статус: Не в сети Регистрация: 12.07.2005 Откуда: Млечный путь
L.A.W. писал(а):
?Am(d)ber? писал(а): Еще есть вопрос - может кто знает где можно найти описание алгоритмов вычисления тактовой частоты процессоров до P5 с помощью системного таймера. Старше легко считать при помощи rdtsc, но нужна поддержка старых моделей.
Хм... Задачка довольно не тривиальная... Буду дома - гляну.Добавлено спустя 5 минут, 43 секундыКстати, чуть раньше в этой теме был дискуссия по поводу того что RDTSC поддерживают 4-ки и некоторые 3-ки. Попробуй прямо так!А процами младше 286 я думаю можно и пренебречь.
Мне нужно чтоб, был детект частоты у 286 - P5. Насколько я понял, счетчик тактов только у P5. Преподаватель засмеяла мой алгоритм ввиду его маленького размера и сказала, что весь основной замут делает rdtsc. Из-за этого сказала делать для старых моделей. Вроде как взять инструкцию, узнать сколько тактов она выполняется. Пргогнать к примеру 1000 раз цикл с этой инструкцией. Т.е. будем знать сколько тактов выполнил процессор. А время вроде как кроме таймера ничем не замеришь? Только вот еще считать 1 такт=1Гц? Вроде для старых cpu так принято. Есть исходник с таймером, но он очень много задач выполняет, я что-то именно код для частоты не могу выдрать оттуда.
_________________ В этом мире меня подводят доброта и порядочность...
шкет Ну ты бы хоть комментариев добавил, где ты и что делаешь. Так ваще без поллитры не разберешься. А с поллитрой найдутся и другие дела... Добавлено спустя 6 минут, 7 секунд
?Am(d)ber? писал(а):
Преподаватель засмеяла мой алгоритм ввиду его маленького размера и сказала, что весь основной замут делает rdtsc
Скажи ей куда ей нужно сходить. Если проц поддерживает RDTSC (а 4-ки вроде должны), то считать частоту по-другому - глупость. Насчет наличия счетчика тактов у процов младше P5 - дискуссия была выше. Было сказано, что 4-ки и некоторые 3-ки (486 и 386, если не в курсе) его поддерживают.
L.A.W. писал(а):
Вроде как взять инструкцию, узнать сколько тактов она выполняется
Ну допустим.
?Am(d)ber? писал(а):
Пргогнать к примеру 1000 раз цикл с этой инструкцией.
А сколько тактов тратится на организацию цикла мы учтем?
Плюс такую проверку можно писать только для конкретной модели проца.
ИМХО товя преподавательница несет чушь. И сама слабо представляет, о чем говорит. Добавлено спустя 2 минуты, 36 секунд ?Am(d)ber? Кстати, посоветую преподвательнице учесть, что в многозадачной ОС в распоряжении проги находится не все процессорное время. Там еще, как минимум, планировщик. Пусть или сама четко сформулирует задание или принимает что есть.
_________________ I L.A.W. you, baby!
For a GNU dawn! For freedom!
Member
Статус: Не в сети Регистрация: 12.07.2005 Откуда: Млечный путь
В многозадачных ОС вроде как надо Sleep юзать. А если она будет программу тестировать на какой-нибудь тройке, то там полюбому ДОС. И она от меня так просто не отстанет, потомучто это курсовой
_________________ В этом мире меня подводят доброта и порядочность...
Member
Статус: Не в сети Регистрация: 12.07.2005 Откуда: Млечный путь
Я имел ввиду то, что написал на асм приложение под win32, используя rdtsc+sleep. Конечно, sleep к методу препода отношения не имеет. В книге аппартное программирование сказано, что rdtsc начиная с P5. Тоже и на оверах
Member
Статус: Не в сети Регистрация: 09.10.2004 Откуда: Краснодар
L.A.W. коментарии... хм как я написал выше
шкет писал(а):
в ассемблере я N00B
то про коментарии можно забыть, ибо это мне помогали, что-то правил сам и т.д. вот что получилось то и написал. Прошу помочь либо исправить что не так, либо написать заново.
Member
Статус: Не в сети Регистрация: 05.12.2005 Откуда: Rostov-on-Don
Очень жаль, что на мою просьбу никто не откликнулся ((( Видимо зря понадеялся на родной форум, придётся жертвовать другими предметами и вкуривать ещё 4 проги по ассемблеру
Member
Статус: Не в сети Регистрация: 12.07.2005 Откуда: Млечный путь
Вообщем есть код с системным таймером, насчет работы с таймером вроде все понятно, инициализируем, запрещаем маскируемые и немаскируемые прерывания, запускаем. Потом идет выполнение циклов с определенной инструкцией и считывание нового значения таймера. Никак не могу въехать как получается частота. По идее после всех итераций цикла мы получаем какое-то кол-во тиков счетчика, потом считаем сколько должно было затратится тактов на выполнение итих циклов с инструкциями. Потом делим. Но в этом коде не догнал, где имеено "вес" цикла. Либо там так хитро сделано, что не надо делить? Вот код
_________________ В этом мире меня подводят доброта и порядочность...
?Am(d)ber? По-моему ты паришься не по делу... Попробуй еще почитать по БИОСу. Может в нем хранится инфа о частоте. У старых процов диапазон частот был довольно скромный, так что они вполне могут присутствовать в БИОСе в том или ином виде.
Добавлено спустя 1 минуту, 55 секунд
Foxtrot писал(а):
Видимо зря понадеялся на родной форум
Я могу посоветовать, посмотреть твой исходник, если нужно. Но писать прогу с нуля у меня нет ни времени ни желания.
_________________ I L.A.W. you, baby!
For a GNU dawn! For freedom!
Member
Статус: Не в сети Регистрация: 09.10.2004 Откуда: Краснодар
L.A.W. H=max{a,min{b^2,ac}} где H-слово, a,b,c-байт
вводить в borland pascal 7.0 через оператор(или не оператор-хз как называется) ASM, т.е. после var, label, writeln и т.д. пишешь asm и начинаешь писать прогу. см.пример выше.
mov AL,b mul AL ;теперь в AX - b^2 push AX ;запихнули в стек mov AL,c mul a ;теперь в AX - a*c pop BX cmp AX,BX jl: label1 push AX label1: push BX pop AX ;в АХ - min{b^2,ac} mov BX,a cmp AX,BX jl: label2 mov h,BX label2: mov h,AX ; теперь в h - max{a,min{b^2,ac}}
По-идее должно работать. Хотя писал на коленке - могут быть и ошибки...
_________________ I L.A.W. you, baby!
For a GNU dawn! For freedom!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения