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

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


Информационный Канал Subscribe.Ru

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

Выпуск № 695
от 05.02.2004, 13:50

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 4909
Отправлено ответов: 13745
Активность: 279.9 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Bob Johnson
Статус: Профессиональный
Общий рейтинг: 145.63
URL: Программирование
[Подробней >>]
Artemy
Статус: Опытный
Общий рейтинг: 116.3
Телефон: 8 905 549 38 66
[Подробней >>]
ASMодей
Статус: Профессиональный
Общий рейтинг: 112.22
[Подробней >>]
 
_vt
Статус: Профессиональный
Общий рейтинг: 117.65
URL: Тест
[Подробней >>]
Евгений Иванов
Статус: Профессиональный
Общий рейтинг: 136.5
URL: Super Assembler Software
Телефон: Пчёлка +7 905 6601206
[Подробней >>]
Borisov
Статус: Доверительный
Общий рейтинг: 113.77
[Подробней >>]
 
Ayl
Статус: Профессиональный
Общий рейтинг: 116.55
[Подробней >>]
Andrew Vext
Статус: Профессиональный
Общий рейтинг: 103.32
[Подробней >>]
SedHg
Статус: Доверительный
Общий рейтинг: 114.59
[Подробней >>]
 
never_again
Статус: Опытный
Общий рейтинг: 124.8
[Подробней >>]
Dark_Lord
Статус: Профессиональный
Общий рейтинг: 110.23
[Подробней >>]
Grayscale
Статус: Начальный
Общий рейтинг: 104.34
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 4888. Здравствуйте Эксперты! У меня такая проблема: Нужно сделать пару заданий на ассемблере, но я писал... (ответов: 2)
Вопрос № 4891. Доброго времени суток, знатоки Ассемблера! Появилась необходимость написать обработчик прерываний в ... (ответов: 2)
Вопрос № 4892. Уважаемые эксперты! Я пытался скомпериловать файл sshell.asm из старой рассылки под номером 18. Вот ... (ответов: 2)
Вопрос № 4893. Здраствуйте уважаемые эксперты, у меня вопрос относительно десятого выпуска рассылки по ассемблеру, ... (ответов: 6)
Вопрос № 4894. Здравствуйте, уважаемые эксперты! Из чего будет состоять простенькая ОС, которая будет грузиться с д... (ответов: 3)
Вопрос № 4896. Доброго времени суток. Я смотрю, не густо у вас тут с вопросами и ответами. В общем, не важно. У м... (ответов: 5)
Вопрос № 4899. Здравствуйте. У меня такой вопрос есть. У кого есть в отдельном файле обработчик 9-го прерывания рип... (ответов: 1)
Вопрос № 4902. Здравствуйте! Объясните мне, пожалуйста, для чего в этом фрагменте программы нужна команда CMP (фраг... (ответов: 3)
Вопрос № 4904. Привет. Вот тут наткнулся на такую проблему6: LOCAL label [[ [count ] ]] [[:type]] [[, label [[ [cou... (ответов: 2)

Вопросов: 9, ответов: 26


 Вопрос № 4888

Здравствуйте Эксперты!
У меня такая проблема:
Нужно сделать пару заданий на ассемблере, но я писал только макросы в Екселе, а по ассемблеру ни в зуб ногой:) Помогите, если есть возможность.
1. (a – b) / 2 + (c – d) / 3
2. (a ^ 5 – (b | 3)) / 2 + (!c + !d) / 3 & 7
Переменные a,b,c,d- нужно занести в регистры общего назначения AX, BX, CX и DX с использованием команды MOV.
Всем ответившим ОГРОМНОЕ СПАСИБО заранее.



Вопрос отправлен: 29.01.2004, 20:46
Отправитель: Killer

[Следующий вопрос >>] [Список вопросов]

Отвечает Bob Johnson

Здравствуйте, Killer!
См. приложение.

* EMan1.5: ---===*** The game we play ***===---

Приложение:


Ответ отправлен: 31.01.2004, 22:53
Отправитель: Bob Johnson


Отвечает Artemy

Приветствую Вас, Killer!
1. (a – b) / 2 + (c – d) / 3
mov ax,a
mov bx,b
mov cx,c
mov dx,d
sub ax,bx
shr ax,1
sub cx,dx
push ax
mov ax,cx
xor dx,dx
mov bx,3
div bx
pop cx
add ax,cx
; в AX - результат

2. (a ^ 5 – (b | 3)) / 2 + (!c + !d) / 3 & 7
mov ax,a
xor dx,dx
mov bx,ax
mov cx,4
l1: mul bx
loop l1
mov bx,b
or bx,3
sub ax,bx
shr ax,1
push ax
mov ax,c
xor ax,0FFFFh
mov dx,d
xor dx,0FFFFh
sub ax,dx
xor dx,dx
mov bx,3
div bx
and ax,7
pop bx
add bx,ax
mov ax,bx
; в AX - результат


Ответ отправлен: 30.01.2004, 10:11
Отправитель: Artemy


 Вопрос № 4891

Доброго времени суток, знатоки Ассемблера! Появилась необходимость написать обработчик прерываний в среде Win32. Процедуры программирования контороллера прерываний для DOS не работают! Как быть? Если можно, дайте ссылки на ресуры в инете по данной тематике! Спасибо за ответ!



Вопрос отправлен: 30.01.2004, 00:23
Отправитель: lexa (driver@aviel.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Bob Johnson

Доброе время суток, lexa!
Тебе надо писать драйвер - только в нем разрешено обрабатывать прерывания.
Если твоя ОС - это 9х, то описание, как самому написать драйвер есть на моей странице.
Если же, ОС - это НТ какой-либо версии, то рекомендую поискать литературу вроде Inside Windows 2000 или что-то подобное.

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 31.01.2004, 22:54
Отправитель: Bob Johnson


Отвечает ASMодей

Доброе время суток, lexa!
Кто же тебе даст в Win32 просто так обработчик поставить на прерывание, они вроде как защищены от таких действий. Надо драйвер писать.

Ответ отправлен: 30.01.2004, 07:08
Отправитель: ASMодей


 Вопрос № 4892

Уважаемые эксперты!
Я пытался скомпериловать файл sshell.asm из старой рассылки под номером 18. Вот текст того файла, из-за которого компелятор выдает ошибку:
; === Читаем файлы в текущем каталоге ===
Get_files proc
call Get_first ;Получаем первый файл
jc No_morefiles ;Если нет файлов вообще - на выход
cmp word ptr cs:[DTA+1Eh],002Eh ;Первый файл - '.'?
je Next_file ;Если так, то ищем следующий файл...
call Move_file ;Если нет, то переносим файл в память.
Next_file:
call Get_other ;Получаем следующий файл...
jc No_morefiles ;Файлы закончились - на выход.
call Move_file ;Если нет, то переносим файл в память.
jmp short Next_file ;Ищем следующий файл...
No_morefiles:
ret
Get_files endp
; === Поиск первого файла в текущем каталоге ===
Get_first proc
;Атрибуты файла (в CX):
;000001 - только чтение
;000010 - спрятанный
;000100 - системный
;001000 - метка тома
;010000 - подкаталог
;100000 - архивный
mov ah,4Eh ;Функция поиска первого файла
mov cx,110111b ;С атрибутами:
;архивный (archive), подкаталог (directory),
;системный (system), спрятанный (hidden)
;только чтение (read-only)
mov dx,offset All_files ;Маска поиска
int 21h
ret
Get_first endp
; === Поиск следующих файлов ===
Get_other proc
mov ah,4Fh ;Функция поиска следующих файлов
mov dx,9Eh ;DX указывает на DTA
int 21h
ret
Get_other endp
; --- Перенос файла из DTA в сегмент файлов ---
Move_file proc
push es
mov si,DTA+1Eh ;SI=DTA+1Eh=имя найденного файла
mov di,Current_offset ;Текущее свободное смещение
mov es,Seg_files ;ES=сегмент для найденных файлов
Next_fbyte:
lodsb ;Получаем первый символ имени файла
or al,al ;Это нуль (конец имени)?
jz End_offile ;Да - на выход
stosb ;Нет - сохраним символ в памяти
jmp short Next_fbyte ;Следующий символ...
End_offile:
stosb ;Запишем нуль в память после имени файла
mov Current_offset,di ;Сохраним текущее смещение
stosb ;Запишем еще один нуль...
pop es
ret
Move_file endp
; === Вывод наденных файлов на экран ===
Out_files proc
mov bl,Number_files ;BL указывает на количество выводимых файлов
push ds
push es
mov ds,Seg_files ;DS=сегмент найденных файлов в памяти
push 0B800h
pop es
xor si,si
mov ah,1Bh ;Атрибуты
mov dx,0302h ;Начало для вывода файлов
Next_fileout:
call Print_string ;Выводим очередной файл
cmp byte ptr [si],0 ;Следующий байт=0? Значит, это был последный файл...
jz Exit_files ;Тогда выходим.
add dx,0100h ;Иначе увеличиваем DH на 1 для вывода следующего имени...
dec bl ;Уменьшаем количество выводимых файлов на 1
jnz short Next_fileout ;Уже 0? Тогда больше выводить не нужно...
Exit_files:
pop es
pop ds
ret
Number_files db 20 ;Количество выводимых файлов на экран.
Out_files endp
А вот сама ошибка, которую он выдает:
files.asm (8):error A2006: undefined symbol:DTA
files.asm (8):error A2006: undefined symbol:all_files
files.asm (8):error A2006: undefined symbol:DTA
files.asm (8):error A2006: undefined symbol:Current_offset
files.asm (8):error A2006: undefined symbol:Seg_files
files.asm (8):error A2006: undefined symbol:Curremt_offset
files.asm (8):error A2006: undefined symbol:Seg_files
Что не нравится этому компилятору? Забыл сказать, что это MASM 6.11. До этого я компилировал сотни программ, и все было нормально.



Вопрос отправлен: 30.01.2004, 07:45
Отправитель: Int21h

[Следующий вопрос >>] [Список вопросов]

Отвечает _vt

Здравствуйте, Int21h!
Ты просто намешал файлы из нескольких выпусков рассылки... Приведенный тобой пример из 21 выпуска, а компилируешь ты, судя по твоим же словам, sshell18.asm. Тебе нужно взять все файлы от одного выпуска.
> До этого я компилировал сотни программ, и все было нормально.
Если бы ты компилировал "сотни" программ, то наверное догадывался бы, что эти ошибки означают, что какие-то переменные не определены, в данном случае - DTA, all_files и др.
--- E-Man 1.5+ : Sorry for terrible english. My native language is C++


Ответ отправлен: 30.01.2004, 12:31
Отправитель: _vt


Отвечает Евгений Иванов

Доброе время суток, Int21h!
У тебя символы не определены или ты не подключил INC-файл.
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 30.01.2004, 13:45
Отправитель: Евгений Иванов


 Вопрос № 4893

Здраствуйте уважаемые эксперты, у меня вопрос относительно десятого выпуска рассылки по ассемблеру, при описании резидентного вируса, мы обьявляем переменную в теле процедуры, однако потом мы обращемся к ней как бы в теле самой программы, так понимать в ассемблере нет такого понятия как область видимости ? т.е. переменные получаются глобальными ко всей программе ?
Да и вот такой вопрос относительно размерности параграфа, в одном описании говорится что он имеет размерность 16 бит, в другом 16 байт, какому описанию верить ?
Заранее благодарен за возможные ответы,
с уважением Владимир.



Вопрос отправлен: 30.01.2004, 08:39
Отправитель: Vladimir

[Следующий вопрос >>] [Список вопросов]

Отвечает Borisov

Здравствуйте, Vladimir!
В ассемблере существует зона видимости переменных, например при многомодульной структуре программы.


Ответ отправлен: 30.01.2004, 09:05
Отправитель: Borisov


Отвечает Ayl

Добрый день, Vladimir!
Понятие видимости в ассемблере присутствует, но только на уровне файлов. То есть все именованные объекты видимы до конца файла. Если нужно их сделать доступными для других файлов, пишут директивы PUBLIC/EXTRN.
Понятие процедуры как таковой в ассемблере просто отсутствует. Директивы определения процедур proc/endp введены только для удобства программистов. На самом деле вызвать процедуру можно и так:

call A
...
A:
...

то есть достаточно просто поставить метку.
Параграф - это 16 байт. Видимо, в описании просто описка. Параграф удобен в моделе адресации, принятой в Real Mode процессоров Intel - значение сегментного регистра определяет параграф памяти.


Ответ отправлен: 30.01.2004, 18:33
Отправитель: Ayl


Отвечает Bob Johnson

Доброе время суток, Vladimir!
> т.е. переменные получаются глобальными ко всей программе ?
Да, если не разрешишь локальные переменные и не будешь обзывать их @@...
> какому описанию верить ?
Параграф - это 16 байт. 16 бит - это два байта, т.е. слово. Почему параграф - это 16 байт? Потому что в реальном режиме увеличение номера сегмента на 1 означает увеличение реального адреса на 16 байт.

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 31.01.2004, 22:54
Отправитель: Bob Johnson


Отвечает Евгений Иванов

Доброе время суток, Vladimir!
16 bytes.
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 31.01.2004, 12:45
Отправитель: Евгений Иванов


Отвечает Artemy

Здравствуйте, Vladimir!
Если в описании переменной не указывать LOCAL, то она бедет доступна из всех процедур.
Параграф - 16 байт
Слово - 16 бит

Ответ отправлен: 30.01.2004, 10:16
Отправитель: Artemy


Отвечает _vt

Добрый день, Vladimir!
При использовании обычного синтаксиса "зон видимости" нету... Но, например, в режиме ideal турбоассеблера или в ассемблере masm32, можно при описании процедур указывать какие-то переменные локальными.
2)Размерность параграфа - 16 байт, насчет бит, это наверное опечатка.
--- E-Man 1.5+ : Sorry for terrible english. My native language is C++


Ответ отправлен: 30.01.2004, 12:31
Отправитель: _vt


 Вопрос № 4894

Здравствуйте, уважаемые эксперты!
Из чего будет состоять простенькая ОС, которая будет грузиться с дискеты?
Командный интерпретатор. Что ещё?
Чтобы она могла запускать на выполнение программы что нужно сделать?
Спасибо!



Вопрос отправлен: 30.01.2004, 10:56
Отправитель: Drahus (drahus@yandex.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Ayl

Приветствую Вас, Drahus!
Из системных функций. Таких как распределение памяти, доступ к файлам, запуск и завершение программ, ввод-вывод и т.п. В общем, они будут заменять функции прерываний DOS - 20h, 21h и т.д.


Ответ отправлен: 30.01.2004, 18:36
Отправитель: Ayl


Отвечает Bob Johnson

Доброе время суток, Drahus!
Командный интерпретатор - это, кстати, необязательно. Ты можешь написать ОС, которая запусть после загрузки заданную прогу и та уже будет делать нужные действия - как видишь командный интерпретатор не нужен.
Основные моменты:
1. Обработчики прерываний (назовем их "драйверы" устройств).
2. Менеджер памяти.
3. Подсистема работы с накопителями информации.
Может, что-то еще... :)

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 31.01.2004, 22:54
Отправитель: Bob Johnson


Отвечает Andrew Vext

Доброе время суток, Drahus!
поглядите www.menuet.narod.ru или ранние версии Linux.
Если коротко, то необходимо следующее:
1. Загрузчик
2. Обработка прерываний
3. Драйверы устройств
4. Диспетчер памяти
5. Загрузка и запуск процессов.


Ответ отправлен: 30.01.2004, 11:50
Отправитель: Andrew Vext


 Вопрос № 4896

Доброго времени суток.
Я смотрю, не густо у вас тут с вопросами и ответами. В общем, не важно.
У меня проблемка, начал я изучать ассемблер, попробовал работать с файлами, но не получается у меня найти нужный файл, открыть его, записать в него что-либо, и закрыть. Вроде без ошибок работает прога, но файл не изменяется. Нет ли исходника? Под ДОС



Вопрос отправлен: 30.01.2004, 16:23
Отправитель: nitzshe

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Добрый день, nitzshe!
Смотри у меня на сайте в разработках программу CODER.
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 31.01.2004, 13:15
Отправитель: Евгений Иванов


Отвечает SedHg

Доброе время суток, nitzshe!
Исходник чего? Если из рассылки "Ассемблер - это просто", то смотрите на Kalashnikoff.ru


Ответ отправлен: 31.01.2004, 02:18
Отправитель: SedHg


Отвечает Artemy

Здравствуйте, nitzshe!
Давай свою программу и тебе укажут
что там не правильно.

Ответ отправлен: 30.01.2004, 16:57
Отправитель: Artemy


Отвечает never_again

Добрый день, nitzshe!
Ты ьы лучше свой исходник прислал и эксперты проверили бы его на наличие ошибок. А "Вроде без ошибок" ещё не хначит, что точно без ошибок.

Ответ отправлен: 30.01.2004, 23:12
Отправитель: never_again


Отвечает Ayl

Добрый день, nitzshe!
Лучше бы ты свою прогу показал. Тебе бы указали на ошибки. А так по тексту чужой проги многому не научишься...


Ответ отправлен: 30.01.2004, 19:00
Отправитель: Ayl


 Вопрос № 4899

Здравствуйте. У меня такой вопрос есть. У кого есть в отдельном файле обработчик 9-го прерывания рипнутый из недр МС ДОСа? Я тут скачал "исходники" МС ДОС 3.30, но на поверку это просто оказались инструменты для программистов с описанием всех структур и т.д.



Вопрос отправлен: 31.01.2004, 11:58
Отправитель: noname

[Следующий вопрос >>] [Список вопросов]

Отвечает _vt

Здравствуйте, noname!
У меня есть исходники дос 3.30, они отлично собираются и дос работает. А 9-е прерывание - это прерывание bios, его исходников у меня нет :-)
--- E-Man 1.5+ : Sorry for terrible english. My native language is C++


Ответ отправлен: 02.02.2004, 19:26
Отправитель: _vt


 Вопрос № 4902

Здравствуйте!
Объясните мне, пожалуйста, для чего в этом фрагменте программы нужна команда CMP (фрагмент программы из книги Зубкова. Переводит десятичное число в шестнадцатеричное).
print_al:
mov dh,al
and dh,0Fh ; DH - младшие 4 бита
shr al,4 ; AL - старшие
call print_nibble ; вывести старшую цифру
mov al,dh ; теперь AL содержит младшие 4 бита
print_nibble: ; процедура вывода 4 бит (шестнадцатеричной цифры)
cmp al,10 ; три команды, переводящие цифру в AL
sbb al,69h ; в соответствующий ASCII-код
das ; (см. описание команды DAS)
mov dl,al ; код символа в DL
mov ah,2 ; номер функции DOS в АН
int 21h ; вывод символа
ret



Вопрос отправлен: 31.01.2004, 15:33
Отправитель: Alex

[Следующий вопрос >>] [Список вопросов]

Отвечает Dark_Lord

Здравствуйте, Alex!
Команда sbb вычитает не только второй операнд, но и флаг CF, а cmp и заполняет этот флаг, если число меньше 10, то вычитается значение на 1 большее чем число, после чего das в зависимости от подставлего дорабатывает число!

Ответ отправлен: 31.01.2004, 16:22
Отправитель: Dark_Lord


Отвечает Grayscale

Доброе время суток, Alex!
Комманда cmp устанавливает флаг CF, если число в al>= 10
а комманда sbb уже из разности в отличее от sub вычтет еще и значение этого флага из чисел 0-9 будет вычтено не 69h
а 70h


Ответ отправлен: 31.01.2004, 17:29
Отправитель: Grayscale


Отвечает Евгений Иванов

Приветствую Вас, Alex!
Если меньше 10, то вычитает ещё единичку.
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 01.02.2004, 10:20
Отправитель: Евгений Иванов


 Вопрос № 4904

Привет.
Вот тут наткнулся на такую проблему6:
LOCAL label [[ [count ] ]] [[:type]] [[, label [[ [count] ]] [[type]]]]...
Within a procedure definition (PROC), LOCAL creates stack-based
variables that exist for the duration of the procedure. The label may be a
simple variable or an array containing count elements.
С этим всё ясно, но как положить в переменную значение не ясно... просто с mov не работает. делаю вот так:
SomeProc proc
local x:word
mov ax,SomeVar
mov x,ax
ret
SomeProc endp



Вопрос отправлен: 01.02.2004, 13:47
Отправитель: ___|___

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Заключи в скобки квадратные.
mov [x],ax
или используй ещё @@
local @@x :dword
mov [@@x], ax
Бывай.
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 02.02.2004, 17:47
Отправитель: Евгений Иванов


Отвечает _vt

Здравствуйте, ___|___!
Не используй эти высокоуровневые заморочки - это уже не ассемблер получается, а стековые переменные создавай сам. Типа того:
someproc proc
mov bp,sp
add bp,2
...
mov ax, stackvar
...

ret
stackvar equ [bp]

someproc endp
--- E-Man 1.5+ : Sorry for terrible english. My native language is C++


Ответ отправлен: 02.02.2004, 19:27
Отправитель: _vt



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


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


Получить ответов:


 Выбор рассылки

Программисту
Assembler (24)
C / C++ (13)
Perl (2)
Builder / Delphi (18)
Pascal (18)
Basic / VBA (7)
Java / JavaScript (3)
PHP (12)
Криптография (4)
WinAPI (9)
Радиоэлектроника (5)
Пользователю
Windows 95/98/Me (46)
Windows NT/2000/XP (59)
"Железо" (35)
Поиск информации (17)
Администратору
Windows NT/2000/XP (32)
Linux / Unix (12)
Юристу
Гражданское право (16)
Семейное право (10)
Трудовое право (12)
КоАП (11)

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




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное