· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› Вопрос по Абелю

Посл.отвђт Сообщен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