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

Assembler - Просто и Эффективно.

  Все выпуски  

Assembler - Просто и Эффективно. Вопросы и Ответы.


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


Assembler

Вопросы и Ответы

Выпуск содержит вопросы читателей рассылки, с подробными ответами. Присылайте свои вопросы и предложения по адресу: asm32@nm.ru .

>Почему число в шестнадцатеричной системе 0A83Ch равно 43068 в десятичной?
>Если это число - 0FFh равно 255, то каким образом получилось из 0A83Ch - 43068?
Для десятичной системы можно записать следующиий пример:
428 = 8*100 + 2*101 + 4*102. Число 10 называется основанием системы.(Для шестнадцатиричной - 16, для двоичной -2)
Если взять абстрактную систему с основанием X, то для перевода числа в эту систему используется следующий алгоритм:
Число делится на Х пока не станет равным нулю , при делении остаток пишется с права на лево.
Пример: X=16; число равно 428 (десятичное).
428/16Остаток 12 (С)
26/16Остаток 10 (А)
1/16Остаток 1
428 в шестнадцатиричном представлении равно 1AC
Этот алгоритм используется для перевода числа в текстовое представление (например, для вывода на экран).

Также верно, что 1AC = C*160 + A*161 + 1*162 т.е 428
1AC=((1*16)+A)*16+C
Или A83C=(((A*16)+8)*16+3)*16+C
- Перевод текстовых строк в числовое значение.

>Вот это тоже не совсем понятно:
>Знаковое 0FFh равно -1. В случае со знаковым байтом, числа от 0 до 7Fh - положительные, от 80h до 0FFh - отрицательные.
Этот пример показывает формат хранения знаковых чисел. Если значение байта равно FFh, то для беззнаковой команды это 255, а для знаковой -1.

Знаковое число или нет определяетcя командой процессора, которая с ним работает.
Пример: сравнение байт:
беззнаковое: 0FFh больше 07Fh (255 больше 127)
знаковое: 0FFh меньше 7Fh (-1 меньше 127)
знаковое: 0FFh больше 80h (-1 больше -128)

Знаковость числа в основном используется командами условного перехода, следующими после команд, устанавливающих флаги (например cmp). После команды, устанавливающей флаги может использоваться знаковая или беззнаковая команда условного перехода.

>Как здесь вычисляется: 0A83Ch+57C4h=10000h
>4 прибавляется к C – получается 0 и единица переносится на следующее число? Дальше, 3 + C = F, а т.к. переносится единица сюда, то получается 0 и единица переносится дальше и т.д.?
Да. Над числами в любой системе, операции производятся одинаково. Можно, например, складывать, вычитать, умоножать и делить привычным способом: в столбик.

>Зачем нужны разные системы исчисления?
В некоторых случаях они очень полезны.
Пример: Значение регистра ax равно 0A3C8h. Сразу видно, что старший байт (регистр ah) равен 0A3h, а младшй байт (регистр al) равен 0С8h. Если указать данное значение в десятичной системе (41928), будет ненаглядно.
Пример 2: значение регистра eax равно десятичному числу 2147483648. Неясно, какие биты регистра установлены, а какие нет. При записи в шестнадцатиричном виде (80000000h) сразу видно, что бит #31 (самый старший бит) равен 1.
Программируя на Assembler'е, часто нужно использовать шестнадцатиричную, десятичную и двоичную системы.

>Зачем определяется модуль числа?
Данный пример помогает понять формат чисел.
Для нахождения модуля в программе используется всего две команды процессора:
NumberIsNegative:
neg Число
js NumberIsNegative

>Зачем существует команда add, если можно написать: mov eax,2+3 или mov eax,[ecx+edx+3]?
Команда mov eax,2+3 после компиляции выглядит как mov eax,5 т.е компилятор вычисляет выражение, и полученное число подставляет в качестве операнда. Команда add используется для сложения неизвестных на этапе компиляции, значений.
Команда mov eax,[ecx+edx+3] помещает в регистр eax двойное слово из оперативной памяти по адресу, указанному в квадратных скобках, а не результат выражения.

>Почему при компиляции команды mov eax,0.5 выдается ошибка: Illegal number?
Процессор может работать только с целыми числами. Запись mov eax,1/2 откомпилируется как mov eax,0 т.к компилятор вычислит выражение и округлит его до целого.
Для вычисления чисел с плавающей точкой можно использовать целочисленную арифметику процессора, составив соответствующие процедуры, но проще использовать сопроцессор (FPU). Начиная с некоторых моделей 486, сопроцессор интегрирован в процессор (до этого он был в виде отдельной микросхемы, которой могло и не быть). FPU имеет свой собственный набор регистров и флагов. Использование FPU будет рассмотренно в этой рассылке позже.

>Почему программы из этой рассылки загружаются в память по адресу 400000h?
В Windows программы обычно загружаются по этому адресу. Вы можете задать линкеру (для TASM - tlink32 - ключ -B) любой другой адрес, кратный 64 кб (младшее слово = 0).
Адрес, по которому загружается модуль называется image base. Его Вы можете посмотреть при помощи программы PE View (находится на сайте рассылки -раздел разработки). Если при загрузке указаный адрес уже занят, то Windows загрузит программу по другому адресу, перестроив все смещения, используя Relocation Table.
Адреса, по которым загружены программы и модули Вы можете посмотреть при помощи программы Windows Explorer (находится на сайте рассылки - раздел разработки).

>Не могли бы Вы выслать мне предыдущие главы?
Предыдущие главы можно загрузить с сайта рассылки в разделе "Архив"
   -------------------------------

 Содержание дальнейших выпусков зависит от вас. Будут разъясняться те темы, которые непонятны большинству читателей. Сайт рассылки: asm32.nm.ru. Присылайте свои вопросы и предложения по адресу: asm32@nm.ru .
   -------------------------------


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


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.asm32
Архив рассылки
Отписаться Вебом Почтой
Вспомнить пароль

В избранное