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

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


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

Народное голосование ПРЕМИИ РУНЕТА-2007!
Голосуем за RusFAQ.ru >>

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

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

Выпуск № 904
от 18.11.2007, 05:35

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


Вопрос № 109015: Здравствуйте! Возник вот такой вопрос: необходимо для процессора i8080 составить программу, которая проверяет биты 2 и 4 ячейки 0040 и переходит к выполнению команды из ячейки 0060, если в них записаны 1; переходит к выполнению команды из ячейки 0061...
Вопрос № 109152: Здравствуйте, уважаемые эксперты. Не могу разобрать начало инициализации вируса из главы 13 программы Virus13. 1. Непонятен синтаксис строки mov cx,offset Finish-100h, где Finish equ $. Что значит $? В предыдущих программах $ была в конце строки...
Вопрос № 109158: Здравствуйте! И еще раз вопрос для процессора i8080. Необходимо составить программу моделирования с помощью команд ассемблера следующего оператора языка условного высокого уровня IF [D] < 4 [E]=[H]+1 Заранее спасибо....

Вопрос № 109.015
Здравствуйте! Возник вот такой вопрос: необходимо для процессора i8080 составить программу, которая проверяет биты 2 и 4 ячейки 0040 и переходит к выполнению команды из ячейки 0060, если в них записаны 1; переходит к выполнению команды из ячейки 0061, если 1 записана только в бит 2; продолжается во всех иных случаях. Заранее спасибо.
Отправлен: 12.11.2007, 09:50
Вопрос задал: Миронов Александр Анатольевич (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Зенченко Константин Николаевич
Здравствуйте, Миронов Александр Анатольевич!

Ячейка может быть и байтом и словом,
считаем ячейка - байт.
LXI B,0040h
LDAX B;A=(BC)
;76543210
;00010100=14h
ANI 14h;А=A and 014h
CPI 14h;проверяем 2-ой и 4-ый биты
JZ 0060h
CPI 04h;проверяем 2-ой бит
JZ 0061h


Удачи!
---------
И только наступив на грабли мы приобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Специалист)
Ответ отправлен: 12.11.2007, 21:16
Оценка за ответ: 5

Отвечает: ausodf
Здравствуйте, Миронов Александр Анатольевич!
"bt", "bts", "btr" и "btc" оперируют с единичным битм, который может быть в памяти или регистре общего назначения
bt ax,15 ; тестирует бит в регистре
bts word [bx],15 ; тестирует и ставит бит в памяти

Приложение:

Ответ отправил: ausodf (статус: 2-ой класс)
Ответ отправлен: 13.11.2007, 00:06
Оценка за ответ: 5


Вопрос № 109.152
Здравствуйте, уважаемые эксперты. Не могу разобрать начало инициализации вируса из главы 13 программы Virus13.
1. Непонятен синтаксис строки mov cx,offset Finish-100h, где Finish equ $. Что значит $? В предыдущих программах $ была в конце строки, выводимой на экран, но в Virus13 таких строк нет. Но если всё же $ здесь и означает конец кода нашего вируса, то зачем к $ приписывать -100h. Всё равно ведь программа будет записана до $, а не до 100h. Отладчик же показывает cx 0084, а не 100h. Наверное, 0084h и есть размер нашего вируса.
2. К строке mov si,100h автор даёт комментарий: «DS:SI откуда перемещать будем нашу программу …» А каким образом в DS:SI попала наша программа, она же находится в DS:DX. Получается, что DX = SI. Всегда ли регистры DS:SI показывают содержание любой текущей программы или это касается только этой?
3. При выполнении команды jmp dword ptr cs:[Off_move], где Off_move dw offset Lab_jmp, изменяется регистр CS. Решив сократить код, т.е. написать не две строки как у автора, а одну, я переделал так: jmp dword ptr cs:[offset Lab_jmp], т.е. сразу указал на метку Lab_jmp, а не через переменную Off_move. Однако при выполнении этой команды регистр CS не изменился. Почему? Ведь в авторской строке и в моей фактически указан один и тот же адрес.
Заранее спасибо.

Приложение:

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

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Masada!
Давай по порядку...
0. Сначала давай разберем, как программа грузится в память.
а) ДОС выделяет (если возможно) всю оставшуюся память и строит в ней MCB,
т.е. оформляет ее как блок памяти
б) адрес сегмента этого блока памяти заносится в DS и ES
в) в начале сегмента длиной 100h строит так называемый блок PSP
г) загружает в память, начиная с DS:100h программу
д) для COM делает jmp PSP:100h (такой команды нет, это для понимания)
е) для EXE делается настройка адресов по таблице из заголовка и переход на адрес опять же из заголовка
1. Теперь о $.
Как правильно заметил, символом '$' в 9-й функции отмечается конец строки
Этот символ отрабатывается самой функцией во время выполнения программы
Кроме этого знак '$' используется ассемблером для указания адреса команды, следующей за текущей.
Заметь: во время ассемблирования! В самом коде доллара мы не найдем!
Например: jmp $ фактически ничего не дела ет (передает управление на следующую команду)
В нашем случае: командой finish equ $ мы запоминаем адрес конца программы как finish ($ стоит в конце программы...)
А mov cx, offset Finish-100h дает нам длину программы (разницу между концом и адресом загрузки!)
2. Командой mov si, 100h мы иницилизируем регистр si началом программы
Программа не попадала в DS:SI - она загружена в DS:100h.
Мы сами настраиваем регистры, как нам надо.
И вообще, откуда взял, что DS:DX - адрес программы? После загрузки программы
все регистры в общем случае неопределены.
3. Команда jmp dword ptr cs:[Off_move] предполагает, что надо сделать длинный переход
по адресу, хранящемуся в длинном слове Off_move.
Что мы и имеем в программе.
Твоя же модификация заставляет интерпретировать как длинный адрес двойное слово по адресу Lab_jmp.
Подумай сам, это одно ли тоже?
Мы же хотим перейти в сегмент 0BF00h, на тоже смещение...
А вообще, молодец, что пытаешьс я сам разобраться, пусть неправильно, но расуждаешь.
Удачи!
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 13.11.2007, 10:52
Оценка за ответ: 5
Комментарий оценки:
Ответившему поставил пять, т.к. несколько дней !!! потратил на то, чтобы разобраться, что в команде mov cs,offset Finish-100h, знак «-» означает не тире, а минус. :) Без помощи до сих пор бы считал этот знак за тире. Автор книги мог бы и написать, что этот знак есть минус, а не тире.

Отвечает: an42
Здравствуйте, Masada!
Ответ на вопрос 1. $ - счетчик текущего адреса, показывает смещение от начала сегмента до самого знака $. Пример:
data segment
metka1=$ ; metka1=0, так как от начала сегмента до $ (metka1) ноль байт
mes1 db ‘abcd’
metka2=$ ; metka2=4, так как от начала сегмента до $ (metka2) четыре байта
mes2 db ‘12345’
metka3=$-mes2 ; metka3=9-4=5, так как от начала сегмента до $ (metka3) девять байт (4 байта это mes2 и 5 байтов это mes3) смещение mes3 в сегменте data составляет 4, поэтому metka3 имеет значение 5 (сам знак $ в сегменте имеет нулевую длину, только не путать с ‘$’ – это 1 байт).
Аналогично $ работает и в сегменте команд (определяет длину программы от начало сегмента команд до знака $).
Строка mov cx,offset Finish-100h, эту строку можно было записать так mov cx, Finish-100h, где Finish equ $.
В этих двух случаях в cx заносится длина кода (в байтах) программы до Finish.

Ответ на вопрос 2. Строка mov si,100h определяет начало программного кода в сегменте CS, но так как вирус пишется в COM исполнении, то все сегменты cs, ds, ss, es имеют один и тот же адрес (директива assume), а то что код начинается с адреса 100h это требование COM – формата.
Адрес DS:DX – нужен для реализации например функции 09h прерывания 21h.
Далее в программе есть строка
mov es, Seg_move ;где Seg_move dw 0bf00h
mov di, 100h
эти строки необходимы для адреса приемника ES:DI
строка
rep movsb
это строковая операция которая копирует бай находящейся по адресу DS:SI (это код программы) в область памяти расположенной по адресу ES:DI, rep число повторений (число раз копирований) определяет регистр cx.

Ответ на вопрос 3. При выполнении команды jmp dword ptr cs:[Off_move], будет сформирован адрес состоящий из двух слов. Первое слово (младшее) будет считано по адресу cs:[Off_move], второе (старшее) слово будет считано по адресу cs:[Seg_move], и будет совершен межсегментный переход.
При выполнение команды jmp dword ptr cs:[offset Lab_jmp] будет сформирован адрес перехода на метку Lab_jmp, так как явно указываем текущей сегмент и адрес метки в этом сегменте. Компоновщик компонуя программу вычислит длину адреса, а она окажется меньше 64K поэтому он заменит код перехода на короткий или внутрисегментный. Поэтому команда jmp dword ptr cs:[offset Lab_jmp] равносильно команде jmp Lab_jmp.

Удачи
Ответ отправил: an42 (статус: 5-ый класс)
Ответ отправлен: 16.11.2007, 09:53
Оценка за ответ: 5
Комментарий оценки:
Очень понятно объяснена причина межсегментного перехода.


Вопрос № 109.158
Здравствуйте! И еще раз вопрос для процессора i8080. Необходимо составить программу моделирования с помощью команд ассемблера следующего оператора языка условного высокого уровня IF [D] < 4 [E]=[H]+1 Заранее спасибо.
Отправлен: 13.11.2007, 05:15
Вопрос задал: Миронов Александр Анатольевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Зенченко Константин Николаевич
Здравствуйте, Миронов Александр Анатольевич!

Все операции сравнения в процессоре i8080 используют одним операндом аккумулятор т.е. регистр А, значения регистров при этом не изменяются, но флаги признаков устанавливаются как при операции SUB A.
MVI A,04h;A = 4
CMP D;4-D = ? устанавливаем флаги признаков
JM next;D > 4 установился флаг минус(S)
JZ next;D = 4 установился флаг нуля(Z)
MOV E,H;E = H
INC E;E = E + 1
next: . . .
итого 11 байт.

Удачи!
---------
И только наступив на грабли мы приобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Специалист)
Ответ отправлен: 13.11.2007, 13:49
Оценка за ответ: 5


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.62.1 от 14.11.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное