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

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

RusFAQ.ru: программирование на языке Assembler

Выпуск № 657
от 02.11.2003, 12:40

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 4407
Отправлено ответов: 12733
Активность: 288.9 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

dr_dolphin
Статус: Доверительный
Общий рейтинг: 117.79
[Подробней >>]
Евгений Иванов
Статус: Профессиональный
Общий рейтинг: 142.18
URL: Super Assembler Software
Телефон: НСС +7 831 3107039
[Подробней >>]
never_again
Статус: Доверительный
Общий рейтинг: 139.06
[Подробней >>]
 
Bob Johnson
Статус: Профессиональный
Общий рейтинг: 149.68
URL: Программирование
[Подробней >>]
_vt
Статус: Профессиональный
Общий рейтинг: 121.14
[Подробней >>]
Ayl
Статус: Профессиональный
Общий рейтинг: 117.18
[Подробней >>]
 
PUSH
Статус: Начальный
Общий рейтинг: 111.11
[Подробней >>]
Gibbel
Статус: Профессиональный
Общий рейтинг: 106.56
URL: Savage Metal Club - жизнь в стиле рок-н-ролл
Телефон: +7 901 710 3146
[Подробней >>]
netus
Статус: Начальный
Общий рейтинг: 110.71
[Подробней >>]
 
Dark_Lord
Статус: Профессиональный
Общий рейтинг: 110.85
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 108.03
[Подробней >>]
Portnov
Статус: Профессиональный
Общий рейтинг: 108.23
URL: Мой сайтик...
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 4374. Эксперты! Когда то давно,пользовался SI 4.05 под виндой 95, теперь снова понадобилось,но уже нет 95... (ответов: 1)
Вопрос № 4375. Здравствуйте, уважаемые эксперты! Чем отличается 32-разр. процессор от 64-разр и 32-разр. ОС от 64-... (ответов: 5)
Вопрос № 4378. Подскажите пожалуйста как записать в созданный файл по прерыванию 21h (функция BIOS 40h : запись да... (ответов: 3)
Вопрос № 4379. Следующий код выполняется в DOS, но не выполняется в windowsXP терминале ; Проверить наличие PCI BIO... (ответов: 1)
Вопрос № 4381. В продолжение вопроса № 4372. 2Push: А как же например стандартные драйвера у Windows.... (ответов: 3)
Вопрос № 4384. Подскажитепожалуйста где в нэте можно найти хороший, бесплатный учебник по Ассемблеру.Заранее спосиб... (ответов: 3)
Вопрос № 4385. Здравствуйте, господа эксперты. А не подскажет ли мне кто как правильно пользоваться функцией 10Н-го... (ответов: 2)
Вопрос № 4386. Здравствуйте ув. эксперты? Срочно нужна инфа по програмироманию USB(под ДОС и Win) Подойдет все (ссы... (ответов: 2)
Вопрос № 4388. Уважаемые эксперты , подскажите как лудше т.е быстрее сделать следующий момент есть 2 32-битных ... (ответов: 2)
Вопрос № 4389. Здрасьте, эксперты! Вопрос из серии "ну не в VB же писать". Насколько я знаю, существует ... (ответов: 1)
Вопрос № 4390. Меня все больше и больше мучает пара вопросов. Раз. Что именно делает команда lea. Только вот не над... (ответов: 9)

Вопросов: 11, ответов: 32


 Вопрос № 4374

Эксперты!
Когда то давно,пользовался SI 4.05 под виндой 95,
теперь снова понадобилось,но уже нет 95, а стоит ХР,соответственно и поставил вытяжку с DS 2.7, 1 раз
стартанул нормально,вышел снова зашел, завис, перестартовал
комп ,снова висит, и опять и снова.....
Вытяжку брал тут www.kulichki.com/files/debug/debug.htm
Я понимаю что вообше не шел бы, но раз то вышел!
Спасибо



Вопрос отправлен: 26.10.2003, 00:19
Отправитель: Oleg

[Следующий вопрос >>] [Список вопросов]

Отвечает dr_dolphin

Здравствуйте, Oleg!
Поставь соответствующий patch for XP и все будет работать...
Пока


Ответ отправлен: 27.10.2003, 07:39
Отправитель: dr_dolphin


 Вопрос № 4375

Здравствуйте, уважаемые эксперты!
Чем отличается 32-разр. процессор от 64-разр и 32-разр. ОС от 64-разр.



Вопрос отправлен: 26.10.2003, 10:26
Отправитель: sniffer

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Доброе время суток, sniffer!
Добавлены новые регистры (или расширены основные).
Добавлена поддержка памяти...
* EMan: ---===*** Любовь существует! ***===---


Ответ отправлен: 26.10.2003, 10:54
Отправитель: Евгений Иванов


Отвечает never_again

Здравствуйте, sniffer!
Разрядностью шины, конечно, а ты думал чем?
вот 32 разрядный проц одновраменно только 4 байта по шине принимает, а 64 - 8. разницу чуешь?


Ответ отправлен: 26.10.2003, 11:25
Отправитель: never_again


Отвечает Bob Johnson

Здравствуйте, sniffer!
Разрядность процессора определяет, с данными какого объема он может оперировать. 32-разрядный процессор может за одну операцию обрабатывать 32-разрядные числа (т.е. арифметические, логические операции). Чтобы обработать 64-разрядные операнды ему понадобится две (или больше, в зависимости от операции) операции. А 64-разрядному - одна.
ОС - по поддержке процессора. 64-е ос рассчитаны на 64-е процессоры. 32-разрядные - на 32х. Но если 64-х разрядные процессор совместим с 32-разрядным, то на нем можно установить 32-ную ос.

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 26.10.2003, 14:44
Отправитель: Bob Johnson


Отвечает dr_dolphin

Добрый день, sniffer!
Принципиальной разницей архитектур
Различается семантика команд
Различаются режимы работы
Различаются режимы адресации
Различается разрядность регистров
Различается их количество
короче различается ВСЕ !
Если хочешь конкрентее - почитай IA32 manuals и IA64 (Itanium) manuals и сделай вывод сам.
А на счет операционных систем - 64 разрядные должны работать на 64 разрядных процессорах используя их приемущества... Вот так....
Пока



Ответ отправлен: 27.10.2003, 07:43
Отправитель: dr_dolphin


Отвечает _vt

Добрый день, sniffer!
32-разрядный процессор - это процессор, работающий с 32-разрядными числами быстрее, чем с другими... 64-разрядный - с соответствующими числами. Процессоры Intel, начиная с 80386 и заканчивая Pentium 4, являются 32-разрядными, и полностью совместимы с 16-разрядными процессорами 8088-80286, и операционными системами для этих процессоров (MS-DOS, OS/2 и др.). Фирма Intel начала выпускать 64-разрядные процессоры, которые с предыдущими моделями несовместимы, т.е. 32-разрядные операционные системы (Win9x, WinNT4) на них работать не могут, им нужны специальные ОС Win2000 и XP, портированные под 64-разряда. Конкурент Intel, компания AMD, напротив, решила выпускать совместимые с 32-разрядными 64-разрядные процессоры, но пока в этой области неясно, чей вариант будет выгоднее...

*** E-Man - we are waiting for you ***


Ответ отправлен: 27.10.2003, 02:25
Отправитель: _vt


 Вопрос № 4378

Подскажите пожалуйста как записать в
созданный файл по прерыванию 21h
(функция BIOS 40h : запись данных в файл)
символ "перевод строки/возврат коретки"
(аналог в С++ " ")
Пробовал записать в файл строку вида:
DataString DB 0Ah,0Dh
Нечего не вышло
(0Аh и 0Dh - управляющие символы ASCII:
перевод строки и возврат каретки соответственно)
PS: Если можно отошлите ответ на почту
netus@bk.ru
Заранее благодарен!



Вопрос отправлен: 26.10.2003, 16:40
Отправитель: netus

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Приветствую Вас, netus!
Записываешь этот байт по определённому адресу, этот адрес и передаёшь для записи, ну и длина один байт...
* EMan: ---===*** Любовь существует! ***===---


Ответ отправлен: 27.10.2003, 17:46
Отправитель: Евгений Иванов


Отвечает Ayl

Приветствую Вас, netus!
Что значит не вышло? Не записалось или не работает? Если не работает - под чем проверял?

Вообще-то, попробуй записать в обратном порядке: 0Dh, 0Ah. Так точно должно отработать.

Приложение:

Ответ отправлен: 28.10.2003, 16:29
Отправитель: Ayl


Отвечает _vt

Доброе время суток, netus!
Только что попробовал - всё отлично! Может где ещё ошибка?? Приведи текст программы...

*** E-Man - we are waiting for you ***


Ответ отправлен: 27.10.2003, 02:25
Отправитель: _vt


 Вопрос № 4379

Следующий код выполняется в DOS,
но не выполняется в windowsXP терминале
; Проверить наличие PCI BIOS: вызывается функция PCI BIOS
; B101h для прерывания 1Ah
mov AX,0B101h
int 1Ah
jc @@PCIBIOSNotFound
cmp EDX,20494350h
jne @@PCIBIOSNotFound
Выдается ошибка на то, что PCI BIOS не найден.
Подскажите пожалуйста почему, и что нужно сделать
чтобы этот участок кода (и ему подобные) выполнялись
в windows терминале.



Вопрос отправлен: 26.10.2003, 17:32
Отправитель: netus

[Следующий вопрос >>] [Список вопросов]

Отвечает never_again

Приветствую Вас, netus!
А ХР вообще некоторые ДОС прерывания игнорирует, 15Н например не работает.


Ответ отправлен: 26.10.2003, 23:50
Отправитель: never_again


 Вопрос № 4381

В продолжение вопроса № 4372.
2Push:
А как же например стандартные драйвера у Windows. Они ведь не написаны для какой-то одной видеокарточки но ведь переключают разрешение.
2_vt
Не не подходит - это все равно что перед тем как провести вечер с девушкой надеть презерватив и весь вечер его не снимать и не менять.
2Евгений Иванов
А можно поконкретнее что есть режим DPMI?



Вопрос отправлен: 27.10.2003, 07:29
Отправитель: GringoMan2002 (GringoMan2002@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Здравствуйте, GringoMan2002!
Dos Protected Mode Interface - работа в защищённом режиме в ДОС.
* EMan: ---===*** Любовь существует! ***===---


Ответ отправлен: 27.10.2003, 17:47
Отправитель: Евгений Иванов


Отвечает PUSH

Добрый день, GringoMan2002!
Дык они и переключают только стандартные видеорежимы,(как правило небольше 16 цветов)


Ответ отправлен: 28.10.2003, 05:39
Отправитель: PUSH


Отвечает _vt

Приветствую Вас, GringoMan2002!
Интерфейс DPMI тебе не подойдет, т.к. это интерфейс для DOS-приложений...Если тебе, вместо того чтобы пойти на вечер к девушке, охота разбираться с VESA-режимами дисплея, то скачай себе с www.vesa.org стандарт VBE 3.0 - именно с него начинается поддержка биосом переключения режимов и пр. в защищенном режиме. Если ты против использования биоса, или твоя видеокарта не поддерживает VBE 3.0, то можешь изучать регистры своей видеокарты и писать обработчики прерываний для защищенного режима... А стандартные драйвера Windows не поддерживают SVGA-режимы...

*** E-Man - we are waiting for you ***


Ответ отправлен: 28.10.2003, 02:08
Отправитель: _vt


 Вопрос № 4384

Подскажитепожалуйста где в нэте можно найти хороший, бесплатный учебник по Ассемблеру.Заранее спосибо!



Вопрос отправлен: 27.10.2003, 23:56
Отправитель: Jack (jacks@land.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Gibbel

Здравствуйте, Jack!
Здесь же, http://www.kalashnikoff.ru

Ответ отправлен: 28.10.2003, 09:53
Отправитель: Gibbel


Отвечает Евгений Иванов

Доброе время суток, Jack!
http://club.shelek.com/
Бывай!
* EMan: ---===*** Любовь существует! ***===---


Ответ отправлен: 28.10.2003, 04:48
Отправитель: Евгений Иванов


Отвечает never_again

Доброе время суток, Jack!
www.wasm.ru туториалы Iczelion'a

Ответ отправлен: 28.10.2003, 00:47
Отправитель: never_again


 Вопрос № 4385

Здравствуйте, господа эксперты. А не подскажет ли мне кто как правильно пользоваться функцией 10Н-го прерывания 4f4dН.
У Ралбфа Брауна очень мало о ней написано, а в Xview я вообще её не нашёл.



Вопрос отправлен: 28.10.2003, 00:52
Отправитель: Мирослав Махрук

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Здравствуйте, Мирослав Махрук!
--------V-104F4D-----------------------------
INT 10 - VESA - VIDEO CURSOR INTERFACE REQUEST
AX = 4F4Dh
BX = number of bytes available for VCI use
DS:0000h -> buffer for VCI
ES:DI -> VCI driver callback function
Return: AL = 4Fh if supported
AH = status
00h successful
BX = number of bytes used by VCI
ES:DI -> VCI request handler
01h failed
Desc: allow the VESA BIOS Extensions to cooperate with a pointing-device
(typically mouse) driver
SeeAlso: AX=4F12h
Всё это находится вот здесь:
Visit my home page! http://www.pobox.com/~ralf
* EMan: ---===*** Любовь существует! ***===---


Ответ отправлен: 28.10.2003, 04:49
Отправитель: Евгений Иванов


Отвечает _vt

Здравствуйте, Мирослав Махрук!
Эта функция описана в стандарте VBE 2.0 как находящаяся в стадии разработки, в VBE 3.0 про нее упоминаний нет совсем. Подробно по VESA - www.vesa.org - там можно скачать стандарты VBE.

*** E-Man - we are waiting for you ***


Ответ отправлен: 28.10.2003, 02:08
Отправитель: _vt


 Вопрос № 4386

Здравствуйте ув. эксперты?
Срочно нужна инфа по програмироманию USB(под ДОС и Win)
Подойдет все (ссылка,мануал, исходник). В нете искал нет ничего путевого.
Заранее спасибо.



Вопрос отправлен: 28.10.2003, 06:26
Отправитель: m0v8lack

[Следующий вопрос >>] [Список вопросов]

Отвечает dr_dolphin

Доброе время суток, m0v8lack!
Вам на www.usb.org
До встречи


Ответ отправлен: 28.10.2003, 07:20
Отправитель: dr_dolphin


Отвечает netus

Доброе время суток, m0v8lack!
Есть такая книжка тов. Владимира Кулакова
«Программирование на аппаратном уровне. 2-е издание. Специальный справочник.» Издательства ПИТЕР.
Там довольно неплохо (хотя и мало) описано: спецификация USB 1.1, и примеры программирования USB-контроллера и подключенных к нему устройств (естественно на ASMe).
Если что, могу позже выслать исходник своей проги (я тоже с USB мучаюсь), когда чуть отлажу.
PS: Так как ты занялся USB, то может у тебя есть русская спецификация USB? Если есть вышли пожалуйста.
Удачи!


Ответ отправлен: 28.10.2003, 11:40
Отправитель: netus


 Вопрос № 4388

Уважаемые эксперты , подскажите как лудше т.е быстрее сделать следующий момент есть 2 32-битных числа , надо одно поделить на другое , требуется только целая часть деления, причем возможен вариант что оба числа и делитель и делимое размером точно более 16-бит, пример актуален только под Win32, заранее благодарен....



Вопрос отправлен: 28.10.2003, 14:46
Отправитель: greg

[Следующий вопрос >>] [Список вопросов]

Отвечает Dark_Lord

Приветствую Вас, greg!
mem1 dd ?
mem2 dd ?
...
push edx
mov eax,mem1
div mem2
pop edx
;если деление со знаком, то idiv вместо div, в edx помещается остаток, поэтому чтоб его не изменять его можно сохранить в стеке, если-же его можно изменять, то команды сохранения edx можно убрать и получится:
mov eax,mem1
div mem2

Ответ отправлен: 28.10.2003, 17:25
Отправитель: Dark_Lord


Отвечает Евгений Иванов

Здравствуйте, greg!
Умножают сложением.
Делят вычитанием.
Зависит от точности...
Если разделить - это 41 такт.
То вычесть - это 1 такт и ещё по конвейерам хорошо раскидывается!
Так что если десяток вычитаний, то чуть быстрее...
mov eax, 500
mov ebx, 200
sub ecx,ecx
sub eax, ebx
jc m2
sub eax, ebx
inc ecx
jc m2
sub eax, ebx
inc ecx
jc m2
; ... и так далее
m2:
и вот тут в ECX будет целый результат!
Удачи!
* EMan: ---===*** Любовь существует! ***===---


Ответ отправлен: 28.10.2003, 19:20
Отправитель: Евгений Иванов


 Вопрос № 4389

Здрасьте, эксперты!
Вопрос из серии "ну не в VB же писать".
Насколько я знаю, существует какой-то стандартный набор команд для управления UPS через COM-порт. Не завалялось у кого-нибудь док на эту тему? Можно линк. Может, у кого-нить под рукой окажется уже готовая прожка для управления UPS через COM? Если не трудно и она не больше 500Kb, вышлите, pls.
Доки и/или проги слать на portnov at mgn ru.
С уважением, Portnov.



Вопрос отправлен: 29.10.2003, 12:25
Отправитель: Portnov

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Приветствую Вас, Portnov!
UPS это одно, COM - другое...
* EMan: ---===*** Любовь существует! ***===---


Ответ отправлен: 29.10.2003, 16:38
Отправитель: Евгений Иванов


 Вопрос № 4390

Меня все больше и больше мучает пара вопросов. Раз. Что именно делает команда lea. Только вот не надо отписок, что она оставляет эффективный адрес. Это мне ни о чем не скажет.
lea ax,label
почему бы это не заменить на
mov ax,label
Два. Я сильно не помню пример, но там вся соль в том, что до первых 64 Кб в реальном режиме творится следующее:
0012:0000 этот адрес равен 0000:0012. Почему это так. Ведь если посчитать, то надо в первом случае сдвинуть 0012 на 4 бита влево -> 00120 и прибавить смещение, получим 00120. А во втором 0000 сдвинуть влево на 4 бита -> 00000 и прибавить смещение 0012, получим 00012. Не совпадает.
Ну а так интересная рассылка. Удачи всем.



Вопрос отправлен: 29.10.2003, 12:36
Отправитель: Dead Krolik

[Следующий вопрос >>] [Список вопросов]

Отвечает vitya

Добрый день, Dead Krolik!
она заменяется на
mov ax, offset label
то есть загружается смещение label а.

Ответ отправлен: 29.10.2003, 12:45
Отправитель: vitya


Отвечает Portnov

Доброе время суток, Dead Krolik!
1. Натурально, она загружает эффективный адрес. Насколько я помню синтаксис tasm/masm (я пользуюсь nasm), mov ax,label загрузит в ax два байта, находящиеся по адресу label. А lea ax,label загрузит в ax сам адрес метки label. Т.о., lea ax,label эквивалентно mov ax,offset label. В данном случае, разницы практически никакой нет (а tasm, например, при ассемблировании в таких случаях заменяет lea на mov - он считает, что это быстрее, но это было так на 386...). Команда lea дает преимущества, когда в качестве label используется сложный адрес. Именно, в качестве адреса здесь (как и во многих других инструкциях) можно использовать нечто вида
база+множитель*смещение,
где база - это некий непосредственный адрес или регистр (bx,dx,bp,eax,ebx,edx,ebp... кажется, все), множитель - это 0, 1, 2 или 4, смещение - это число или опять же регистр (ax,bx,cx,eax, ebx, ecx, edx... вроде все). Такая адресация удобна прежде всего при работе с массивами. Пусть дан массив, например, такой:
my_array dd 38, 12,34,...
Задачка: чему равно смещение i-го элемента массива? Ответ почти очевиден:
offset my_array+i*4,
где 4 - это размер DWORD'а. Понятно, что если вычислять этот адрес "ручками", то нужно несколько инструкций - умножение, сложение... Но т.к. это чрезвычайно часто встречающаяся задача, Intel предусмотрела косвенную адресацию (т.е. ту, которая была описана выше). Например, пусть наше i уже находится в ecx, а в edx - offset my_array. Тогда
mov eax, [edx+4*ecx]
положит в eax i-й элемент массива. А
lea eax, [edx+4*ecx]
положит в eax адрес i-го элемента.
Кроме работы с массивами, инструкцию lea с косвенной адресацией удобно применять для простеньких вычислений. Например, как посчитать eax*2+ebx и положить результат в eax одной инструкцией? Ответ прост:
lea eax,[eax*2+ebx]
(от перестановки мест слагаемых сумма не меняется :)).
2. Может, так читали, а может, так писали... Явно имелось ввиду 0012:0000 и 0000:0120.
C уважением, Portnov.

Ответ отправлен: 29.10.2003, 17:35
Отправитель: Portnov


Отвечает Ayl

Добрый день, Dead Krolik!

1. Загружает в регистр эффективный адрес :-) Что это такое? В простейшем случае это смещение операнда в соответствующем сегменте:
lea ax, label соответствует mov ax, OFFSET label (а не просто mov ax, label - в строгом асме (например, режим IDEAL в TASM) на такую запись транслятор отругается, в нестрогом - загрузит в регистр AX ЗНАЧЕНИЕ по адресу label.

Но! Все не так просто! Если бы lea делало только это, она не была бы никому не нужна! На самом деле с помощью нее можно вычислять выражения (если выражение соответствует какому-либо режиму адресации), например:

lea ax, [di+bp+100h]
lea eax, [ebx+esi*4-2000h]
и т.п. С помощью OFFSET этого сделать нельзя.
И последнее. lea - это честная команда. Т.е. она выполняется процессором в нужное время. Используя текущие значения регистров. OFFSET - директива компилятора. Она вычисляет смещение в момент трансляции программы. Т.е. в код заносится константа.

Кстати, практически все трансляторы заменяют простую форму lea reg, label на mov reg, OFFSET label.

2. Что-то ты гонишь! Вне зависимости от положения сегмента относительный адрес seg:ofs равен абсолютному адресу seg*16+ofs. Так что вспоминай пример, там явно не в этом дело.

А может ты спутал адресацию в последнем сегменте для 8086/8088 и при закрытой линии A20 в старших процессорах? Там дело в следующем. Адрес последнего сегмента - FFFF (подойдет и любой другой, больший F000). Тогда, если смещение больше 000F, то происходит следующее:
FFFF:0010 = FFFF0+0010 = 100000

Но в первых процах было только 20 адресных линий (A0-A19). А получившийся адрес 21-значный. Поэтому старший бит пропадает и адрес FFFF:0010 = 0000:0000. И так далее, вплоть до FFFF:FFFF = (1)0FFEF = 0000:FFEF.

На процессорах 286+ было уже как минимум 24 адресные линии. Только старшие линии (A20 и дальше) доступны только в защищенном режиме. Но при определенных настройках (записи некоторой последовательности в определенные порты) в реальном режиме можно открыть линию A20. Это на самом деле была ошибка разработчиков Intel'а, но после документирования она превратилась в очень полезную фичу :-)
В результате старший бит адреса не пропадает и появляется возможность в реальном режиме получить доступ почти к 64К памяти свыше 1М. Действия по открытию адресной линии A20 выполняет драйвер himem.sys.


Ответ отправлен: 29.10.2003, 13:39
Отправитель: Ayl


Отвечает _vt

Приветствую Вас, Dead Krolik!
1) lea ax, label можно заменить на mov ax, offset label - это по синтаксису MASM. В некоторых ассемблерах, например, FASM, можно сделать так как ты.

*** E-Man - we are waiting for you ***


Ответ отправлен: 29.10.2003, 17:56
Отправитель: _vt


Отвечает Евгений Иванов

Здравствуйте, Dead Krolik!
Что за хиренею ты несёшь?!
Начнём с LEA.
Эта команда высчитывает адрес (смещение).
Насчёт твоего mov ax,rtttt - хороший программист в этом случае имеет в виду под rtttt постоянную (константу), а не адрес. То есть:
rtttt = 20
mov ax,rtttt
Ассемблер при последующем Ассемблировании получит код:
mov ax,20, но НИ в коем случае не mov ax, [ds:20]
Хороший стиль программирования - ВСЕГДА использовать квадратные скобки, когда ты подразумеваешь адрес.
Вместо команды LEA можно использовать MOV AX, offset LABEL.
Но LEA использует в некоторых случаях на один байт меньше...
Насчёт твоих сегментов и смещений - забудь ты о них!!
Весь мир сидит в защищённом режиме, а реальный - это уже анахронизм...
Но твои рассуждения правильны в некотором диапазоне.
Я могу сказать только то, что в сегмент кратен 16 байт.
И поэтому адрес 0:16 можно представить как и 1:0
Ну и так далее...
Счастливо!
(Наталье из Томска огромный привет!)
* EMan: ---===*** Любовь существует! ***===---


Ответ отправлен: 29.10.2003, 16:52
Отправитель: Евгений Иванов


Отвечает Gibbel

Добрый день, Dead Krolik!
1. Вообще-то lea ax,label эквивалентна mov ax,offset label.
2. А кто тебе сказал, что 0012:0000 равен 0000:0012??? Вообще-то 0012:0000 равен 0010:0020 и 0000:0120, что соответствует физическому адресу 00120.

Ответ отправлен: 29.10.2003, 13:20
Отправитель: Gibbel


Отвечает PUSH

Доброе время суток, Dead Krolik!
Ну процитирую Зубкова!:
"С помощью LEA можновычислить адрес переменной, которая описана сложным методом адресации, например
по базе с индиксированием.//Команду LEA часто используют для быстрых арифметических вычислений например
умножения:
lea bx,[ebx+ebx*4]; bx=ebx*5
или сложения:
lea ebx,[eax+12]; ebx=eax+12
(эти команды меньше, чем соответствующие MOV и ADD ,и неизменяют флаги)"
PS. В TASM-e запись mov ax,lebel и lea ax,lebel различны, после компиляции
mov ax,lebel будет сгенерирован код mov ax,[числоадресlebel]
-в ах будет значение переменной lebel(или знач.по адресу метки lebel)
lea ax,lebel будет сгенерирован код mov ax,число-адрес lebel
в ах будет адрес переменной lebel(если адресное пространство 32 бит,а регистр
приемник 16 бит, то только его младшая часть) %)


Ответ отправлен: 01.11.2003, 05:03
Отправитель: PUSH


Отвечает Dark_Lord

Здравствуйте, Dead Krolik!
1)в почти каждой команде есть возможность записи прямого доступа к ячейке памяти, например:
mov DWORD PTR [????], eax
sub MEM2, eax
inc BYTE PTR [EAX]
add eax,DWORD PTR [EAX+EBX*4+???]
при этом команды берут значение слова по этому адресу, lea же возвращает этот адрес. Тоесть если есть массив двойных слов и смещение массива находится в EBX, номер нужного нам элемента в ecx, то чтоб поместить в eax смещение нужного нам элемента нужно выполнить следующую команду:
lea eax,[ebx+ecx*4]
здесь eax приёмник адреса, ebx смещение начала массива, ecx номер элемента массива, 4 размер элемента массива в байтах. В 16-битных приложениях первым операндом может быть 16-битный регистр! Надеюсь понятно.

Ответ отправлен: 29.10.2003, 15:56
Отправитель: Dark_Lord


Отвечает never_again

Добрый день, Dead Krolik!
1) если тебе фраза "эффективный адрес" ничего не говорит, то тебе ещё учиться и учиться.
>>lea ax,label
>>почему бы это не заменить на
>>mov ax,label
да потому, что lea кладёт в ах тот самый "эффективный адрес"
которого ты так боишься. если хочешь, то смотри на это как на поинтер (указатель) в том же Си.
надеюсь ты понимаешь разницу между
i=*label и i=label ???
так вот в асме
lea ax,label аналог i=*label , а
mov ax,label аналог i=label.



Ответ отправлен: 30.10.2003, 00:09
Отправитель: never_again



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


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


Получить ответов:


 Выбор рассылки

Программисту
Assembler (31)
C / C++ (24)
Perl (3)
Builder / Delphi (22)
Pascal (20)
Basic / VBA (6)
Java / JavaScript (6)
PHP (11)
Криптография (8)
WinAPI (11)
Пользователю
Windows 95/98/Me (45)
Windows NT/2000/XP (59)
"Железо" (36)
Поиск информации (27)
Администратору
Windows NT/2000/XP (35)
Linux / Unix (13)
Юристу
Гражданское право (9)
Семейное право (6)
Трудовое право (6)
КоАП (6)

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




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2003 Россия, Москва. Авторское право: Калашников О.А.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное