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

Ассемблер? Это просто! Учимся программировать


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

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 557
от 27.09.2006, 23:05

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


Вопрос № 56286: Добрый вечер господа эксперты!!! Допустим я написал программу на языке Pascal и начинаю ее компелировать, чтобы создать ехе. файл. Если программа написана с ошибками, тут же во время компиляции выдается (пример): 10 Unexpected end of file или...
Вопрос № 56317: Здравствуйте. В дос-программах для задержки назаданное к-во миллисекунд я использовал INT15h при AH=86h. В Windows 2000,XP данный метод не работает (задержки нет). Кто-нибудь знает метод для задержки, который бы работал и в DOS, и в Win9x, WinNT....
Вопрос № 56373: Здравствуйте. Вот создал макрос и записал туда процедуру вывода содержимого регистра ax на экран. Но обьясните пожалуйста почему не работаем следующая программа, которая должна выводить :, а потом число 1010h ? prg segment para public 'code'...

Вопрос № 56.286
Добрый вечер господа эксперты!!!
Допустим я написал программу на языке Pascal и начинаю ее компелировать, чтобы создать ехе. файл. Если программа написана с ошибками, тут же во время компиляции выдается (пример): 10 Unexpected end of file
или 25 Invalid string length
Я открываю приложение в учебнике Паскаля и читаю:
10 Не найден конец файла
25 Неверная длина строки
Теперь точно также я написал программу на Ассемблере, но она не компилирется, т.к. присутсвуют ошибки, я нажимаю клавиши Ctrl+0, чтобы их (ошибки) увидеть.
Вижу А2086 и далее написание на англиском.
Вопрос: В каком учебнике или справочнике по ассемблеру я смогу также, как и в Паскале, посмотреть что означает код А2086 (ЧТО ЭТО ЗА ОШИБКА) или другой код например А2066?
За раннее Вам благодарен!
Николай
Отправлен: 21.09.2006, 22:47
Вопрос задал: Луковкин Николай Иванович (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: ENS
Здравствуйте, Луковкин Николай Иванович!
В книге Юрова есть полный список ошибок. Без проблем можно откопать в инете.
Надеюсь я тебе помог

---------
Учение - свет!
Ответ отправил: ENS (статус: 2-ой класс)
Ответ отправлен: 22.09.2006, 16:12
Оценка за ответ: 5
Комментарий оценки:
Как называется книга?


Вопрос № 56.317
Здравствуйте.
В дос-программах для задержки назаданное к-во миллисекунд я использовал INT15h при AH=86h. В Windows 2000,XP данный метод не работает (задержки нет). Кто-нибудь знает метод для задержки, который бы работал и в DOS, и в Win9x, WinNT.
Отправлен: 22.09.2006, 07:59
Вопрос задал: Sha_Lun (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: ADSota
Здравствуйте, Sha_Lun!

Дос от Виндовс сильно отличается. Использовать ситемные программы не получиться, не получиться использовать и таймер - в 2000,ХР нет доступа к нему...
Один из вариантов (для пентиума):

FREQ equ 3000000;частота процессора (кHz)
delaytime dd 5;количество миллисекунд задержки
...
delay:
rdtsc
mov ebx,FREQ
div ebx
mov ecx,eax
@@:
rdtsc
mov ebx,FREQ
div ebx
sub eax,ecx
cmp eax,[delaytime]
jb @B

---------
Открыть глаза навстречу солнцу
Ответ отправил: ADSota (статус: Специалист)
Ответ отправлен: 22.09.2006, 10:54

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Sha_Lun!
Решение, предложенное ADSota, конечно, будет работать, но у него есть
два недостатка:
1) привязано к частоте CPU
2) загрузка процессора становится равной 100%. Что особенно станет заметно при
достаточно больших задержках и частом их употреблении.
Хотя при редких и малых задержках - вполне приемлемое решение

При задержках >= 1 мс лучше использовать мультимедийный таймер
timeBeginPeriod(1) ; // где-то в начале инициируем таймер
...
timeSetEvent(1, // 1 мс
1,
(LPTIMECALLBACK)heMTimer, // событие, которое взведется по истечению времени
0,
TIME_ONESHOT | TIME_CALLBACK_EVENT_SET) ;
WaitForSingleObject (heMTimer, INFINITE) ; // ждем событие

Есть еще вариант - использовать Sleep(dwMsCount), но эту функцию можно использовать при значениях, больших 10 мс.
Да и работает с большой погрешностью. Не надо забывать, что Windows - это не
система реального времени...
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 22.09.2006, 12:53

Отвечает: Jekyll
Здравствуйте, Sha_Lun!

можно использовать Sleep:

void Sleep(
DWORD dwMilliseconds
);

или использовать объекты синхронизации: таймеры, мутексы, семафоры..
Ответ отправил: Jekyll (статус: 1-ый класс)
Ответ отправлен: 22.09.2006, 13:18


Вопрос № 56.373
Здравствуйте. Вот создал макрос и записал туда процедуру вывода содержимого регистра ax на экран. Но обьясните пожалуйста почему не работаем следующая программа, которая должна выводить :, а потом число 1010h ?

prg segment para public 'code'
assume cs:prg,ss:prg,es:prg,ds:prg
org 100h
start:
jmp go
go:
include c: asmincludevax.inc

lea dx,dww
mov ah,09h
int 21h

mov ax,0101h
call vaxp
exit:
ret
dww db ':$'
prg ends
end start

Приложение:

Отправлен: 22.09.2006, 18:40
Вопрос задал: Whiteman (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Whiteman!
Классный у тебя получился винигрет из понятий макроса, подпрограммы и инклюда :)
Давай сначала разберемся, что ты хочешь создать, макрос или подпрограмму?
Чем одно отличается от другого?
Макрос - это когда какой-то последовательности текстовых строк присваивается
имя. И это последовательность строк мы хотим вставить в нужное нам место
текста программы сколько угодно раз. Вызывается макрос указанием своего имени
(без команды call!). Компилятор каждый раз, как встретит имя известного ему макроса
вставит нужную последовательность строк.
А вот подпрограмма - нечто другое. Код подпрограммы лежит только в одном месте,
А вызов идет через call. И еще, у подпрограммы обязательно должен быть выход по команде ret.
Я не рассматриваю возможность и там, и там наличия параметров - это отдельный разговор.
По команде include мы можем добавлять любой текст в программу.
Обычно так вставляют часто используемые константы, подпрограммы, макросы и тому подобное.
Вернемся к твоей программе. У тебя больше от подпрограммы, поэтому сведем к подпрограмме.
Итак, ошибки:
1)Строка include c: asmincludevax.inc должна быть вставлена перед dww db ':$', т.к.
в ней у нас лежат подпрограммы (К слову, макросы вставляют в начале текста исполняемого кода, перед org 100h)
2)Имя подпрограммы - vax, а не vaxp
3)После последнего popa в vax.inc необходимо вставить ret (или так, как я сделал)
Полный текст смотри в приложении
Удачи!

Приложение:

---------
Удачи!

Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 22.09.2006, 19:22
Оценка за ответ: 5

Отвечает: Стас
Здравствуйте, Whiteman!
Согласен с Лысков Игорь Витальевич.
Добавлю только 1)Строка include c: asmincludevax.inc должна быть вставлена перед dww db ':$'
Зачем тебе:
jmp go
go:
может ты именно сюда хотел вставить include, тогда пиши так:
jmp go
include c: asmincludevax.inc
go:
Ответ отправил: Стас (статус: Специалист)
Ответ отправлен: 24.09.2006, 02:35


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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.36 от 06.09.2006
Яндекс Rambler's Top100

В избранное