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

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


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

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

Выпуск № 795
от 02.07.2007, 18:35

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


Вопрос № 93004: Добрый день! Я уже столько раз это перечитываю, в отладчике смотрю... но эти строки никак понять не могу: .... mov si,100h ;DS:SI откуда перемещать будем rep movsb ;перебрасываем нашу программу в область ;7 видеостраницы<br...
Вопрос № 93020: Здравствуйте! Возможно, мой вопрос не покажется вам заслуживающим внимания, но тем не менее я не могу до конца разобраться с командой test и прошу вашей помощи. test операнд_1,операнд_2 — операция проверки (способом логического умноже- н...
Вопрос № 93091: Добрый день! Я учу Ассемблер по рассылке "Ассемблер? Это просто! Учимся программировать" и никак не могу понять, почему Check_video proc главы 11 так сильно отличается от Check_video proc главы 14. Check_video proc mov ah,...

Вопрос № 93.004
Добрый день! Я уже столько раз это перечитываю, в отладчике смотрю... но эти строки никак понять не могу:
....
mov si,100h ;DS:SI откуда перемещать будем
rep movsb ;перебрасываем нашу программу в область
;7 видеостраницы

; ___________________________________________________

; !!! Теперь ВНИМАТЕЛЬНО следим за CS в отладчике !!!
; ___________________________________________________

jmp dword ptr cs:[Off_move] ;Прыгаем куда переместили (фактически на
;следующую строку, только уже в сегменте
;0BF00h!)

; Что показал отладчик? Подумайте, что произошло...

; Теперь мы уже в области экрана
Lab_jmp:
;Вот сюда-то мы и прыгнули с предыдущей строки! Толко CS теперь
;равен 0BF00h. Внимательно проследите в отладчике за этим...
....

НУ почему полсле jmp'а cs поменялся?..((
Ну в нем было то же, что и в ss и тут резко он меняется....
Если не сложно, помогите мне, пожалуйста...
Спасибо! Удачи! Всего наилучшего!

Приложение:

Отправлен: 26.06.2007, 21:52
Вопрос задал: Покритюк Виталий Леонидович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: Зенченко Константин Николаевич
Здравствуйте, Покритюк Виталий Леонидович!
Причина в этой команде
jmp dword ptr cs:[Off_move]
для перехода используется 4-е байта т.е. 2-а байта в IP и 2-а байта в CS, длинный переход в другой сегмент,
и этих переменных:
Off_move dw offset Lab_jmp;Смещение и
Seg_move dw 0BF00h;сегмент адреса, куда будем прыгать
итого в IP будет адрес метки Lab_jmp, а в CS будет 0BF00h. Это Вам показывает отладчик.
Удачи!

---------
И только наступив на грабли мы преобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Практикант)
Ответ отправлен: 26.06.2007, 22:05
Оценка за ответ: 3
Комментарий оценки:
Спасибо огромное за такие быстрые ответы!!!


Вопрос № 93.020
Здравствуйте!
Возможно, мой вопрос не покажется вам заслуживающим внимания, но тем не менее я не могу до конца разобраться с командой test и прошу вашей помощи.
test операнд_1,операнд_2 — операция проверки (способом логического умноже-
ния). Команда выполняет поразрядно логическую операцию Я над битами опе-
рандов операнд_1 и операнд_2. Состояние операндов остается прежним, изме-
няются только флаги ZF, SF, и PF, что дает возможность анализировать состояние
отдельных битов операнда без изменения их состояния в исходных операндах
Во многих источниках рассматривается команда test EAX, EAX, как определитель нуля в данном регистре ("... а не ноль ли в EAX"). Правильно ли я понимаю, что данная команда сработает только при наличии нуля в EAX, при любых других значениях этого не произойдёт. Какой смысл сравнивать содержимое регистра само с собой, если результат будет только при нулевом значени регистра? (Я не подвергаю это сомнению, я прошу объяснить смысл).
Заранее прошу прощения за возможно глупую интерпретацию данного вопроса, но если бы я это поннимал, то наверняка такой вопрос не задал бы. Ведь я только начинаю изучать Assembler.
Спасибо всем, кто откликнется
Отправлен: 27.06.2007, 00:28
Вопрос задал: Federal (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Олег Владимирович
Здравствуйте, Federal!

Действительно, странная формулировка "сработает только при...". Сработает-то она всегда, процессор ничего против test не имеет. :)

