|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 28, 2003 19:00:19 · Поправил: Безпощадный даос Ау прогеры!!! Help me!!!!!!!!!!!! Помогите убежать от ламерства Изучаю АссУмблер по Питеру Абелю, но там не написано коментарий на следующий кусок проги: code segment org 100h assume cs: code, ds: data, ss: stack code segment para 1 push ds 2 xor ax,ax 3 push ax 4 mov ax, data 5 mov ds,ax Какого черта надо указывать ds явно его адрес, если cs указывать явно не надо И не проще ли заменить команды: xor ax,ax push ax на: push 0000h Я думаю следующим образом: система до запуска проги имела свой сегмент данных, но ведь в проге он совершенно другой и в нем свои данные, поэтому чтобы сегмент системы не запороть мы его и заносим в стек с помощью первых трех команд 1,2 и 3. Второе: при ассемблировании транслятор ассоциирует ds с именем data и где встретится data то речь идет о ds и при встрече data segment присвоит адрес, но ведь адрес то присвоили data. И это мы испрвляем двумя последними командами. Так ли это в действительности? Или это все выглядит в другом свете: При первом проходе ассемблер встретив code segment дает этому сегменту относительный адрес, который в последствии при директиве: assume cs: code, ds: data, ss: stack заносит его в cs. Если так то какого черта опять таки заносить 4 и 5. И почему это не требуется для cs? Помогите разобраться мой e-mail: int20h@yandex.ru. Заранее благодарен Evil`s Interrupt |
|
|
Дата: Окт 28, 2003 20:45:59 code segment org 100h assume cs: code, ds: data, ss: stack code segment para 1 push ds 2 xor ax,ax 3 push ax 4 mov ax, data 5 mov ds,ax Если есть org 100h то mov ax,data не нужен, ибо у тебя com файл. А там по умолчанию ds=es=cs=ss push 0000h В 8086 проце такой команды не было. |
|
|
Дата: Окт 28, 2003 22:21:00 Здорово Kba3iM0go!!! Спасибо за ответ, но мне все таки интересно как бы работал код, ежели бы не было org 100h. Я хочу не зубрить, а понимать код. |
|
|
Дата: Окт 28, 2003 22:21:13 Здорово Kba3iM0go!!! Спасибо за ответ, но мне все таки интересно как бы работал код, ежели бы не было org 100h. Я хочу не зубрить, а понимать код. |
|
|
Дата: Окт 28, 2003 22:22:52 Здорово Kba3iM0go!!! Спасибо за ответ, но мне все таки интересно как бы работал код, ежели бы не было org 100h и создаю я все таки exe,а не com файл и впридачу Я хочу не зубрить, а понимать код. |
|
|
Дата: Окт 28, 2003 22:47:15 Извиняюсь за такие не в темные приколы, но меня уже от ассема плющит. Читаю По мимо Ассема Джордейна Рулезный чувак. |
|
|
Дата: Окт 28, 2003 22:54:09 org 100h - ты плохо читал Абеля. Ибо, если бы читал внимательно, добрался бы до понятия "PSP" - это и есть ответ на твой вопрос. |
|
|
Дата: Окт 28, 2003 23:08:03 Ну так объясни пожалуйста, маленькому и нетерпеливому ребенку. |
|
|
Дата: Окт 28, 2003 23:10:24 Короче объясню свою малюсенькую проблему заново: создается exe-прога и есть кусок от нее: code segment 1.assume cs: code, ds: data, ss: stack org 100h не было это я извиняюсь чуть не так написал 2.push ds 3.sub ax,ax 4.push ax 5.mov ax, data 6.mov ds, ax Предположиу что есть xxxx: yyyy формат записи ячейки памяти. Не могу понять, что же все таки тут происходит. Толи assume заносит новый xxxx в cs, ds и ss. Или же она использует старые, но сode, data и stack выступают в роли смещения, если так то не понимаю почему стр.1 идет после code segment. Просьба разъясните весь механизм инициализации exe - программы и не ссылаться на книги. Если что не так высказал прошу простить я еще маленький в языке такого уровня. Заранее благодарен Evil`s Interrupt |
|
|
Дата: Окт 28, 2003 23:39:43 assume формально указывает ассемблеру какими регистрами адресовать сегмент кода, данных и стека, при этом она ничего никуда не заносит. При входе в exe программу уже инициализированы регистры стека(ss) и сегмента(cs) и необходима инициализация регистра ds. В твоем блоке, EvilsInterrupt, в строке 2 сохраняется регистр ds в стеке, видимо он где-то будет извлекаться из стека командой pop ds. в строке 3 обнуляется регистр ax в строке 4 регистр ax заносится в стек, видимо тоже будет где-то дальше оттуда извлекаться. в строке 5 в регистр ax заносится сегментный адрес блока data. А в строке 6 этот сегментный адрес заносится в регистр ds. Последние 2 строки (5 и 6) логичнее будет так mov ds,data, но процессор не поддерживает такую прямую адресацию сегментных регистров. |
|
|
Дата: Окт 29, 2003 05:25:45 как-то перечитывал доку по Асму, по которой учился.... там оказывается очепяток - как собак нерезанных! вот и ломают новички голову.... |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076 |