буффер

Тема в разделе "WASM.BEGINNERS", создана пользователем rubic_, 13 авг 2007.

  1. rubic_

    rubic_ Женя

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    121
    Адрес:
    Омск
    .model tiny
    .code
    org 100h

    start: mov ax,0003h
    int 10h
    mov dx,offset message
    mov ah,09h
    int 21h

    mov dx,offset bukva
    mov ah,0Ah
    int 21h
    xor di,di
    xor ax,ax
    mov al,byte ptr buf[di]
    ; cmp al,10
    ; sbb al,69h n
    ; das
    int 29h

    ret
    message db "Enter number: $"
    bukva db 6
    buf:

    end start
    что такое byte ptr?
    по какому принципу идет чтение из буфера?
    почему когда я ввожу 1 символ..прога мне выдает символ 1 из таблицы ASCII
    вводу 2 символа, выводит второй...три-третий....и так далее

    пр.
    Enter number: 123 -- На выходе 3 символ таблицы ASCII
    причем числа не имеют ни какого значения...как это понять?
    я думал что он будет действовать как массив...доставая по очереди каждый символ...
    в данном случае 1 или 3(не знаю ка ка последовательность)
    ---------------------------------------------------
    ; cmp al,10
    ; sbb al,69h n
    ; das

    какие именно действия происходят в этих 3-х строках
     
  2. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    ptr - pointer
    byte ptr - указатель на байт
    mov al, byte ptr [di] - загнать в al (младшую часть ax) байт, находящийся по адресу di.

    теперь смотри на свою программу.
    Есть буффер, предположим

    SomeBuf db "ABCD....Z"
    соответственно символ А будет находится по адресу [SomeBuf+0], B по адресу [SomeBuf+1] и т.д.
    Условно это можно записать как [SomeBuf+di], где di - индекс символа, или смещение символа от начала буффера.
     
  3. rubic_

    rubic_ Женя

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    121
    Адрес:
    Омск
    спасибо большое многое прояснил...первые 4 дня в ассемблере - это путаница...
    если бы не опыт в С++, я бы вообще поник.....

    на вторую часть вопроса...еще бы ответ получить
     
  4. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Скачай себе справочник по асм-коммандам.
    Вот я те залил на рапиду...
    http://rapidshare.com/files/48695160/asm.chm.html

    И так.

    cmp - комманда сравнения
    тут без комменариев.

    SBB Целочисленное вычитание с займом
    Код (Text):
    1. Команда sbb вычитает второй операнд (источник) из первого (приемника).
    2. Результат замещает первый операнд, предыдущее значение которого теряется.
    3.  Если установлен флаг CF, из результата вычитается еще 1. Таким образом,
    4. если команду вычитания записать в общем виде
    5.  
    6. sbb операнд__1, операнд_2
    7.  
    8. то ее действие можно условно изобразить следующим образом:
    9. операнд_1 - операнд_2 - CF -> операнд_1
    10.  
    11. В качестве первого операнда можно указывать регистр (кроме сегментного) или
    12. ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти
    13.  или непосредственное значение, однако не допускается определять оба операнда
    14. одновременно как ячейки памяти. Операнды могут быть байтами или словами и
    15. представлять числа со знаком или без знака. Команда sbb обычно используется
    16. для вычитания 32-разрядных чисел. Команда воздействует на флаги OF, SF, ZF, PF и CF.
    17.  
    18. Пример 1
    19. mov AX,76A5h
    20. sbb AX,76A3h ;AX=1, если CF был = 1
    21. ;AX=2, если CF был = 0
    22.  
    23. Пример 2
    24. ; В полях данных:
    25. numlow dw 000Ah ;Младшая часть вычитаемого
    26. numhigh dw 0001h ;Старшая часть вычитаемого
    27. ;Число 1000Ah=65546
    28. ;В программном сегменте:
    29. mov AX, 0 ;Младшая часть уменьшаемого
    30. mov DX,0002 ;Старшая часть уменьшаемого
    31. ;Число 20000h=131072
    32. sub AX, numlow ;Вычитание младших частей.
    33. ;AX=FFF6h, CF=1
    34. sbb DX,numhigh ;Вычитание старших частей с
    35. ;займом.
    36. ;DX:AX=0000:FFF6h=65526
    37.  
    38. 386+ Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.
    39.  
    40. Пример
    41. ;В полях данных:
    42. nlow dd 0Ch ;Младшая часть вычитаемого
    43. nhi dd 40000000h ;Старшая часть вычитаемого
    44. ;Число 400000000000000Ch ;В программном сегменте:
    45. mov EAX,0Bh ;Младшая часть уменьшаемого
    46. mov EBX,60000000h ;Старшая часть уменьшаемого
    47. ;Число 600000000000000Bh
    48. sub EAX,nlow ;Вычитание младших частей.
    49. ;EAX=FFFFFFFFh, CF=1
    50. sbb EBX,nhi ;Вычитание старших частей с
    51. ;займом. EBX=lFFFFFFFh
    52. ;Разность IFFFFFFFFFFFFFFFh
    ======================================================================

    DAS Десятичная коррекция в регистре AL после вычитания
    Код (Text):
    1. Команда das корректирует результат вычитания в регистре AL двух
    2. упакованных двоично-десятичных (BCD) чисел (по одной цифре в каждом полубайте),
    3.  чтобы получить пару правильных упакованных десятичных цифр. Команда
    4. используется вслед за операцией вычитания упакованных двоично-десятичных
    5. чисел. Если для вычитания требовался заем, устанавливается флаг CF. Команда
    6.  воздействует на флаги SF, ZF, AF, PF и CF.
    7.  
    8. Пример 1
    9. mov AL,55h ;Упакованное BCD 55
    10. sub AL,19h ;После вычитания AL=3Ch
    11. das ;AL=36h, т.е. упакованное BCD 36
    12.  
    13.  
    14. Пример 2
    15. mov AL,55h ;Упакованное BCD 55
    16. sub AL,15h ;После вычитания AL=40h
    17. das ;AL=40h, т.е. упакованное
    18. ;BCD 40 (в данном случае
    19. ;команда das ничего не делает)
    20.  
    21. DEC Декремент (уменьшение на 1)
    22. Команда dec вычитает 1 из операнда, в качестве которого можно указывать
    23.  регистр (кроме сегментного) или ячейку памяти размером как в байт, так и
    24. в слово. Не допускается использовать в качестве операнда непосредственное
    25. значение. Операнд интерпретируется как число без знака. Команда воздействует
    26. на флаги OF, SF, ZF, AF и PF.
    27.  
    28. Пример 1
    29. mov AX,0FFFFh
    30. dec AX ;AX=FFFEh
    31.  
    32.  
    33. Пример 2
    34. mov CX,0
    35. dec CX ;CX=FFFFh
    36.  
    37.  
    38. Пример 3
    39. mov CX,3500h
    40. dec CL ;CX=35FFh
    41.  
    42.  
    43. Пример 4
    44. ; В полях данных
    45. mem dw 68
    46. ;B программном сегменте
    47. dec mem mem=67
    48.  
    49. 386+ Допустимо использование 32-битовых операндов и дополнительных
    50. режимов адресации 32-разрядных процессоров.
    51.  
    52. Пример
    53. mov EAX, 0
    54. dec EAX ;EAX=FFFFFFFFh
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    rubic_
    какие именно действия происходят в этих 3-х строках
    Преобразование hex-цифры в AL в ASCII-код. Вход: AL - hex-цифра (00h - 0Fh). Выход: AL - ASCII-код символа.
     
  6. rubic_

    rubic_ Женя

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    121
    Адрес:
    Омск
    это то я понял...как именно она преобразует

    nitrotoluol -спасибо за справочник...очень удобный..что значит упакованное(DAS команда)
     
  7. pris0ner

    pris0ner New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    43
    упакованное это значит что например число 23 будет представлено в двоичном виде вот так:

    0010 0011

    2 3

    формат шизнутый. вроде делали его для удобства но я например им сроду не пользовался. Хотя испытывал эстетическое удовольствие от использование этой самой команды десятичной коррекции. Помнится была она еще на процессорах Z80 .
    :derisive:

    сам формат предназначен для проведения арифметических операций непосредственно в десятично-двоичном формате. Чтобы не приходилось париться с переводом из двоичной в десятичную и обратно.
     
  8. rubic_

    rubic_ Женя

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    121
    Адрес:
    Омск
    понятно..спс