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

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


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

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

Выпуск N 059

Вопросы, которые поступили от подписчиков рассылки
"Ассемблер? Это просто! Учимся программировать"

Дата выхода: 2001-08-15


Вопрос №505

В рассылке номер 18 были такие строки
SCASB и SCASW. Первый служит для поиска первого попавшегося байта, а второй - первого попавшегося слова.
При этом ES:DI должен содержать адрес строки.
Пример:
...
(1) mov di,offset String ;ES:DI - адрес троки
(2) mov cx,offset String_len ;CX - максимальное количество сканируемых байт/слов
(3) mov al,9 ;Символ для поиска
(4) repne scasb ;Ищем первый байт, который находится в AL
...
(5) String db 1,2,3,4,5,6,7,8,9,10,11,12
(6) String_len equ $-String


Так вот: если делать всЈ так как в этом примере, то при компилировании моей проги(она прилагается)выдается ошибка в строке(2):operand type must match.Т.е. несовпадение типов.
Мне кажется, что правильней будет mov cx,String_len

Ответ

Здравствуйте, Дмитрий! К сожалению, это не единственная ошибка, которую можно встретить в рассылке... ;(.
Да, и когда выйдет следующий номер? Может я что-то и пропустил, но последний полученный мной номер датируется 20 июня!!! Может, у кого то иссякла фантазия??? Зачем, спрашивается, браться за рассылку, если "нет времени"?... Уважаемый Калашников! Может, рассылку то давно закрыли, а мы тут играемся в "Что?Где?Когда?"? Кстати, я считаю подобный метод "живого" повышения "квалификации" лучше, чем любая книжка, учительница и всякие там курсы (кстати, у нас по всем автобусам висит странная объява: "Курсы программистов. Работа в Нортон Коммандере, архивация и разархивация файлов в WinZip. Срок обучения - полтора года....) ;(
Не, ну хоть раз в месяц же можно чето присочинить (это я об рассылке кстати...)


Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 40

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №506

Здравствуйте, Alexander_K.

Вопрос: некоторые "резиденты" "отгрызают" у DOS кусок памяти, куда записывают свое тело, причем манеджер памяти DOS этого не замечает. Они укорачивают размер последнего MCB. Нет ли у DOS средств проверки памяти на подобные разрушения ?

Ответ

Здравствуйте, Andrew!
Явления загрузки резидента в старшие адреса памяти с последующей коррекцией MCB-блока имеет интенсивное применение только в одной сфере развития программного обеспечения - вирмейкерстве. Следовательно проверкой памяти на такие разрушения должны заниматся создатели антивирусов, я же таковым не являюсь и ничем в данном случае помоч немогу. Могу только сказать, что если вашей целью является получение помощи от экспертов, то можете смело убирать префикс Alexander_K в своих вопросах.


Отправил эксперт: Alexander_K
Эксперт отправил ответов (всего): 16

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №504

Многоуважаемые эксперты,
меня мучают два вопроса (неуверен, смогу ли правильно сформулировать их,
так как я еще совсем "зеленый" в программерском деле).
Но всё же помогите хто чем может, плз.
Итак:
#1:
Программа предусматривает ввод с клавиатуры двух чисел (dec).
Можно ли поместить эти два числа в две разные строки таким образом,
чтобы эти строки содержали не набор ASCII - символов, а то число,
которое вводилось с клавы? И если да, то как просуммировать эти
строки и вывести результат на экран?
#2:
Как можно запретить проге реагировать на нажатие таких комбинаций
клавиш, как Alt+Tab, Ctrl+Esc, Ctrl+Alt+Del...

Заранее благодарствую всем, кто поможет.

Ответ

Уважаемый h!
На ассемблере можно сделать ВСЕ!!! (во всяком случае в реальном режиме... ;), в защищенном сделать ВСЕ несколько сложнее...(я чето вспомнил про линейный кадровый видеобуфер) ;) )
1. Специальных функций или команд, преобразующих "налету" введенные числа сразу в dec в ассемблере не существуют! НО! Можно:
а). Написать собственный обработчик функции 0Аh прерывания 21h (считать строку символов из STDIN в буффер) или любой другой подобной функции, чтоб все введенный числа "налету" ложились в строки в подобии dec/ (этот вариант я сходу за пол-часика чесания репы и сам сомневаюсь что реализую...). Поэтому смотрим второй вариант.
б). Щас.... ж). Да, ложим обычным образом числа в строку, а уже оттуда их перемучиваем в то, шо нам нада. А насчет того, "зачем это все же нада?" я и сам некоторое время назад задавал сюда вопрос по поводу перевода шестнадцатиричного числа в десятичное и вывода его на экран и убедился, что реализовывать подобные переводы на ассемблере чето типа поедания супа чайной ложкой...(и криво, и чето както некрасиво) вот так.
Потому что как бы ты их не переводил в dec, bin или еще чето там, чтобы вывести их на экран все равно они должны быть в кодах ASCII, а если ты просто хочешь поразвлечь себя и народ вокруг и просто сложить два ДЕСЯТИЧНЫХ числа из двух разных строк, то это в соседний кабинет вообще...

2. Ну тут вообще все просто ;). Бери выпуск (по моему дето между 1 и 10..) рассылки, про которую я тут выше выразил мысль и читай!!! Там есть дето статейка, как отследить нажатие и отпускание клавиш с ctrl, alt и т.п.....

P.S. В виндах запретить Ctrl+alt+del можешь даже и не мечтать ;)!


Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 41

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №504

Многоуважаемые эксперты,
меня мучают два вопроса (неуверен, смогу ли правильно сформулировать их,
так как я еще совсем "зеленый" в программерском деле).
Но всё же помогите хто чем может, плз.
Итак:
#1:
Программа предусматривает ввод с клавиатуры двух чисел (dec).
Можно ли поместить эти два числа в две разные строки таким образом,
чтобы эти строки содержали не набор ASCII - символов, а то число,
которое вводилось с клавы? И если да, то как просуммировать эти
строки и вывести результат на экран?
#2:
Как можно запретить проге реагировать на нажатие таких комбинаций
клавиш, как Alt+Tab, Ctrl+Esc, Ctrl+Alt+Del...

Заранее благодарствую всем, кто поможет.

Ответ

Уважаемый h!
На ассемблере можно сделать ВСЕ!!! (во всяком случае в реальном режиме... ;), в защищенном сделать ВСЕ несколько сложнее...(я чето вспомнил про линейный кадровый видеобуфер) ;) )
1. Специальных функций или команд, преобразующих "налету" введенные числа сразу в dec в ассемблере не существуют! НО! Можно:
а). Написать собственный обработчик функции 0Аh прерывания 21h (считать строку символов из STDIN в буффер) или любой другой подобной функции, чтоб все введенный числа "налету" ложились в строки в подобии dec/ (этот вариант я сходу за пол-часика чесания репы и сам сомневаюсь что реализую...). Поэтому смотрим второй вариант.
б). Щас.... ж). Да, ложим обычным образом числа в строку, а уже оттуда их перемучиваем в то, шо нам нада. А насчет того, "зачем это все же нада?" я и сам некоторое время назад задавал сюда вопрос по поводу перевода шестнадцатиричного числа в десятичное и вывода его на экран и убедился, что реализовывать подобные переводы на ассемблере чето типа поедания супа чайной ложкой...(и криво, и чето както некрасиво) вот так.
Потому что как бы ты их не переводил в dec, bin или еще чето там, чтобы вывести их на экран все равно они должны быть в кодах ASCII, а если ты просто хочешь поразвлечь себя и народ вокруг и просто сложить два ДЕСЯТИЧНЫХ числа из двух разных строк, то это в соседний кабинет вообще...

2. Ну тут вообще все просто ;). Бери выпуск (по моему дето между 1 и 10..) рассылки, про которую я тут выше выразил мысль и читай!!! Там есть дето статейка, как отследить нажатие и отпускание клавиш с ctrl, alt и т.п.....

P.S. В виндах запретить Ctrl+alt+del можешь даже и не мечтать ;)!


Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 42

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №505

В рассылке номер 18 были такие строки
SCASB и SCASW. Первый служит для поиска первого попавшегося байта, а второй - первого попавшегося слова.
При этом ES:DI должен содержать адрес строки.
Пример:
...
(1) mov di,offset String ;ES:DI - адрес троки
(2) mov cx,offset String_len ;CX - максимальное количество сканируемых байт/слов
(3) mov al,9 ;Символ для поиска
(4) repne scasb ;Ищем первый байт, который находится в AL
...
(5) String db 1,2,3,4,5,6,7,8,9,10,11,12
(6) String_len equ $-String


Так вот: если делать всЈ так как в этом примере, то при компилировании моей проги(она прилагается)выдается ошибка в строке(2):operand type must match.Т.е. несовпадение типов.
Мне кажется, что правильней будет mov cx,String_len

Ответ

Здравствуйте, Дмитрий!
Дмитрый! Вы уверены, что вы тот файл вложили?!!! Помоему надо было другой, тот который screen.asm!


Отправил эксперт: Painbringer
Эксперт отправил ответов (всего): 31

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №503

Добрый *******! Есть два вопроса:
1. Чем метки,начинающиеся с @@ отличаются от обычных? (помню, где то читал про это,но теперь уже не помню где...)
2. Можно ли в макросах IRP использовать более одной стастической переменной? (я может быть неправильно выразился, я имел ввиду возможна ли хоть в какой то вариации запись типа
IRP x,<1,2,3>,y<4,5,6> и т.д.?)

Ответ

Здравствуйте, Broken Sword!
Насколько мне помнится метки типа @@1 пошли из Turbo Pascal, где такие метки не надо было объявлять как label.


Отправил эксперт: Painbringer
Эксперт отправил ответов (всего): 32

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №504

Многоуважаемые эксперты,
меня мучают два вопроса (неуверен, смогу ли правильно сформулировать их,
так как я еще совсем "зеленый" в программерском деле).
Но всё же помогите хто чем может, плз.
Итак:
#1:
Программа предусматривает ввод с клавиатуры двух чисел (dec).
Можно ли поместить эти два числа в две разные строки таким образом,
чтобы эти строки содержали не набор ASCII - символов, а то число,
которое вводилось с клавы? И если да, то как просуммировать эти
строки и вывести результат на экран?
#2:
Как можно запретить проге реагировать на нажатие таких комбинаций
клавиш, как Alt+Tab, Ctrl+Esc, Ctrl+Alt+Del...

Заранее благодарствую всем, кто поможет.

Ответ

Здравствуйте, h!
1. Предположим, что введенная строка отфильтрована (т.е. там только цифры) и находится по адресу es:di. Имеем:

xor bx,bx ; - cюда помещаем результат.
xor ax,ax
mov cx,5 ; - длина буфера
@@1: lodsb
sub al,30h ; 30h - код нуля
add bx,ax
loop @@1
; теперь в bx число!

2. Процедура для вывода числа (hex).
Число помещается в eax.

h2s proc near
push eax
push cx
push edx
push di

mov cx,8
@@1: xor dx,dx
shld edx,eax,4
shl eax,4
mov di,dx
push ax
mov ah,6
mov dl,byte ptr hs[di]
int 21h
pop ax
loop @@1
push ax
mov dl,'h'
mov ah,6
int 21h
pop ax

pop di
pop edx
pop cx
pop eax
ret
hs db "0123456789ABCDEF"
endp h2s

3. Запретить рекцию на клавиши можно перехватив обработчик прерываний клавы. Или если нравится грубить просто в начале проги поставь cli в конце sti.


Отправил эксперт: Painbringer
Эксперт отправил ответов (всего): 33

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №505

В рассылке номер 18 были такие строки
SCASB и SCASW. Первый служит для поиска первого попавшегося байта, а второй - первого попавшегося слова.
При этом ES:DI должен содержать адрес строки.
Пример:
...
(1) mov di,offset String ;ES:DI - адрес троки
(2) mov cx,offset String_len ;CX - максимальное количество сканируемых байт/слов
(3) mov al,9 ;Символ для поиска
(4) repne scasb ;Ищем первый байт, который находится в AL
...
(5) String db 1,2,3,4,5,6,7,8,9,10,11,12
(6) String_len equ $-String


Так вот: если делать всЈ так как в этом примере, то при компилировании моей проги(она прилагается)выдается ошибка в строке(2):operand type must match.Т.е. несовпадение типов.
Мне кажется, что правильней будет mov cx,String_len

Ответ

Здравствуйте, Дмитрий!
Ты прав, в cx нужно поместить длину, а не смещение.
В следующий раз, если в твоих программах будут включаемые файлы (вроде include screen.asm), присылай их тоже, а то как мы тебе компилироватся то будем?


Отправил эксперт: Alexander_K
Эксперт отправил ответов (всего): 18

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №508

Здравствуйте, уважаемые эксперты!!!
Ответьте, пожалуйста, как убрать и поставить атрибут файла "Только для чтения" (и другие атрибуты).

Ответ

Здравствуйте, Эдуард!
Наверно вы имеете ввиду, как ваша программа может поменять аттрибуты уже существующего файла? Чего то я не припомню специальных функций на этот случай, но первое, что приходит в голову - создать новый с желаемыми атрибутами и записать в него содержимое файла.


Отправил эксперт: Alexander_K
Эксперт отправил ответов (всего): 19

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №509

Добрый день, дамы и Господа, уважаемые эксперты!
У меня маленький вопрос к Вам. Скажите, пожалуйста, почему и в связи с чем существуют ограничения при разгоне процессора? Вот например, у меня материнская плата ASUS-CUSL-2C, на чипсете Intel 815E позволяет разгонять Pentium III 866/133, судя по файлу Ascd_tmp.ini до 1066Mn (CPU_CURRENTSPEED = 866; CPU_MAXCLOCK = 1066), но продавец в магазине сказал, что это может навредить, что до 942Mh можно, а дальше не советует. Разгоняется легко и быстро, всЈ поддерживается, и в ручную ("Manual") выставляя частоту, и также задав установки автоматически, плата всегда отвечает, выставляя сама все необходимые частоты, например я ставлю 145/108/133, она сама ставит 942Mh или наоборот. А, что может случиться, чему навредить и как, и разве это не просчитывается изготовителем?!?
Заранее благодарю за ответ!
DeusEx.

Ответ

Здравствуйте, Вадим!

При разгоне увеличивается температура процессора. При повышении
температуры процессор сначала начинает работать нестабильно,
затем плавится, загорается, вызрывается.. :)

Поэтому, если хотите сильно разогнать процессор, поставьте
компьютер в холодильник :)


Отправил эксперт: Nik
Эксперт отправил ответов (всего): 63

Экспертная группа: Пользовательская работа с Windows

Вопрос №509

Добрый день, дамы и Господа, уважаемые эксперты!
У меня маленький вопрос к Вам. Скажите, пожалуйста, почему и в связи с чем существуют ограничения при разгоне процессора? Вот например, у меня материнская плата ASUS-CUSL-2C, на чипсете Intel 815E позволяет разгонять Pentium III 866/133, судя по файлу Ascd_tmp.ini до 1066Mn (CPU_CURRENTSPEED = 866; CPU_MAXCLOCK = 1066), но продавец в магазине сказал, что это может навредить, что до 942Mh можно, а дальше не советует. Разгоняется легко и быстро, всЈ поддерживается, и в ручную ("Manual") выставляя частоту, и также задав установки автоматически, плата всегда отвечает, выставляя сама все необходимые частоты, например я ставлю 145/108/133, она сама ставит 942Mh или наоборот. А, что может случиться, чему навредить и как, и разве это не просчитывается изготовителем?!?
Заранее благодарю за ответ!
DeusEx.

Ответ

Здравствуйте, Вадим!
Чем больше разогнать тем быстрее процессор станет нагреваться и тем быстрее сгорит.


Отправил эксперт: Роман
Эксперт отправил ответов (всего): 22

Экспертная группа: Пользовательская работа с Windows

Вопрос №509

Добрый день, дамы и Господа, уважаемые эксперты!
У меня маленький вопрос к Вам. Скажите, пожалуйста, почему и в связи с чем существуют ограничения при разгоне процессора? Вот например, у меня материнская плата ASUS-CUSL-2C, на чипсете Intel 815E позволяет разгонять Pentium III 866/133, судя по файлу Ascd_tmp.ini до 1066Mn (CPU_CURRENTSPEED = 866; CPU_MAXCLOCK = 1066), но продавец в магазине сказал, что это может навредить, что до 942Mh можно, а дальше не советует. Разгоняется легко и быстро, всЈ поддерживается, и в ручную ("Manual") выставляя частоту, и также задав установки автоматически, плата всегда отвечает, выставляя сама все необходимые частоты, например я ставлю 145/108/133, она сама ставит 942Mh или наоборот. А, что может случиться, чему навредить и как, и разве это не просчитывается изготовителем?!?
Заранее благодарю за ответ!
DeusEx.

Ответ

Здравствуйте, Вадим!
Проблема состоит в том, что при разгоне проц начинает быстро "закипать", поэтому если хочешь после разгона избежать
"глюки" и зависание, придеться ещё потратиться на мощный кулер
или покурай сразу морозильник, т.к. при минус 40 гр. разгонишь
выше 1100МГц, да срок годности проца при разгоне можешь поделить на
два!


Отправил эксперт: Orlando
Эксперт отправил ответов (всего): 5

Экспертная группа: Пользовательская работа с Windows

Вопрос №506

Здравствуйте, Alexander_K.

Вопрос: некоторые "резиденты" "отгрызают" у DOS кусок памяти, куда записывают свое тело, причем манеджер памяти DOS этого не замечает. Они укорачивают размер последнего MCB. Нет ли у DOS средств проверки памяти на подобные разрушения ?

Ответ

Здравствуйте, Andrew!

Помоему нету.


Отправил эксперт: Dron
Эксперт отправил ответов (всего): 50

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №508

Здравствуйте, уважаемые эксперты!!!
Ответьте, пожалуйста, как убрать и поставить атрибут файла "Только для чтения" (и другие атрибуты).

Ответ

Здравствуйте, Эдуард!
Для проверки или изменения файлового атрибута используется
функция 43h(Int 21h).
Если в al поместить 0, в dx - путь, то возвратом в cx
атрибут файла, в ax - код ошибки(если произошла).
Если в al поместить 1, в dx - путь, в cx атрибут файла,
то атрибут установится, а в ax - код ошибки(если произошла).
Атрибут в cx:
Только чтение - 00000001B
Скрытый - 00000010В
Системный - 04h
Архивный - 20h
Вот ещё прога для тренировки(без проверки на ошибки):

Приложение:


Отправил эксперт: Orlando
Эксперт отправил ответов (всего): 6

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №508

Здравствуйте, уважаемые эксперты!!!
Ответьте, пожалуйста, как убрать и поставить атрибут файла "Только для чтения" (и другие атрибуты).

Ответ

Здравствуйте, Эдуард!
Установить:
ДОС-функция(int 21h) 4301h
Вход
AX=4301h
CX=attribute
DS:DX=адрес ASCIIZ строки спецификации(полного имени) файла
Выход
Если бит С=1 то AX-код ошибки
Атрибуты 00advshr, где
а-Arhive,d-Directory,v-Volume label,s-System,h-Hidden,r-ReadOnly
-----
Прочитать:
Вход:
AX=4300h
DS:DX=адрес ASCIIZ строки спецификации(полного имени) файла
Выход
Если бит С=1 то AX-код ошибки
CX=attribute


Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 73

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Подписаться на рассылки

Рассылки Subscribe.Ru
Ассемблер? Это просто! Учимся программировать
Ассемблер? Это просто! Учимся программировать (FAQ)

Форма подачи вопроса

ВНИМАНИЕ!!! Пожалуйста, НЕ высылайте один вопрос сразу нескольким подгруппам! Дополнения к вопросам, на которые эксперт уже ответил НЕ следует направлять ведущему рассылки (я не успеваю!). Просто скомбинируйте первый вопрос и дополнение к нему, а затем заново отправьте его, используя приведенную ниже форму!

Нажимайте кнопку "Отправить" только ОДИН раз и дождитесь полной загрузки страницы, иначе вопрос будет продублирован!


Ваше имя *:

Ваш e-mail *:

Подгруппы:

Вопрос *:

Прилагаемая программа (если необходимо):


Регистрация в качестве эксперта

Архив выпусков


Ведущий рассылки,

Калашников Олег: Assembler@Kalashnikoff.ru
ICQ No.:
68951340
URL сайта подписчиков: http://www.Kalashnikoff.ru

______________

По вопросам сотрудничества, рекламы и спонсорства обращайтесь:

  1. Публичное размещение материала из рассылки: Cooperation@Kalashnikoff.ru
  2. Реклама на сайте, в книге и рассылках: http://www.Kalashnikoff.ru/Reklama.html, Reklama@Kalashnikoff.ru
  3. Издание книги (спонсорство): Sponsor@Kalashnikoff.ru

Рассылка 'Ассемблер? Это просто! Учимся программировать (FAQ)' Рассылка 'Ассемблер? Это просто! Учимся программировать'


(C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться Рейтингуется SpyLog

В избранное