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

Низкоуровневое программирование для дZeнствующих #21


Служба Рассылок Subscribe.Ru проекта Citycat.Ru
c а й т   и з о б р е т а т е  л е й   ф о н а р и к о в   н а    с о л н е ч н ы х   б а т а р е й к а х
  - Хорошо, что коровы не летают!
  - Колонка вредактора (по мотивам Diablo-2)
  - Печать десятичных циферек:
    [1], [2], [3], [4]
  - Hello, world! или Изврат-2
    [1], [2], [3]
  - Примечание by DZ^3 Хемуль Советикус (для особо продвинутых)
  - Регистр флагов
  - Обзор дZенских (и прочих) сайтов by Khabl
  - Анонс
  Сим ставлю вас в извесность, что в природе существует хороший сайт www.proglib.com, который может оказать неоценимую помощь дZенствующему программисту.
  На этом сайте собрана довольно неплохая коллекция доков/сырцов по различным технологиям программирования, есть система экспертной помощи и пачка форумов различной тематики.
  Совсем недавно нехорошие силы зла похерили этот ресурс, так что всю огромную (сам видел!) коллекцию чтива и сырцов автору приходится перезаливать по-новой... :(
  Однако мы более чем уверены в том, что в скором времени этот ресурс, как дZенская :) птица Феникс (мужского пола), восстанет из пепла, раскроет замлевшие крылья и полетит рядом с нашей Бабочкой (женского пола)...
  Но это будет ЗАВТРА, а сегодня и прямо сейчас вы можете (мы настоятельно рекомендуем вам ЭТО) подписаться на рассылку "Уроки для начинающих программистов", которую "издает" автор этого братского нам дZенского сайта.

  Так что вдвоем, наверное, летать будем :).

  ЗЫ: См. заголовок. (С) Горький
  ЗЗЫ: Ой!
  Короче, с проектом нашим дела так обстоят: был червяк жирный и некрасивый, так мы его хрясь ногой, только жижа ядовито-кислотная из-под сапога потекла :(
  Органы какие целы остались - собрали в кучку, пивцом залили и чайком присыпали. Можно было б еще и конопелькой индийской припорошить, да только ну ее нафиг, пусть мериканцы ожиревшие это дурью травятся...
  А мы по-простому :)) по русски :)) В смысле залпом и без закуски ;)

  Червяк сдох, а вот бабочка из кокона еще не вылупилась :). Мееедленный это процесс, нервный...

  Понемногу начинает функционировать кровеносная система. Темное минское пиво уже циркулирует по артериям и венам, насыщая организм чудодейственной праной. Деляться клетки, дифференцируясь в соответствующие органы и ткани... Монстр неторопливо, но неумолимо СОЗРЕВАЕТ, еще в зародыше оттачивая свои желтые когти.

  Хрясь!! Фиговина какая-то нездоровая кокон в одном месте прорвала, сматериализовалась в виде извесного фаллического символа, рявкнула гробовым голосом Мэрлин-Мэнсона "reeаd the f*cking maaanual". А потом вдруг "крылом" ядовито-зеленым стала, с прожилками динамического HTML...
  Ужаснись, народ!! Мы архив рассылки перегребли и на сервер залили! Теперь ему по адресу http://hi-tech.nsys.by/rtfm/ отныне, присно и во веки веков быть... С пофиксенной by LeXa грамматикой и правильными гиперссылками :)).

  ХРЯСЬ! Еще один член (у насекомых это ваще-то "члениками" называется, но если это большой "членик", то, наверное, его все же правильнее "членом" обозвать по правильным рулесам великого могучего русского языка)... Так вот: еще один член напрягся и прорвал кокон, расбрызгивая вокруг галимыми битами, байтами и килобайтами...
  Это мы 63 метра в подраздел "Среды разработки" залили. Пока что там только асмовские компиляторы, оболочки, интегрированные среды, но другие языки мы тож когда-нить обязательно замахнемся. Даешь многоязычную бабочку!
  На закачку можно поставить с адреса http://hi-tech.nsys.by/download/compilers/ Да пребудут с вами боды :)
  Короче, химера страшная будет. Аж у самого коленки трясуться с соответствующей тактовой частотой...

  Ну и еще один орган почти без изменений (если с червяком сравнить) выклюнулся (это уж точно не член, а так себе членик). В подраздельчик "справочные системы" залили чего под рукой было. Было немного, да и рука тряслась после вчерашнего "проектирования" кррровеносной системы. Но, как говорится, лучше порно, чем никогда: http://hi-tech.nsys.by/download/help_systems/.
  Такие вот дела с внуренними органами. Развиваются они по-маленьку :). Сегодня вот даже очередной удар сердца пришлось подорваться и сделать. 21-й выпуск рассылки, который вы щас наверняка с омерзением в корзину вышвырните...

  Такой вот бред мне полуношная игра в Diablo-2 навеяла...
  [1] Для тех, кто медитировал над #2 рассылки, алгоритм должен быть понятен как 2+2=(вписать желаемое). Тем более, что в #17 мы еще раз вернулись к системе счисления. Повторяться в третий раз - считаю излишним. Кто не въедит в алгоритм WRITE_DECIMAL - научитесь сначала переводить числа между радиксами на листике в клеточку.
  Итак, ставим новую задачу. В DX у нас шестнадцатеричное число. Нам нужно напечатать его на монитор в "десятичном формате". Еще раз обращаю ваше внимание на то, что существует множество способов ее решения. Мы же выбрали способ, который:
  а). Вам легче всего будет понять.
  б). Требует минимального количества "новых" команд.
  Кто скажет, что мы не правы - пусть первый кинет камень в эхо-конференцию RTFM_Helpers.

  [2] Прежде всего посмотрите на процедуру WRITE_HEX_DIGIT и вспомните, какой алгоритм положен в основу ее работы. Вспомнили? Рад за вас!!
  А теперь мы познакомимся к командой деления. Что будем делить?? Ну естественно, "регистры" :).

  Новая команда называется "деление беззнаковое" (DIVide unsigned).
  Что такое делимое/делитель/частное, я вас грузить не буду, это в учебнике арифметики для младших классов более чем понятно расжевано. Ну во всяком случае детишки это понимают.
  (Кто скажет, что 10/3=3 а остаток 333 в периоде - тот дурак. Кто скажет, что остаток будет равен 1, скажет правильно.)

  Следующий кусок кода демонстрирует деление значения регистра AX на значение регистра BL.
mov ax,10d
mov bl,3d
div bl
  Обратите внимание: ДЕЛИМОЕ у нас может располагаться только в регистре AX (другими словами, делимое задается неявно), а ДЕЛИТЕЛЬ - в любом регистре.
  Кто не верит - посмотрите под отладчиком...

  1. Если делитель размером в байт, то после операции частное помещается в AL, а остаток - в AH.
  2. Если делитель размером в слово, то делимое должно быть расположено в паре регистров DX:AX (младшая часть делимого в AX). После операции частное помещается в AX, а остаток - в DX.
  2. Если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров EDX:EAX (младшая часть делимого находится в EAX.) После операции частное помещается в EAX, а остаток - в EDX.

  Внимание, подводный камень! В следующем примере:
mov ax,10d
mov bx,3d
div bx
  у вас вовсе не AX на BX делиться будет, а парочка DX:AX на BX.
  Помедитируйте над этим :))

  [3] А теперь, собственно, пропиваю саму процедуру вместа с традиционным расжевыванием оной:
;-[write_decimal, v1]------------------------------------
;печатает десятичное беззнаковое число
;на входе: dx - типа число
;на выходе: нихрена
;прерывания: ан нэту
;процедуры: write_hex_digit
;--------------------------------------------------------
write_decimal proc
  push ax
  push cx
  push dx
  push bx
  mov  ax,dx  ;(1)
  mov  bx,10d ;(2)
  xor  cx,cx  ;(3)
 non_zero:
  xor  dx,dx  ;(4)
  div  bx     ;(5)
  push dx     ;(6)
  inc  cx     ;(7)
  cmp  ax,0   ;(8)
  jne  non_zero
 write_digit_loop:
  pop  dx     ;(9)
  call write_hex_digit ;(10)
  loop write_digit_loop
  pop bx
  pop dx
  pop cx
  pop ax
  ret
write_decimal endp
  Алгоритм простой: пока частное не равно 0, делим его, делим и еще раз делим на 10d, запихивая остатки в стек. Потом - извлекаем из стека. Вот и вся "конвертация" из HEX в BIN :). Это если в двух словах.
  А если подробно, то вот что получается:
  Бряк 1 - подготавливаем делимое. Как уже говорилось, оно у нас задается неявно - обязательно через AX. А параметр у нас - через DX процедуре передается. Вот и перемещаем.
  Бряк 2 - это, собственно, делитель.
  Бряк 3 - очищаем CX. Он у нас будет в качестве счетчика. О нем мы еще поговорим.
  Бряк 4 - очищаем DX. Если не очистим, то мы не 1234h какое-нить на 10 делить будем, а 12341234h. Первое 1234 нам надо? Вот и я говорю - очищаем!
  Бряк 5 - делим! Частное - в AX, остаток - в DX.
  Бряк 6 - заносим остаток (DX) в стек ;).
  Бряк 7 - CX=CX+1. Это мы считаем сколько раз "щемили остаток", который "щемится", по кругу (прыжок на метку non_zero), пока AX не равно 0 (бряк 8). То есть делим, делим AX, пока он не окажется, что делить, собственно, нечего.
  Так-с... Деление закончено, число раз, которое мы поделили AX до его полного обнуления, хранится в CX.
  Дальше все просто. Нам нужно такое же количество раз (CX) извлечь значение (DX) из стека. И это будет "HEX", переведенный в DEC. (Оно же: число в двоично коде, разобранное на последовательность десятичных цифр).
  Помните, как у нас организуется цикл? Через loop и CX?
  Если бы в качестве счетчика мы использовали какой-нибудь другой регистр, то пришлось бы извращаться со всякими метками и прыжками... а так все просто, все продуманно :). Цикл, в теле которого ИЗВЛЕЧЬ ЦИФЕРКУ (бряк 9) и НАПЕЧАТАТЬ ЦИФЕРКУ (бряк 10). Столько же раз, сколько мы и делили наше исходное шестнадцатеричное число.

  Для тех, кто не понял: бряк - это брекпоинт. Для тех, кто еще не знает, что такое брекпоинт - ищите объяснение в #11.

  [4] Тестируем!!
testing proc
  mov  dx,12345d
  call write_decimal
  call exit_com
testing endp
  Двое из десяти "подопытных" чайников (есть такие) возмутились:
  - В DX же только четыре циферки влазят!
  - Ага! Аж два раза четыре!!
mov  dx,'DZ'
  Как видите, туда еще и две буковки "влазят" ;)
  А то и все четыре, если кавычки считать...

  Медитируйте!!
  [1] В #13 мы написали программу "Hello, World!" с использованием 13-й функции 10 прерывания. Посмотрите на ее исходник...
  Сегодня мы слабаем еще одно "Hello, World!", но уже несолько другим способом. Какой из этих способов более дZенский - решайте сами ;).
  Для начала мы создадим блок данных после всех-всех-всех процедур но между директивами начала и конца сегмента.
  Блок данных будет выглядеть следующим образом:
abc db 'Hello, World-2$'
  Вы должны спросить "А почему мы хотим напечатать Hello, World-2, а в конце строки у нас 2$? $ - это что? World за баксы продавать, штоль?? Да ну вас...
  Эту строчку мы будем выводить на монитор особым дZенским способом - посимвольно. То есть: возьмем первый символ из блока данных, выведем, потом второй и т. д. аналогично пока не встретим символ '$'.

  Опять-таки, это если в двух словах. Но ведь наверняка вам этого покажется мало ;).

  Щемить символы мы будем двумя способами. (Тут я хотел было написать "неправильным" и "правильным", но потом передумал и решил обозвать их "первым" и "вторым").
  В алгоритм первого способа вы и сами без труда въедете (я только "рабочую часть" приведу, пуши с попами сами проставляйте):
 ...
next:
 mov dl,[BX]
 cmp dl,'$'
 je finish
 call write_char
 inc BX
 jmp next
finish:
 ...
  [2] А вот второй способ немножко навороченнее :). Чтобы в нем разобраться, мы сначала познакомимся со следующей группой команд:
  LODSB, LODSW, LODSD
  Их назначение - это загрузка элемента из последовательности (строки, цепочки) в регистр-аккумулятор al/ax/eax.
  Для тех, кто не понял - наша строчка "Hello, World-2$" как раз и является "последовательностью/строкой/цепочкой" из элементов размером в байт.
  Адрес цепочки передается через ds:esi/si, сами "элементы" (фиксированной ширины) возвращаются в al (байт, команда LODSB), ax (слово, команда LODSW) или eax (двойное слово, команда LODSD). В общем, последние буковки команд как раз и указывают на размерность элемента: [B]yte, [W]ord, [D]ouble word. Т. е. размер мы определяем неявно.
  После выполнения одной из этих команд значение регистра si изменяется на величину, равную длине элемента, но... хм...

  Пришло время еще одну большую тайну познать, братья. В справочнике Юрова написано, "знак этой величины зависит от состояния флага df:
  df=0 — значение положительное, то есть просмотр от начала цепочки к ее концу;
  df=1 — значение отрицательное, то есть просмотр от конца цепочки к ее началу."
  Обидно, да? Флаги-то мы с вами еще не расколупали... Чего-ж дальше-то делать, а?

  Как что? "Пропивать" стандартную процедуру и колупать ее, колупать, колупать, ногами ее, ногами, и по морде, по морде, по морде...
;-[write_string, v1]-------------------------------------
;печать строки символов на мониторе.
;(Строчка оканчивается символом '$'
;на входе: ds:dx - адрес строки
;на выходе: нихрена
;прерывания: ан нату
;процедуры: write_char
;--------------------------------------------------------
write_string proc
  push ax
  push dx
  push si
  pushf              ;(1)
  cld                ;(2)
  mov  si,dx         ;(3)
 string_loop:
  lodsb              ;(4)
  cmp  al,'$'        ;(5)
  jz   end_of_string ;(6)
  mov  dl,al         ;(7)
  call write_char    ;(8)
  jmp  string_loop   ;(9)
 end_of_string:
  popf               ;(10)
  pop  si
  pop  dx
  pop  ax
  ret
write_string endp
  Итак, что делает команда lodsb, вы уже поняли. А вот с df=0/df=1 пока что непонятки.
  Будем разбираться.

  Нам нужно, чтобы "просмотр цепочки" осуществлялся командой lodsb слева направа, для этого нужно установить значение df=0. Делаем мы это при помощи команды cld (бряк 2).
  Если нам нужно, чтобы "просмотр цепочки" осуществлялся справа налево, мы используем команду std. (Можете попробовать. Ерунда получится.)

  А теперь вспомним "золотое правило". Все регистры, которые мы изменяли ВНУТРИ процедуры, "на выходе" должны восстанавливать свои ПРЕДЫДУЩИЕ значения (кроме тех регистров, через которые мы возвращаем РЕЗУЛЬТАТ).
  Так вот: то же самое касается и флагов, которые мы изменяем.
  Для регистров мы использовали команды PUSH и POP. Для регистра флагов (изменять у которого мы можем только БИТЫ) используются команды pushf (записать в стек значения флагов, бряк 1) и popf (извлечь из стека, бряк 10).

  ПРИМЕЧАНИЕ: Это несколько вольное положение (хотя, вобщем-то, верное). Видимо, здесь следует хотя бы добавить, что сохранять/восстанавливать флаги нужно при изменении специальных флагов (if, df). (С) Хемуль

  Теперь колупаем дальше... (С) Serrgio

  Бряк 3. Мне удобнее передавать данные "в процедуру" через регистр DX, о чем и написано в заголовке. А lodsb (бряк 4) хотит, чтоб адрес ему в SI подавали. Удовлетворим его желание :)
  Бряк 4. После выполнения этой команды ASCII-код первого символа "цепочки" "Hello, World-2$" помещается в AL, а значение регистра SI увеличивается на 1 и указывает теперь на второй элемент цепочки (символ 'e').
  Бряк 7. Удовлетворяем "пожелания" процедуры write_char. Из AL переносим в DL и печатаем (бряк 9), write_char'ом.

  Тэкс... Мы пропустили бряки 5 и 6-й...
  Смотрите: на бряке 9 мы "безусловно" зацикливаем "извлечение" и печать элементов цепочки. Безусловно - это значит до потери пульса. Чтоб этого не произошло, каждый из элементов цепочки мы сравниваем с символом-конца-цепочки (в нашем случае это '$', но можно использовать и любой другой). Если текущий символ равен символу-конца-цепочки, то выпрыгиваем (бряк 6) из этого безусловного цикла, восстанавливаем статус-кво (бряк 10) и все на этом...

  [3] Тестируем!!
testing proc
  lea dx,abc
  call write_string
  call exit_com
testing endp
  Напечаталось то, что надо?
  Если true - читайте дальше.
  Если false - расколупывайте и медитируйте до полного просветления...
;------------------------------------------------------
;          Перевод беззнакового длинного целого в
;              ASCII строку без терминатора
;------------------------------------------------------
; In:   DX:AX  (значение)
;       BX     (основание, 110 то 0-прописные,
;                             20h-строчные)
;       ES:DI  (буфер)
; Out:  ES:DI  (указатель сразу за числом)
; Use:  нет
; Modf: AX, DX
; Call: word2str, @digitsave
;

dword2str proc
  or   dx,dx
  jz   word2str ; V<65536
  push si
  xchg si,ax    ; OPTIMIZE: instead MOV SI,AX
  xchg ax,dx    ; OPTIMIZE: instead MOV AX,DX
  xor  dx,dx
  div  bx       ; AX=V/(65536*BX), DX=V%(65536*BX)
  xchg ax,si    ; DX:AX=V%(65536*BX)
  div  bx       ; AX=(V%(65536*BX))/BX, DX=digit=V%BX
  xchg dx,si    ; SI=digit=V%BX, DX:AX=V/BX
  call dword2str
  xchg ax,si    ; OPTIMIZE: instead MOV AX,SI
  pop  si
  j    @digitsave
dword2str endp
;------------------------------------------------------
;             Перевод беззнакового целого в
;              ASCII строку без терминатора
;------------------------------------------------------
; In:   AX    (значение)
;       BX    (основание, 110 то 0-прописные,
;                            20h-строчные)
;       ES:DI (буфер)
; Out:  ES:DI (указатель сразу за числом)
; Use:  нет
; Modf: AX
; Call: нет

word2str proc
  cmp  ax,bx
  jb   @digitsave
  push dx
  xor  dx,dx
  div  bx       ; DX=digit=V%BX, AX=V/BX
  call word2str
  xchg ax,dx    ; OPTIMIZE: instead MOV AX,DX
  pop  dx
 @digitsave:
  add  al,'0'
  cmp  al,'9'
  jbe  @@digitsave
  add  al,'A'-'9'-1
  or   al,cl    ; upcase/lowcase
 @@digitsave:
  stosb
  ret
word2str endp
  Такие дела...
  Еще одна страшная тайна: "в компутере" помимо регистров есть еще и "флаги". В dzebug'e вы могли их увидеть в виде загадочных (от слова "гады они, гады") буковок "NV UP EI PL NZ NA PO NC" правее регистра IP.
  На самом деле эти буковки - отображение значений ОТДЕЛЬНЫХ БИТОВ РЕГИСТРА ФЛАГОВ. Каждый из этих битов имеет определенное функциональное значение и обзываются собственным именем.
  Каждый из этих битов либо является результатом инструкций процессора (например, флаг Zero позволяет узнать, был ли результат последней инструкции сложения нулевым), либо контролирует работу процессора и меняется самим программистом (например, флаг направления обработки цепочек или флаг разрешения прерываний).
  Ну и все-такое...

  Короче, вот такая вот интересная таблицка в умных книжках по ассемблеру нарисована:
31 ... 18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00
 0 ... AC|VM|RF| 0|NT|IOPL |OF|DF|IF|TF|SF|ZF| 0|AF| 0|PF| 1|CF
  Вот досье на эту дрянь (не пугайтесь, со следующего номера мы их начнем помаленьку расколупывать):

  СF (0) - Флаг переноса (Carry Flag):
    1 - арифметическая операция произвела перенос из старшего бита результата (7-го, 15-го или 31-го в зависимости от размерности операнда);
    0 - переноса не было.

  PF (2) - Флаг паритета (Parity Flag), только для 8-ми младших разрядов операнда любого размера:
    1 - 8 младших бит результата содержат четное число единиц;
    0 - 8 младших бит результата содержат нечетное число единиц.

  AF (4) - Вспомогательный флаг (Auxiliary Flag), только для команд, работающих с BCD-числами. Фиксирует факт заема из младшей тетрады результата:
    1 - в результате операции сложения был произведен перенос из разряда 3 в старший разряд или при вычитании был заем в разряд 3 младшей тетрады из значения в старшей тетраде;
    0 - переносов и заемов в (из) 3 разряд(а) младшей тетрады результата не было.

  ZF (6) - Флаг нуля (Zero Flag):
    1 - результат нулевой;
    0 - результат ненулевой.

  SF (7) - Флаг знака (Sign Flag), отображает состояние старшего бита результата (бит 7/15/31 для 8/16/32-битных операндов соответственно):
    1 - старший бит результата равен 1;
    0 - старший бит результата равен 0.

  TF (8) - Флаг трассировки (Trace Flag), предназначен для организации пошаговой работы микропроцессора:
    1 - микропроцессор генерирует прерывание с номером 1 после выполнения каждой машинной команды. Может использоваться при отладке программ, в частности отладчиками;
  0 - обычная работа.

  IF (9) - Флаг прерывания (Interrupt enable Flag), предназначен для разрешения или запрещения (маскирования) аппаратных прерываний (прерываний по входу INTR):
    1 - аппаратные прерывания разрешены;
    0 - аппаратные прерывания запрещены.

  DF (10) - Флаг направления (Direction Flag), определяет направление поэлементной обработки и строчных/цепочечных операциях:
    1 - от конца строки к ее началу;
    0 - от начала строки к ее концу.

  OF (11) - Флаг переполнения (Overflow Flag), используется для фиксирования факта потери значащего бита при арифметических операциях:
    1 - в результате операции происходит перенос (заем) в (из) старшего, знакового бита результата (биты 7/15/31 для 8/16/32-разрядных операндов);
  0 - в результате операции не происходит переноса (заема) в (из) старшего, знакового бита результата.

  IOPL (12, 13) - Уровень привелегий ввода-вывода (Inpup/Outpup Privelege Level), используется в защищенном режима работы микропроцессора для контроля доступа к командам вводв-вывода в зависимости от привелегированности задачи.

  NT (14) - Флаг вложенности задачи (Nested Task), используется в в защищенном режиме работы микропроцессора для фиксации того факта, что одна задача вложена в другую.

  RF (16) - Флаг возобновления (Resume Flag), используется при обработке прерываний от регистров отладки.

  VM (17) - Флаг виртуального 8086 (Virtual 8086 Mode), признак работы микропроцессора в режиме виртуального 8086:
    1 - процессор работает в режиме виртуального 8086;
    0 - процессор работает в реальном или защищенном режиме.

  AC (18) - Флаг контроля выравнивания (Aligment Check), предназначен для разрешения контроля выравнивания при обращениях к памяти.

  (С) Из умной книжки скопировано правильно.
  Правда, в книжке была ошибка, но ее Хемуль пофиксил :)
  Черт подери!! До чего ж приятно, должно быть, находить ошибки в умных книжках :).

  А на то, что в дZебаге флаги другими буковками обозначаются, не обращайте внимание. К этому тупому отладчику мы больше никогда не вернемся. Со следующего номера начнем юзать другие тупые средства отладки.
  Почему тупые? А потому, что пока что НЕ-SoftIce все же :(.
  Icey-Dee's Programming Site
  Англоязычный сайт, но даже с моими познаниями этого языка, вполне можно читать.
  Во вступлении к нам обращается Lithium (ну я так понял, что он к нам обращается) и говорит, "что это есть помощь вам, если у вас проблеммы с пониманием сути жизни :), ну и типа здесь содержится куча инфы, с начальными концепциями Асма, ну ессно к ним охренительное количество комментариев".
  Дается Асм, буквально с нуля. Начиная с такой темы как "что такое бит, и что такое слово...".
  Смотрим дальше:
  PART 1 - Дается представление о структуре проги.
  PART 2 - Printing a string... Глава посвященная написанию первой проги.
  PART 3 - и т. д.
  Если вы уже умете программить, то тут вам могут предложить програмить под саундкарту (SB 16. Знаете такую? Или у вас у всех Creative Live 128?), и видеокарту...(не помню какую).
  Доунлоад... :( Только лист прерываний, и PC Help (не скачивал, не знаю чего там).
  Вывод: Рекомендую начинающим (с небольшим знанием английского), стоит посмотреть и поучится.
  Да, вот еще что: насколько я понял, тут "простыни" даются на MASM'е.

  http://www.imada.ou.dk/~jews/PInfo/intel.html
  Достаточно отстойный сайт, и не уделил бы я ему внимания, если б не один плюс.
  Команды проца даны в виде таблицы (есть и команды MMX) с краткими характеристиками, и если вы так ленивы как я и вам в лом их переписывать руками (хотя, работа руками и головой в любой ситуации - основная черта асемблерщика), то можно их аккуратно в Word перенести, и распечатав, повесить над компом.
  И вот именно в тот момент, когда девушка от тебя ушла (ну или парень), сказав, что...
  - Эта чертова железяка для тебя, больше чем я :(
  Или:
  Если ваш(а) парень (подруга) достаточно... хм... образованный (ая), то после фразы типа:
  - Ты сам результат команды XOR!
  Ну или вообще когда все хреново...
  Короче - просто нужно посмотреть на эти божественные распечатки (ну конечно после корректирования) и попробовать войти в нирвану... :)
  Больше ничего на этом сайте путевого я не нашел, хотя он в List.ru имеет достаточно высокий рейтинг.

  http://icfcst.kiev.ua/panorama/%2E/index.shtml
  Честно ребят, не понял я не хрена в этом сайте :(
  Обещаний на начальной странице охрененная куча, и еще маленькая тележка. Обещания даны в виде ссылок на инфармационные ресурсы. Но я не смог достучаться до них, до этих ресурсов :(
  Мож эт конечно типа мои проблеммы, но...
  С трудом достучавшись до ассемблерной странички, я чуть не охренел... На это страничке есть только одна фраза "May the source be with you, and remember the KISS principle ;-)" . И все, БОЛЬШЕ НИЧЕГО НЕТ!

  Выводы: Из предложеных в этом обзоре сайтов сходите только на первый , а на остальные забейте (по русски), или накладите с горы Памира (Гималаев, если вдруг кому то не нравится Памир)
  Кстате, а вы знаете KISS принцип?... :)

  Assembler Planet
  "Здравствуйте, добро пожаловать.
  Если вы программист или увлекаетесь программированием, тогда вы попали по адресу. Несмотря на название "Assembler Planet" здесь вы найдёте множество полезной информации не только по assembler'у, но и по другим различным языкам программирования. Даже если вы опытный программист некая информация с этого сайта будет вам очень полезна"
  Хм, ну эт мы сами решим...
  Кликаем на ссылочку, и...
  "программирование игр" (4)- "NETU" (эт в оригинале так пишут, я серьезно)
  "Вирусы" (7)- "NETU",
  "Описание отладчиков" - нету...
  "FTP" - одна прога, которая "не тестилась, и вообще хрен знает, что грузит, и вообще херня какая то. Кто разберется, мыльните мне...".
  Оценена 4 звездами :-\. (Наверное Брежнев наградил).
  "Криптография" - дает офигенное количество маленьких программок для скачивания "вот вам народ, учитесь".
  "Асм против Вин 32"... хм, есть некоторое количество статей, как для начинающих, так и для немного понимающих... :)
  "Асм для винды по шагам" - всего 35 шагов. Достаточно подробно рассмотренно програмирование под винду.
  В общем, достаточно противоречивые чувства вызвал у меня этот сайт. Есть и плохо, есть и хорошо.
  Не знаю, что и сказать. Достаточно много ресурсов, но и сделано коряво, часто страницу требуется перезагрузить, для корректного просмотра. И именно это "КОРЯВО" - вызывает во мне борьбу двух сил мира, желтого и черного...
  Я останусь с моими противоречиями, а вы возмите и посмотрите.
  А потом мне расскажите...
  :)
  В следующем номере (хрен его знает, когда он выйдет) мы скорее всего начнем расколупывать флаги. А еше окончательно распрощаемся с морально устаревшей программой debug и познакомимся с еще одной морально устаревшей программой - борландовским отладчиком Turbо Debugger.
  И да станет все тайное явным, братья!!
Низкоуровневое программирование для дZeнствующих
Ассемблер? Это просто! Учимся программировать
Уроки для начинающих программистов
Copyright 2001 HI-TECH. По всем вопросам мылить hi-tech@tut.by.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться Relayed by Corbina
Рейтингуется SpyLog

В избранное