(FASM)Сложение и вывод результата на экран

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

  1. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    n0name & AsmGuru62 & asd
    Куда вас понесло? Imho у автора топика не проблем с выводом строки. Проблема с преобразованием строка <-> число.
     
  2. krundetz

    krundetz Alexander

    Публикаций:
    0
    Регистрация:
    25 апр 2007
    Сообщения:
    5
    Адрес:
    N.Novgorod
    q_q
    Спасибо ваш ответ помог мне более четко сформулировать вопрос.
    Благодаря этому нашел следующий Assembler FAQhttp://pascal.sources.ru/asm/faq/index.htm#shownum
    Суть работы алгоритма в целом понял.
    Изменил приведенный там пример так:
    Код (Text):
    1. org 256
    2. Number      =   12345
    3.  
    4.  
    5.  
    6.         std            ; Устанавливаем ОБРАТНЫЙ порядок записи
    7.         ;lea     di,StringEnd-1 ; ES:DI = последний символ строки String
    8.         mov di,StringEnd-1
    9.         mov ax,Number      ; Заносим в AX число для перевода
    10.  
    11. ; Начинаем перевод числа AX в строку
    12.         mov cx,10          ; Задаемся делителем CX = 10
    13. _Repeat:
    14.         xor dx,dx          ; Обнуляем DX (для деления)
    15.         div cx         ; Делим DX:AX на CX (10),
    16.                        ; Получаем в AX частное, в DX остаток
    17.         xchg    ax,dx          ; Меняем их местами (нас интересует остаток)
    18.         add al,'0'         ; Получаем в AL символ десятичной цифры
    19.         stosb              ; И записываем ее в строку
    20.         xchg    ax,dx          ; Восстанавливаем AX (частное)
    21.         or  ax,ax          ; Сравниваем AX с 0
    22.         jne _Repeat     ; Если не ноль, то повторяем
    23.  
    24. ; Теперь осталось вывести строку на экран
    25.         mov ah,9
    26.         lea dx,[di+1]      ; Заносим в DX адрес начала строки
    27.         int 21h        ; Выводим ее на экран
    28.  
    29.         int 20h        ; Выходим из программы
    30.  
    31. String      db  5 dup (?),'$'  ; Резервируем 5 байт для строки
    32. StringEnd   =   $-1        ; Указывает на символ '$'
    Но данный пример не компилируется ругается на String db 5 dup (?),'$'
    хотя это вроде правильное объявление, подскажите пожалуйста где я ошибаюсь.
    Vov4ick
    Спасибо за ваш пример обязательно его попробую.
     
  3. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    krundetz попробуйте так:

    String db ? dup (5),'$'
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Arthur
    Это для какого компилятора?

    krundetz
    данный пример не компилируется ругается
    Так не пойдет. Укажи компилятор, его версию и _точное_ сообщение об ошибке.

    Скачал flat assembler 1.67.21 for Windows. last update: 11 March 2007 (841'267 байт), скормил ему (fasm.exe) твой код из #22. Ни каких сообщений. Получился исполняемый com-файл, который выдает на экран 12345.
     
  5. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Нет смысла писать 5 dup(?),'$' Ибо всё, что перед данными не может не быть. TASM и MASM этот момент отработают, не знаю как другие.
    krundetz Мой пример аналогичен вашему, только у меня для сохраниения регистра используется стек, а у вас другой регистр. Видимо тогда про xchg я не знал :derisive:
     
  6. krundetz

    krundetz Alexander

    Публикаций:
    0
    Регистрация:
    25 апр 2007
    Сообщения:
    5
    Адрес:
    N.Novgorod
    Понял, учту на будущее.

    Прошу прошения по ошибке пользовался старой версией компилятора(flat assembler 1.54 for Windows), хотя 1.67.21 недели две как скачал (.

    Не понял объясните пожалуйста.
     
  7. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Любая секция данных или кода или ещё какая имеет физический размер и виртуальный размер. Физический - тот, который содержит в себе данные (инициализированные), виртуальный - неинициализированные, причём так, что инициализированные данные всегда вначале секции, т.к. неинициализированные можно просто отбросить, запомнив их размер и прибавив его к р-ру инициализированных. Поеэтому если мешать такие данные то в конечном итоге ничего отбросить из секции инициализированных данные будет нельзя --> разбухание размера секции.
     
  8. krundetz

    krundetz Alexander

    Публикаций:
    0
    Регистрация:
    25 апр 2007
    Сообщения:
    5
    Адрес:
    N.Novgorod
    Спасибо всем.
    Вот что у меня получилось.
    Код (Text):
    1. org 256
    2. num1        =   21
    3. num2        =   29
    4.         std            ; Устанавливаем ОБРАТНЫЙ порядок записи
    5.         ;Вывожу на экран первую строку
    6.         mov  ah, 9
    7.         mov  dx, String1
    8.         int  21h
    9.         ;Вывожу первую цифру на экран
    10.         mov  ax,num1
    11.         call     itoa
    12.         lea  dx,[di+1]
    13.         mov  ah,9
    14.         int  21h
    15.         ;Вывожу на экран вторую строку
    16.         mov  dx, String2
    17.         int  21h
    18.         ;Вывожу вторую цифру на экран
    19.         mov  ax,num2
    20.         call     itoa
    21.         lea  dx,[di+1]
    22.         mov  ah,9
    23.         int  21h
    24.         ;Выводим на экран третью строку
    25.         mov  dx, String3
    26.         int  21h
    27.         ;Складываю два числа и вывожу на экран ресультат
    28.         mov  ax,num1
    29.         add  ax,num2
    30.         call     itoa
    31.         lea  dx,[di+1]
    32.         mov  ah,9
    33.         int  21h
    34.         ;Ожидаем нажатия клавиши
    35.         mov ah, 1
    36.         int 21h
    37.         int 20h        ; Выходим из программы
    38. itoa:
    39.         mov di,ResultEnd-1
    40.         mov cx,10
    41.         _Repeat2:
    42.         xor dx,dx          ; Обнуляем DX (для деления)
    43.         div cx         ; Делим DX:AX на CX (10),
    44.                        ; Получаем в AX частное, в DX остаток
    45.         xchg    ax,dx          ; Меняем их местами (нас интересует остаток)
    46.         add al,'0'         ; Получаем в AL символ десятичной цифры
    47.         stosb              ; И записываем ее в строку
    48.         xchg    ax,dx          ; Восстанавливаем AX (частное)
    49.         or  ax,ax          ; Сравниваем AX с 0
    50.         jne _Repeat2
    51.         ret
    52. String1     db  'Result addition $'
    53. String2     db  ' and $'
    54. String3     db  ' equals $'
    55. Result      db  5 dup (?),'$'  ; Резервируем 5 байт для строки
    56. ResultEnd   =   $-1        ; Указывает на символ '$'
    Хотелось бы услышать ваше мнение о рациональности организации данного кода, в частности о том как наиболее правильно работать с процедурами, как правильно предавать в них значения и получать, есть ли какието стандарты или устоявшееся нормы на этот счет.