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

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


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

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

Выпуск № 768
от 13.09.2004, 10:50

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


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

Алексей
Статус: Опытный
Общий рейтинг: 150.87
[Подробней >>]
Александр Чуранов
Статус: Начальный
Общий рейтинг: 125
[Подробней >>]
Василевский Александр
Статус: Начальный
Общий рейтинг: 116.32
[Подробней >>]
 
flasher
Статус: Доверительный
Общий рейтинг: 105.52
[Подробней >>]
Coddie
Статус: Начальный
Общий рейтинг: 104.09
[Подробней >>]
Александр
Статус: Доверительный
Общий рейтинг: 143.63
[Подробней >>]
 
Евгений Иванов
Статус: Профессиональный
Общий рейтинг: 132.63
URL: Super Assembler Software
Телефон: НСС +7 831 3107039
[Подробней >>]
ASMодей
Статус: Профессиональный
Общий рейтинг: 110.99
[Подробней >>]
Dark_Lord
Статус: Профессиональный
Общий рейтинг: 109.25
[Подробней >>]
 
_vt
Статус: Профессиональный
Общий рейтинг: 118.03
[Подробней >>]
Стас
Статус: Опытный
Общий рейтинг: 121.61
[Подробней >>]
SackTap
Статус: Доверительный
Общий рейтинг: 111.42
[Подробней >>]
 
Ayl
Статус: Профессиональный
Общий рейтинг: 116.33
[Подробней >>]


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

Вопрос № 5815. Здравствуйте уважаемые эксперты. У меня есть к вам небольшая просьба, прошу выслать мне уже скомпили... (ответов: 2)
Вопрос № 5816. Здраствуйте ! Я хотел бы начать изучать язык Ассемблер,дайте совет с чего начать,в этом деле я нович... (ответов: 6)
Вопрос № 5817. Помогите!!! Есть 8 байт Тип данных длинное вещественное (64 бита) Как его перевести в понятную для ч... (ответов: 4)
Вопрос № 5818. Привет. Объясните что такое ООП, и структурированое програмиирование? Заранее спасибо.... (ответов: 4)
Вопрос № 5819. Здраствуйте, уважаемые эксперты! Промеппировал файл в память, для поиска строки в файле использовал ... (ответов: 5)
Вопрос № 5820. Привет всем. Может, кто нибудь знает, где можно найти ПОДРОБНУЮ документацию по: 1.Встроенному С-шно... (ответов: 1)
Вопрос № 5822. Здравствуйте Уважаемые Эксперты! Вопрос наверное из курьезных,но все же. Объясните плз. операции тип... (ответов: 7)

Вопросов: 7, ответов: 29


 Вопрос № 5815

Здравствуйте уважаемые эксперты.
У меня есть к вам небольшая просьба, прошу выслать мне уже скомпилированную документацию Ральфа Брауна.
Заранее благодарен



Вопрос отправлен: 07.09.2004, 12:36
Отправитель: Sergey (m_a_u_r_i_n_o@mail.ru)

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

Отвечает Алексей

Доброе время суток, Sergey!
Мне не совсем понятко "скомпилированную"... Насколько мне известно это полное описание всех прерываний. Если я прав - напиши мне письмо на clover@fromru.com и я тебе вышлю (порядка Мегабайта в архиве).

Ответ отправлен: 08.09.2004, 18:06
Отправитель: Алексей


Отвечает Александр Чуранов

Добрый день, Sergey!
http://wasm.ru


Ответ отправлен: 09.09.2004, 19:39
Отправитель: Александр Чуранов


 Вопрос № 5816

Здраствуйте !
Я хотел бы начать изучать язык Ассемблер,дайте совет с чего начать,в этом деле я новичок ,и где можно взять программу Ассемблер?



Вопрос отправлен: 07.09.2004, 15:29
Отправитель: jax

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

Отвечает Алексей

Доброе время суток, jax!
Есть еще удоюная штука... fasm называется. Когда маленько разберешься - советую.

Ответ отправлен: 08.09.2004, 18:03
Отправитель: Алексей


Отвечает Василевский Александр

Здравствуйте, jax!
Книг и статей по Ассемблеру очень много. В частности, могу посоветовать сайты www.wasm.ru и www.ishodniki.ru. На сервере Subscribe.ru можно подписаться на рассылки материалов по Assembler'у.
Я пользуюсь Ассемблером MASM 8 для Windows и скачать его можно по адресу http://www.kofein.com.ua/soft/s/098.html (ссылка работала 07.09.04).
Удачи на этом нелёгком и тернистом пути!

Ответ отправлен: 07.09.2004, 15:50
Отправитель: Василевский Александр


Отвечает flasher

Добрый день, jax!
www.wasm.ru

Ответ отправлен: 07.09.2004, 17:07
Отправитель: flasher


Отвечает Coddie

Добрый день, jax!
Я начинал изучение ассемблера с книжки "Освоение Турбо Ассемблер 4.0" Тома Свана. Но это было давно, во времена ДОС, поэтому Вам бы посоветовал наверное следующую литру:
1. Зубков "Assembler - язык неограниченных возможностей"
На мой взгляд - достаточно полно раскрывает программирование на асме, рассматривается защищенный режим, программирование под Windows, UNIX и DOS.
2. Пирогов "Assembler - учебный курс"
Похуже, чем первая, но тоже неплохо.


Ответ отправлен: 07.09.2004, 17:33
Отправитель: Coddie


Отвечает Александр

Доброе время суток, jax!
Зайди на http://www.wasm.ru - всё есть.
Там же, советую скачать "Туториалы Iczelion'а" - но они под мастдайку ( не качай страницы, есть один КФК-архив ).
Ещё могу выслать "сайт" assembler.ru в .CHM виде ( не сжатый ~== 834`037 bytes. )
Если нада - пиши на yaamail@rambler.ru.
зюыю
http://www.wasm.ru/tools/7/masm32v8.zip - Макро Ассемблер, но весит ~~35MB ( да уж, действительно МАКРО ).
Удачи.
Александр.



Ответ отправлен: 08.09.2004, 08:38
Отправитель: Александр


Отвечает Александр Чуранов

Здравствуйте, jax!
http://wasm.ru
http://flatassembler.net


Ответ отправлен: 09.09.2004, 19:39
Отправитель: Александр Чуранов


 Вопрос № 5817

Помогите!!!
Есть 8 байт
Тип данных длинное вещественное (64 бита)
Как его перевести в понятную для человека запись.
Тоесть какой бит -- знак
какие биты ---мантиса
какие биты ---порядок
например:
BF 84 32 5C 3F 53 79 5B как из этого сделать 0,12345 или что там получиться



Вопрос отправлен: 07.09.2004, 18:00
Отправитель: falcon (flayernik@mail.ru)

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

Отвечает Алексей

Доброе время суток, falcon!
Похожий вопрос здесь уже обсуждался. Можно пользовать сопроцессор - самое простое (см. вопросы 5812 и 5799).
Ну а если серьезно, то: 0-31 бит мантисса,
32-62 смещенный порядок (нормализованное значение), и 63 бит - знак.

Ответ отправлен: 07.09.2004, 18:42
Отправитель: Алексей


Отвечает Александр

Доброе время суток, falcon!
ОпИсываю: 63 bit := sign; 62 - 53 := ( - не минус ~~%-E!!! ) exponet + 7fH; 52 - 0 := sign;
Далее: т.е. 0BF84325C3F53795Bh == 1_0111111100_001000011001001011100111111010100110111100101011011b ( ;-9) ) (~= -_508_0.25... ):-E`` ) ==> 0.25e-508. ( примерно, точно - лень считать. )
Желаю ЭТО переварить успешно.
Александр.

Ответ отправлен: 08.09.2004, 08:38
Отправитель: Александр


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

Доброе время суток, falcon!
смотри ответ на вопрос 5799.

* EMan: -=- И легко перо, да на крышу не закинешь. =-=


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


Отвечает Александр Чуранов

Добрый день, falcon!
Если это "длинное вещественное" для сопроцессора (пардон, FPU) процессоров Intel x86 - то бит 63 - знак мантиссы, биты 62-65 - 11-битная экспонента +1024, биты 51-0 - 52-битная мантисса без первой цифры.


Ответ отправлен: 09.09.2004, 19:39
Отправитель: Александр Чуранов


 Вопрос № 5818

Привет. Объясните что такое ООП, и структурированое програмиирование? Заранее спасибо.



Вопрос отправлен: 07.09.2004, 19:01
Отправитель: bach

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

Отвечает Василевский Александр

Добрый день, bach!
Если коротко, то ООП (объектно-Ориентированное Программирование) является более мощным потомком структурированного.
Примечания.
1. Прошу прощения за орфографические ошибки.
2. Прошу прощения за неточности, я хотел передать суть.
3. Термины Процедура и Функция в данном тексте практически эквивалентны. Аналогично и термины Объект и Класс.
4. Определения я придумал сам:).
Итак начнём с самого начала.
Первые программы писались на машинном коде. Это выглыдело следующим образом (в 16 системы исчисления):
0F 56 AB D3 ...
Сами видите, что ничего хорошего из этого не выходит. Нужно иметь очень хорошие знания по машине. Очень лекго ошибиться.
С ростом программ появилась необходимость уменьшить вероятность появления ошибок. Так возникли такие языки как Assembler. программа теперь выглядела следующим образом:
MOV AX, 10
ADD BX, AX
...
Каждая команда отображалась в соответствуюший маш инный код.
С усложнением программ были изобретены такие языки как FORTRAN (его упрощённый вариант - BASIC), Кобол и др:
10 LET A=0
20 IF A<>0 THEN GOTO 300
...
Естественным недостатком этих языков является область видимости переменных. Любая строка программы может обратиться к любой переменной. Кроме того, с программами большого возникает интересная проблема - не хватает переменных. На данном этапе была разработана большая часть алгоритмов решения различных задач (сортировка, поиск ...). Например, к данному этапу относятся алгоритмы сортировки: пузырьковая, быстрая, вставками и многие другие.
Возникла идея структурированного программирования. Основная идея заключается в создании независимых блоков, каждый из которых имеет свои переменные, управляет ими и скрывает их от других блоков. Это значит, что процедура принимает данные и в зависимости от этих данных применяет к ним определённые алгоритмы. Первым языком такого типа был Алгол. Его упрощённый ва риант - Паскаль. Затем появился Си. Основной особенностью этого этапа было то, что программа управляла данными.
Program HelloWorld;
Procedure Hello;
Var s: String;
Begin
s := 'Hello World';
WriteLn( s );
End;
Begin
Hello;
End.
В приведённом выше примере процедура Hello определяет переменную S, использует её и скрывает переменную от других процедур. Отличительной особенностью структурных языков от Fortran и других являются отступы, указывающие уровень вложенности процедуры.
Программы стали расти невероятно быстро. Появилась необходимость скрывать определённые процедуры и переменные. Так появилось модульное программирование. Характерный язык этого времени - Модула. В языке Паскаль эта проблема решается за счёт модулей (UNIT). В языке Си за счёт раздельного компилирования файлов. В качестве примера - программа HelloWorld на Паскале.
{ Модуль HelloWorld }
Unit HelloWorld;
Interface
Procedure He llo;
Implementation
Procedure Hello;
Var s: String;
Begin
s := 'Hello World';
WriteLn( s );
End;
End.
{ Собственно программа }
Program HW;
Uses HelloWorld;
Begin
Hello;
End.
Данный пример состоит из двух файлов (модулей). Один из них (UNIT HelloWorld) объявляет и определяет процедуру Hello. Второй модуль (PROGRAM HW) использует процедуру Hello из модуля HelloWorld.
К этому этапу относятся такие понятия как интерфейс и реализация. Интерфейс модуля (INTERFACE) - это объявление глобальных (доступных всем другим модулям) процедур, функций и данных. Реализация модуля - это определение описанных в интерфейсе процедур, функций и данных, а также, если необходимо, определение локальных процедур и данных. Кроме этого, локальные процедуры и функции недоступны другим модулям программы.
В конце этого этапа возникла неожиданная проблема. С увеличением программы до некоторого предела (порядка 15-20 т ыс. строк) программой становилось сложно управлять. Область видимости была завалена глобальными процедурами и функциями различных модулей.
Для решения этой проблемы было разработано Объектно-Ориентированное программирование. Первым языком был Симула. Более известными являются диалект Паскаля Object Pascal, язык C++, и, гораздо позже, Java и C#. Основной особенностью является то, что данные управляют программой. Т.е. подразумевается, что данные сами знают, что с ними можно делать. ООП покоится на трёх китах:
- Инкапсуляция. Под этим термином понимается сокрытие данных в специальных языковых конструкциях: объектах и классах. Объекты и классы определяют внутренние данных и функции, которые работают с этими данными. Программа работает с объектом ТОЛЬКО через функции объекта. Примером является объекта ФАЙЛ. Объект ФАЙЛ может содержать имя файла, его размер, положение на диске и другие системно-зависимые данные. Чтобы программа не могла нарушить работу операционной системы , эти данные сокрыты в объекте. Объект определяет такие функции как ОТКРЫТЬ, ЗАКРЫТЬ, УДАЛИТЬ и т.д. Программа использует эти функции для, собственно, открытия, закрытия и удаления файла. Изменить имя файла, его размер, аттрибуты и т.д. программа может только через соответствующие фнукции.
- Наследование. Наследование предполагает наличие двух типов объектов - объект-родитель (РОДИТЕЛЬ) и объект-потомок (ПОТОМОК). Как и с человеком, ПОТОМОК наследует все свойства РОДИТЕЛЯ, кроме того, он добавляет свои свойства. Вернёмся к примеру с файлом. Пусть ФАЙЛ является РОДИТЕЛЕМ. Тогда мы можем представить себе в качестве ПОТОМКА объект АРХИВ. АРХИВ обладает всеми свойствами ФАЙЛА (ОТКРЫТЬ, ЗАКРЫТЬ, УДАЛИТЬ и т.д). Кроме того, он определяет свои данные (метод сжатия, прцент сжатия и т.д) и функции (УПАКОВАТЬ_ДАННЫЕ, РАСПАКОВАТЬ_ДАННЫЕ).
- Полиморфизм. Это самая сложная, но в тоже время, самая мощная часть ООП. Суть этой концепции заключается в следующем. ПОТОМОК может заменить своими некоторые функции РОДИТЕЛЯ. Так, чтение данных из АРХИВА. Его РОДИТЕЛЬ - ФАЙЛ, позволяет читать данные из файла на диске. Он вызывает соответствующие функции Операционной системы и читает данные с диска. В то же время АРХИВ также позволяет читать данные. Но при работе с АРХИВОМ нам интересны исходные (не сжатые данные). Для этого, АРХИВ переопределяет соответствующую функцию ФАЙЛА. Он читает упакованные данные, распаковывает их и возвращает программе. Программа может даже не заметить, что работает не с обычнм файлом, а с архивом.
Надеюсь, что из всего жтого повествования Вам стало понятно об отличительных особенностях структурного программирования и ООП. Более подробно об этом можно прочесть в соответствующих книгах, которых в Internet больше чем предостаточно.
Позвольте посоветовать Вам. Если Вы только начали изучать программирование, начинайте изучение с ООП. Несмотря на всю сложность ООП, изучить его с самого начала легче, чем перейти к нему от структурно го программирования. Знаю по своему опыту.


Ответ отправлен: 08.09.2004, 09:48
Отправитель: Василевский Александр


Отвечает Александр

Приветствую Вас, bach!
_Структурное_ ( структурированное ) программирование - это запись программы неоднимсплошнымкуском :-), а с отступами, пробелами, выделением циклов, усливй etc.
ООП - Объектно Ориентированное Программирование, т.е. создание программы, которая оперирует некими объектами, а не функциями и процедурами.

Ответ отправлен: 08.09.2004, 08:37
Отправитель: Александр


Отвечает Алексей

Приветствую Вас, bach!
Объектно Ориентированное Программирование и структурированное программирование - это почти одно и то же. Больше относится не к ассемблеру, а к языкам высокого уровня. Суть в идеологии написания программы: имеется "движок", который написан либо кем-то, либо тобой. И ты этому движку подсовываешь набор объектовструктур, которые и организовывают работу твоей программы. Это если в кратце. Вообще это некий отдельный подход к принципам программирования, где все организовано в виде структур, или объектов.
Вообщем можно сравнить старую программу на бейсике и Delphi, и сразу все станет понятно.

Ответ отправлен: 08.09.2004, 12:53
Отправитель: Алексей


Отвечает Александр Чуранов

Здравствуйте, bach!

ООП (объектно-ориентированное программирование) - концепция, полагающая, что программы необходимо представлять в виде объектов. Все объекты имеют свойства и методы. К некоторым свойствам и методам можно обращаться только из методов объекта, такие называются private (англ. "частный"). Остальные называются public (англ. "общедоступный") Пример: объект "ящик". Свойства: длина, ширина, высота. Методы: открыть, закрыть.

ООП основывается на следующих 3-х принципах:

  • Инкапсуляция (англ. Encapsulation) - означает, что группа свойств (это, по сути, переменные) и методов (а это функции) рассматривается как одно целое. Как правило, свойства изменяются при помощи методов. Это делается для того, чтобы проверять допустимость задания свойств и скрывать детали реализации. Скрытие деталей (англ. data hiding) даёт возможность изменять реализацию объекта, оставляя неизменны м интерфейс. То есть, если Вы написали объект "окно программы", который хранит размеры, цвет, шрифт и др. свойства окна каким-то определённым образом, то впоследствии можно изменить этот способ хранения данных, а объект останется работать и все программы, его использующие также будут работать и с изменённым объектом.
  • Наследование (англ. Inheritance) - позволяет при описании объекта указать его "предка". Таким образом можно не писать объект "с нуля", а просто указать, например, что новый объект "цветной ящик" происходит об объекта "ящик", при этом имея дополнительное свойство "цвет".
  • Полиморфизм (англ. Polymorphism) - означает возможность использовать классы взаимозаменяемым образом, несмотря на то, что их методы могут раелизовываться совершенно по-разному.
Далее можно упомянуть о перегрузке, замене и затенении.
  • Перегрузка (англ. Overloading) - возможность оп исать несколько методов с одинаковым именем, которые принимают параметры разных типов или разное их количество. Пример: можно определить сложение для целых и вещественных чисел. Перегрузка добавляет члены класса.
  • Замена (англ. Overriding) - возможность заменить метод или свойство, унаследованные от предка на что-нибудь более подходящее в потомке. Или вообще исключить свойство. Пример: класс "кит" происходит от класса "млекопитающие". Но у них нет ни рук ни ног. Зато есть плавники. Замена изменяет либо удаляет члены класса.
  • Затенение (англ. Shadowing) - это локальная замена (для конкретного экземпляра), которая не наследуется.
Плюсы ООП:
  1. Возрастает повторное использование кода.
  2. Структурированную програму легко понимать.
  3. ООП-программы намного легче модифицировать. Собственно, для этого ООП и придумывалось.
Минусы ООП:
  1. В погоне за чёткой структуризацией программы задачи зачастую решаются не эффективными методами.
  2. Необльшие программы сложнее писать с использованием ООП.
  3. Использование ООП программистом целесообразно только если программист (а точнее размеры его проектов) "дорос" до этой необходимости. Исторически сначала было процедурное программирование, затем модульное, затем с абстракцией данных и потом ООП. Лично я сейчас пишу на "модульном" уровне.
И вообще, это всё пустопорожние разговоры. Никакой из известных мне ассемблеров ООП не поддерживает.




Ответ отправлен: 09.09.2004, 19:40
Отправитель: Александр Чуранов


 Вопрос № 5819

Здраствуйте, уважаемые эксперты! Промеппировал файл в память, для поиска строки в файле использовал строковые команды, но потом подумал, а что если MapViewOfFile вернёт указатель на память близкий к 4 Гб и тогда при увеличении edi может обнулиться (первоначально edi=pMemory) и куда тогда будет обращение к памяти? Пришлось использовать обращение к памяти по базе (ebx=pMemory, edi=0, обращаюсь [ebx+edi]), но тогда нельзя использовать строковые команды (или как-то подогнать ds под pMemory, чтобы обращаться по ds:edi?). Ведь теоретически размер файла м.б. очень большой и указатель на память + размер файла могут не "влезть" в edi! Возможна ли такая ситуация в GlobalLock, когда указатель на память + размер запрошенной памяти превышают 4 Гб? Можно ли к памяти адресоваться по одному регистру или надо использовать базу?



Вопрос отправлен: 07.09.2004, 19:23
Отправитель: Alex

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

Отвечает ASMодей

Доброе время суток, Alex!
Размер доступного адресного пространства для процесса в Win32 равен 2 Гб (а не 4 Гб), так
что никто тебе не даст ничего переполнить. Тем более что в конце 4Гб находится ядро самой ОС. Если ты попытаешься выделить памяти
больше чем есть в наличии, функция MapViewOfFile просто завершится с ошибкой.


Ответ отправлен: 08.09.2004, 17:00
Отправитель: ASMодей


Отвечает Dark_Lord

Приветствую Вас, Alex!
Все гораздо проще, просто система не раззрешить тебе промаппировать файлы больших размеров.

Ответ отправлен: 07.09.2004, 20:34
Отправитель: Dark_Lord


Отвечает Василевский Александр

Доброе время суток, Alex!
Позвольте немного напомнить Вам о структуре памяти в Windows.
Вся память программы разделяется на два блока по 2 Гб каждый. Нижний блок используется программой. Верхний блок используется Windows.
При проецировании Вы указываете размер блока в файле, который Вы хотели бы отобразить. Операционная система ищет свободное пространство и отображает файла на это пространство. При недостатке пространства, система возвратил NULL.
А теперь к Вашему вопросу.
Если Вы отображаете часть файла, Вы указываете размер этой части (пусть это будет iSize). Система возвращает Вам указатель (pMapFile). Вы моэете быть уверены, что начиная с адреса pMapFile и до адреса pMapFile+iSize-1 находится Ваш файл.
Если Вы отображаете весь файл, то желателно иметь знать размер. Это делает функция GetFileSize. И опять-таки. Если размер файла равен iSize, а система возвратила указатель pMapFile, то начиная с адреса pMapFile и до адреса pMapFile+ iSize-1 находится Ваш файл.
Если Вы будете аккуратны при использовании строковых команд (загрузите в ECX размер iSize и будете использовать необходимый префикс REP/REPNE и др), то у Вас регистр EDI не обнулится никогда. Кроме этого, система внимательно следит за Вами. При попытке обратиться к недопустимому адресу, она выкинет ошибку и Ваша программа рухнет.
Удачи.

Ответ отправлен: 08.09.2004, 10:01
Отправитель: Василевский Александр


Отвечает Алексей

Здравствуйте, Alex!
Однозначно, превзойти границу в 4Гб в смещении нельзя, архитектура процессора не позволит. Т.е. однозначно нужно использовать базу.

Ответ отправлен: 08.09.2004, 12:57
Отправитель: Алексей


Отвечает Александр Чуранов

Здравствуйте, Alex!
Здесь вопрос совсем не в 4-х гигабайтах. Во-первых, "промеппировал" - это называется "отображение": "Отобразил файл на память.". Во-вторых отображается всегда конкретное количество данных. То есть в любом случае необходимо следить за тем, чтобы указатели находились в пределах обрабатываемого участка памяти. При использовании приставок Rep, Repe, Repne и т.п. Есх содержит максимальное количество повторов команды. То есть если загружено 0х1000 байт по адресу 0х5000 и необходимо найти байт 'ы', начиная с адреса 0х5500, то необходимо занести в Есх 0х500, в Аl - 'ы', в Edi - 0x5500, и выполнить Repne Scasb. Если после этого Есх равен 0, то нифига не найдено. А если от нуля до 0х500, то Edi содержит адрес байта со значением 'ы'. А вот если Есх содержит значение от 0х500 и выше, то что-то неправильно :)


Ответ отправлен: 09.09.2004, 19:40
Отправитель: Александр Чуранов


 Вопрос № 5820

Привет всем.
Может, кто нибудь знает, где можно найти ПОДРОБНУЮ
документацию по:
1.Встроенному С-шному ассемблеру (компилятор
gcc, OS - Linux).
1.AT&T-шному ассемблеру "as".???



Вопрос отправлен: 07.09.2004, 19:32
Отправитель: yorik (3-1415@rambler.ru)

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

Отвечает _vt

Доброе время суток, yorik!
Ну раз под линукс, то:
1) man gcc
2) man gas
;-)
* Origin : Life begins at 1000Mhz!


Ответ отправлен: 09.09.2004, 20:00
Отправитель: _vt


 Вопрос № 5822

Здравствуйте Уважаемые Эксперты!
Вопрос наверное из курьезных,но все же.
Объясните плз. операции типа битовый сдвиг вл.впр.,
XOR AND OR.В смысле где они применяются на практике.
XOR маска ,проверка результата ,а остальные где и как
зачем нужны?
Зарание благодарен!



Вопрос отправлен: 09.09.2004, 10:41
Отправитель: vlad

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

Отвечает Василевский Александр

Доброе время суток, vlad!

Операци NOT.
Это однооперадная операция логического отрицания. Обозначается линией сверху или символом '!'.
A !A
0 1
1 0
Эта операция инвертирует все биты числа. Часто используется вместе с командой AND для сброса бита. (см AND).

Операция OR.
Операция логического ИЛИ. Иногда обозначается символом '+'.
A B A+B
0 0 0
0 1 1
1 0 1
1 1 1
Данная операция установит бит в 0 только тогда, когда оба операнда равны 0. Иначе она установит 1.
Используется данная операция для установки определённых битов в маске. Остальные биты не изменяются. Для этого в маске те биты, какие необходимо установить, устанавливаются в 1, остальные - в 0.Следующий код установит 5-ый бит и 7-ой биты в регистре AL:
MOV AL, 00100010b ; какое-то число
OR AL, 10100000b ; маска битов
; 10100010b ; результат

Операция AND.
Операция логического И. Обозначается символом '*'.
A B A*B
0 0 0
0 1 0
1 0 0
1 1 1
Данная операция вернёт 1 только в том случае, когда оба операнда равны 1. Иначе, она вернёт 0.
Используется данная операция совместно с операцией NOT для обнуления определённых битов. Остальные биты не изменятся. Для этого в маске те биты, которые необходимо обнулить, устанавливаются в 1, остальные - в 0. Замет маска инвертируется операцией NOT (эта операция может выполняться вручную). Следующая команда обнулит 5-ый и 7-ой биты в регистре AL (сравни с операцией OR):
MOV AL, 10001001b ; какое-то число
MOV AH, 10100000b ; загружаем маску
NOT AH
; AH = 01011111b
AND AL, AH ; обнуляем биты
; 00001001b ; результат

Операция XOR.
Эта операция исключающего ИЛИ.
A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0
Эта операция вернёт 1 только в том случае, когда ТОЛЬКО один операнд равен 1.
Операция используется для инвертирования определённых битов. Для этого в маске те биты, которые необходимо инвертировать, устаналиваются в 1, остальные - в 0. Следующая команда инвертирует 5-ый и 7-ой биты в регистре AL:
MOV AL, 10011101b ; какое-то число
XOR AL, 10100000b ; загружаем маску
; 00100000b ; результат
Кроме того, операция XOR используется для обнуления регистра:
XOR EAX, EAX ; EAX = 0 всегда

Операция SHL арифметического сдвига влево
Посмотрите на "рисунок"
000000111010010001000 ; исходное число
000001110100100010000 ; произошёл один сдвиг влево
000011101001000100000 ; произошёл ещё один сдвиг влево
...
111010010001000000000 ; всего произошло 6 сдвигов
110100100010000000000 ; произошло 7 сдвигов, теряется старший бит
Таким образом, с двиг влево приводит к последовательному сдвигу всех битов числа на один разряд влево. Последний бит обнуляется. Обратите внимание на последнюю строчку. Выдвинутый бит теряется. Если число имеет 32 разряда, то после 32 сдвигов оно обнулится.

Операция ROL циклического сдвига влево
000000111010010001000 ; исходное число
000001110100100010000 ; произошёл один сдвиг влево
000011101001000100000 ; произошёл ещё один сдвиг влево
...
111010010001000000000 ; всего произошло 6 сдвигов
110100100010000000001 ; произошло 7 сдвигов, теряется старший бит
Эта операция аналогична SHL, только выдвинутый старший бит становится на место младшего бита. Если число имеет 32 разряда, то после 32 сдвигов число станет равно исходному.

Операция SHR арифметического сдвига вправо
000000111010010001000 ; исходное число
000000011101001000100 ; произошёл один сдвиг
000000001110100100010 ; произошло два сдвига
000000000111010010001 ; произошло три сдвига
000000000011101001000 ; произошло четыре сдвига
Как видно из рисунка, сдвиг вправо приводит к последовательному сдвигу всех битов числа на один разряд вправо. Первый бит обнуляется. В последне строчке видно, что самый младший бит числа теряется. Если число имеет 32 разряда, то после 32 сдвигов оно обнулится.

Операция ROR циклического сдвига вправо
000000111010010001000 ; исходное число
000000011101001000100 ; произошёл один сдвиг
000000001110100100010 ; произошло два сдвига
000000000111010010001 ; произошло три сдвига
100000000011101001000 ; произошло четыре сдвига
Данная операция аналогична операции SHR за одним исключением. Млаший бит занимает не теряется, а занимает позицию старшего бита числа. Если число имеет 32 разряда, то после 32 сдвигов оно станет равно исходному числу.

Напоследок
В Ассемблере есть и другие похожие оп ерации. Так, сдвиги положительных чисел могут отличаються от сдвигов отрицательных чисел. Но начинать разбираться с этими нюансами нужно только после усвоения вышеперечисленных операций.


Ответ отправлен: 09.09.2004, 12:38
Отправитель: Василевский Александр


Отвечает Стас

Приветствую Вас, vlad!
OR, XOR, AND часто используюся при работе с портами (In/Out). Например при программировании прерываний, сом портов, таймера. Часто какой то порт работает как триггер. Т.е. нужно установить, например 3 бит чтобы разрешить прерывания.
ORом ты его ставишь наверняка, ANDом снимаешь также наверняка, а XORом меняешь на обратный.
Кроме того AND например часто используют в процедурах перевода числа в ASCII последовательность(для выделения старшего/младшего полубайта).
Сдвиги часто заменяют умножение и деление.
Ну и естествено при шифровке, перекодировке.
Вообщем трудно себе представить все возможные приложения этих комманд.

Ответ отправлен: 09.09.2004, 12:21
Отправитель: Стас


Отвечает Dark_Lord

Добрый день, vlad!
Нужны они ВЕЗДЕ. Можно найти почти бесконечное количество возможностей применения этих директив. Приведу элементарный пример использования каждого:
AND, в определённом двойном славе младшие десять бить представляют нужную нам информацию, and eax,3FFh оставит лишь младшие 10 бит в еах.
OR, нам надо установить биты 5 и 17, при этом не изменяя значения остальных битов, or eax,20020h произведёт нужную нам операцию!

Ответ отправлен: 09.09.2004, 21:16
Отправитель: Dark_Lord


Отвечает Алексей

Добрый день, vlad!
Достойный вопрос на самом деле.
Итак операции битового сдвига (shl и shr) применяются чаще всего при целочисленном умножении и делении на степень двойки (т.е. на 2, 4, 8, 16, 32... остаток отбрасывается). Например такой код:
mov ax, 1234
mov bx, 8
div bx
можно записать как:
mov ax, 1234
shl ax, 3
Короче, и выполняется намного быстрее. Аналагично с умножением.
Можно также возвести 2 в любую степень:
mov al, 1
shl al, 3 ; возводим в степень 3 получаем 8
Есть еще функции циклического сдвига rol и ror. Они чаще всего используются, например, для перестановки старшей и младжей частей регистров eax, ebx... так как напрямую к старшей части этих регистров мы обратиться не можем, только младшая нам доступна (ax, bx...). Делается эти так:
rol eax, 16 ; в данном случае можно и ror eax, 16
Работа с битовыми "масками" - функции and, or, xor. Объясню каждую:
and дает возможность проверить в исходной последовательности битов конкретный(-е) нужный(-е) нам бит(-ы). Делается так:
mov al, 01010011b ; исходная последовательность
mov bl, 00000111b ; нужно проверить 3 младших бита
and al, bl ; проверяем (результат в al)
; итак, в al сейчас содержится 00000011b
and также позволяет сбросить нужный(-е) нам бит(-ы):
mov al, 01010011b ; исходная последовательность
mov bl, 11111000b ; нужно сбросить 3 младших бита
or al, bl ; устанавливаем (результат в al)
; итак, в al сейчас содержится 01010000b
or позволяет установить нужный(-е) нам бит(-ы):
mov al, 01010011b ; исходная последовательность
mov bl, 00000111b ; нужно установить 3 младших бита
or al, bl ; устанавливаем (результат в al)
; итак, в al сейчас содержится 01010111b
xor позволяет инвертировать нужный(-е) нам бит(-ы):
mov al, 01010011b ; исходная последовательность
mov bl, 00000111b ; нужно инвертировать 3 младших бита
or al, bl ; инв ертируем (результат в al)
; итак, в al сейчас содержится 01010100b
Где применяется это... в одной переменной типа byte хранить 8 булевых переменных.


Ответ отправлен: 09.09.2004, 11:38
Отправитель: Алексей


Отвечает SackTap

Добрый день, vlad!
AND - логическое "И"
OR - -//- "ИЛИ"
XOR - исключающее "ИЛИ"
чтобы понимать, для чего это надо, надо знать и понимать двоичную систему счисления.
вот двоичное число - 10010100, битовый сдвиг сдвигает влево и вправо каждую "циферку", т.е. получится 00101000 или 01001010. а чтобы понять про смысл логических операций, нужно в инете поискать слова "операция логическое или", а лучше всего скачать учебник Юрова по ассемблеру.
Удачи!

Ответ отправлен: 11.09.2004, 10:48
Отправитель: SackTap


Отвечает Александр

Здравствуйте, vlad!
Сдвиги - ( я использую ) для умножения на число кратное двум, для копирования ( при вынесении в CF - флаг переноса ), для выделения ниблов ( полубайтов ).
OR - для установки заданных битов в 1: OR 110_0_b, 000_1_b = 110_1_b.
AND - для проверки установленности бит(а/ов): AND _1_100b, _1_000b = { !0 - установлен, 0 - нет }.
Александр.

Ответ отправлен: 11.09.2004, 09:19
Отправитель: Александр


Отвечает Ayl

Доброе время суток, vlad!
Ну, это очень полезные команды! Например, при помощи сдвигов можно выполнять умножение и деление на числа, равные степени 2, например:
eax * 2 = shl eax, 1
eax * 64 = shl eax, 6
eax / 2 = shr eax, 1
eax / 64 = shr eax, 6
XOR, AND, OR
Применение этих команд неограничено :-)
Например, при помощи XOR можно обнулить регистр: xor eax, eax
При помощи AND и OR - проверить регистр на равенство 0:
and eax, eax ; or eax, eax
jz ZERO
Кроме этого, команда AND используется для сброса нужных битов по маске, а команда OR - для их установки. С помощью XOR нужные биты можно инвертировать.

Ответ отправлен: 09.09.2004, 17:20
Отправитель: Ayl



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

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

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

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

Программисту
Assembler (25)
C / C++ (16)
Perl (6)
Builder / Delphi (12)
Pascal (20)
Basic / VBA (5)
Java / JavaScript (5)
PHP (14)
Криптография (7)
WinAPI (12)
Радиоэлектроника (11)
Пользователю
Windows 95/98/Me (45)
Windows NT/2000/XP (63)
"Железо" (40)
Поиск информации (19)
Администратору
Windows NT/2000/XP (38)
Linux / Unix (15)
Юристу
Гражданское право (10)
Семейное право (7)
Трудовое право (9)
КоАП (7)

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




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


Яндекс цитирования
© 2001-2004 Россия, Москва. Идея, дизайн, программирование: Калашников О.А. ICQ: 68951340
При перепечатке материалов ссылка на данный сайт обязательна!

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Отписаться

В избранное