Если мы имеем своей целью различить случаи EAX == 0 и EAX != 0, то test eax, eax поможет - ведь при eax == 0 она устанавливает zf = 1, при eax != 0 zf = 0. Если же нужно проверить, EAX == 24 или EAX != 24, то test тут, конечно, не подходит. Здесь нужна простая универсальная CMP EAX, 24. Почему же cmp eax, 0 обычно не применяют в случае проверки на ноль? Можно и её, но просто test eax, eax короче - всего два байта. :)

Далее, если нам надо проверить, установлен ли нулевой бит в EAX, применяется test eax, 1, после чего опять-таки смотрят на ZF: ZF = 0 при установленном в 1 бите, ZF = 1 при сброшенном в 0. Догадайтесь, что делает test eax, 0FFFFFFFFh? Правильно, проверяет, установлен ли хоть один бит в EAX, т.е., в сущности, не ноль ли в аккумуляторе. Но эта команда опять-таки длиннее test eax, eax.

Ну и напоследок. Многие команды (add, sub, cmp, and, or, xor, adc, sbb, xadd, inc, dec, shl, shr, sar, ...) устанавливают флаги в соответствии с полученным результатом. По ним потом удобно судить о результате - 0 он (ZF), имеет ли знак(SF), и т.п. Но если никаких действий не производилось, например, команда mov eax, [edi] флагов не устанавливает, а хотелось бы, то делают холостую операцию только ради установки флагов в соответствии с результатом. Если хочется установить флаги в соответствии с состоянием eax, нужно придумать операцию, результатом которой будет eax. Например, test eax, eax, или or eax, 0. Они ничего, кроме флагов, не меняют, значение в регистре они не портят, но об этом значении мы можем что-то выяснить по флагам.

Если есть ещё вопросы, или если я не так что-то понял - обращайтесь в минифорум, проодлжим.

Удачи!
---------
Факультет ПМ-ПУ - лучший в СПбГУ!
Ответ отправил: Олег Владимирович (статус: Студент)
Ответ отправлен: 27.06.2007, 01:23
Оценка за ответ: 5


Вопрос № 93.091
Добрый день!
Я учу Ассемблер по рассылке "Ассемблер? Это просто! Учимся программировать" и никак не могу понять, почему Check_video proc главы 11 так сильно отличается от Check_video proc главы 14.

Check_video proc
mov ah,0Fh
int 10h
cmp al,3 ;Текущий режим монитора текстовый?
je Ok_video

mov ax,3 ;Если нет - делаем текстовый
int 10h

Ok_video:
cmp bh,0 ;Нулевая страница?
jz Ok_page

mov ax,0500h ;Если нет - делаем нулевую текущей
int 10h

Ok_page:
ret

Check_video endp

Check_video proc
mov ah,0Fh
int 10h
cmp al,3 ;Текстовый режим?
je Ok_video

mov ax,3 ;Если нет - делаем текстовый
int 10h

Ok_video:
or bh,bh ;Нулевая страница?
jz Ok_page

mov ax,0500h ;Если нет - делаем нулевую текущей
int 10h

Ok_page:
ret
Check_video endp
1. Почему в 11 главе cmp bh,0, а в 14 уже or bh,bh ?
2. А почему 0-ая страница 0500h, а не 0B800h

Если не сложно, подскажите, пожалуйста.
Удачи!

Приложение:

Отправлен: 27.06.2007, 15:34
Вопрос задал: Покритюк Виталий Леонидович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Зенченко Константин Николаевич
Здравствуйте, Покритюк Виталий Леонидович!

1) Команды cmp bh,00h и or bh,bh делают одно и тоже, а именно устанавливают флаг ZF, в первом случае содержимое регистра сравнивается с числом, при равенстве ZF=1, во втором случае регистр проверяется сам с собой, при bh=00h флаг ZF=1.
Вместо or bh,bh можно использовать команду and bh,bh, при проверке на ноль они делают одно и тоже
2)
mov ax,0500h- это AH=05h фунцция прерывания 10h BIOS, устанавливает видео страницу, номер которой указан в AL=00h.
0B800h-это сегментный адрес видеобуфера, обычно он используется при прямой записи в видеобуфер.
mov bx,0B00h
mov ex,bx
mov cx,50
xor di,di
mov ax,1401h;синий фон красная мордочка
cld
rep stosw
на экране появятся 50 мордочек
Удачи!
---------
И только наступив на грабли мы преобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Практикант)
Ответ отправлен: 27.06.2007, 16:31
Оценка за ответ: 5
Комментарий оценки:
Огромное спасибо! Удачи!


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

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

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

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

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


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


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

В избранное