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

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


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

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

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

Выпуск № 1085
от 14.10.2008, 16:05

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

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 146472: Здравствуйте! Вопрос о прыжке с другой сегмент. Каким образом меняется cs? Вобщем вот программа (написана по книге Калашникова на FASM: <div style="margin:15px; margin-top:10px"><div><b><font color="gray">Код:</font></b></div><pre style="..."
Вопрос № 146579: Доброго времени суток, уважаемые эксперты. Помогите пожалуйста с такой задачей на MASM32: Задана произвольная последовательность латинских букв из 18 символов. Выполнить сортировку по алфавиту. Благодарен Вам за помощь....

Вопрос № 146.472
Здравствуйте!
Вопрос о прыжке с другой сегмент. Каким образом меняется cs?
Вобщем вот программа (написана по книге Калашникова на FASM:

Код:

org 100h

jmp init

Off_move dw Lab_jmp
Seg_move dw 0BF00h
Off_return dw Lab_return
Seg_return dw ?
Handle dw 0FFFFh
Mask_file db '*.com',0

FileOpen:
mov ax, 3D02h
int 21h
mov [Handle], ax
mov bx, ax
ret

FileClose:
cmp [Handle], 0FFFFh
je quit
mov bx, [Handle]
mov ah, 3Eh
int 21h
quit:
ret

FileFirst:
mov ah, 4Eh
xor cx, cx
mov dx, Mask_file
int 21h
ret

FileNext:
xor dx, dx
xor cx, cx
mov ah, 4Fh
int 21h
ret

Infect:
clc
ret

init:
mov es, [Seg_move]
mov di, 100h
mov cx, Finish-100h
mov si, 100h
rep movsb
jmp dword [cs:Off_move]

Lab_jmp:
nop
nop
push cs
pop ds
mov [Seg_return], ss
mov ah, 1Ah
xor dx, dx
int 21h
call FileFirst
jc No_Files
Do_Infect:
call Infect
jnc No_Files
call FileNext
jc Do_Infect
No_Files:
jmp dword [cs:Off_return]

Lab_return:
push cs
push cs
pop ds
pop es
mov ah, 1Ah
mov dx, 80h
int 21h
ret

Finish:
; или
; Finish = $
; т.к. у FASM'а синтаксис чуть отличается от MASM/TASM



программа работает нормально, но я никак не могу понять...
в строке jmp dword [cs:Off_move] мы прыгаем в другой сегмент на адрес, указываемый Off_move (это понятно)., но ведь cs на на момент выполнения этой инструкции прежний (в моём случае 10FEh), а никак не 0BF00h (т.е. 7-я страница видеопамяти).

Из книги:
Нам осталось прыгнуть на адрес 0BF00:IP. Как известно, CS:IP всегда показывают текущее операцию (адрес текущей операции). Обратите внимание, как мы прыгаем:

jmp dword ptr cs:[Off_move]

Посмотрите, что содержит переменная Off_move, а также посмотрите в отладчике, что будет происходить с регистрами CS:IP. Все станет на свои места... Подсказка: начиная с метки Lab_jmp мы работаем в области 7-ой видеостраницы...


как мы прыгаем я вижу, что происходит с регистрами CS:IP я тоже вижу, CS меняется на 0BF00h, а IP на смещение Lab_jmp.
Объясните дураку, пожалуйста, почему меняется CS?

ЗЫ
сначала я думал, что меняется оттого, что в es вы загрузили Off_move, т.е. 0BF00h, попытка вида:
Код:

push cs
pop es

т.е. чтобы оба регистра указывали на текущее смещение, не увенчалась успехом(
jmp dword ptr cs:[Off_move] всёрано прыгает в другой сигмент, хоть убейте, не пойму почему((

ЗЫЫ
если можно, по-подробнее объясните..

Зарание огромное спасибо!
Отправлен: 08.10.2008, 17:21
Вопрос задал: Alexeyk (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

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

Выполняя команду дальнего перехода jmp dword ptr cs:[Off_move] процессор считывает двойное слово по адресу Off_move. Поэтому адресу в памяти хранится два слова по 16-ть бит.
Код:
Off_move dw Lab_jmp
Seg_move dw 0BF00h

Первое слово указывает адрес смещения в сегменте, а второе - указывает на адрес сегмента. Именно поэтому у Вас изменяется регистр CS, т.к. во втором слове прописано 0BF00h.

Удачи!
---------
Итерация от человека, рекурсия — от Бога (Питер Дойч)
Ответ отправил: Зенченко Константин Николаевич (статус: Профессор)
Украина, Киев
Тел.: +380979536619
Адрес: Украина г.Киев
----
Ответ отправлен: 08.10.2008, 17:51
Оценка за ответ: 5


Вопрос № 146.579
Доброго времени суток, уважаемые эксперты. Помогите пожалуйста с такой задачей на MASM32:
Задана произвольная последовательность латинских букв из 18 символов. Выполнить сортировку по алфавиту.
Благодарен Вам за помощь.
Отправлен: 09.10.2008, 15:20
Вопрос задал: Alexkharkov (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Greenzed
Здравствуйте, Alexkharkov!

По вашей теме , на этой странице описываемый вами вопрос подробно разбирается:
http://sa-sec.org/2008/09/30/421/
Ответ отправил: Greenzed (статус: 1-ый класс)
Ответ отправлен: 09.10.2008, 16:15


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

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

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

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

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

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


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


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале

∙ Версия системы: 5.5 от 09.10.2008

Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное