интерфейс на MASM

Тема в разделе "WASM.BEGINNERS", создана пользователем winnix, 10 дек 2008.

  1. winnix

    winnix New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    22
    Здравствуйте всем.
    Написал программу сортировки массива слов без знака...нужно было оформить макрокомандой.
    Код (Text):
    1. NAME SORT
    2.     LENGTHMAS1=0
    3.     LENGTHMAS2=0
    4.    
    5. DATA SEGMENT
    6.     MAS1 DW 3,4,2,5,1,8,6,2,11,9,0daeh
    7.     ENDMAS1  LABEL WORD
    8.     LENGTHMAS1 = (offset ENDMAS1 - offset MAS1)/type MAS1
    9.     MAS2 DW 3,1,12,2,7,3,8,2,5,1
    10.     ENDMAS2  LABEL WORD
    11.     LENGTHMAS2 = (offset ENDMAS2 - offset MAS2)/type MAS2
    12.     tmp  DW 0
    13.     I   DW 0
    14.     J   DW 0
    15.     FL  DW 0
    16. DATA ENDS
    17.  
    18. STACK SEGMENT STACK
    19.       DW 16 DUP(?)
    20.  STKTOP LABEL WORD
    21. STACK ENDS
    22.  
    23. CODE SEGMENT
    24.           ASSUME CS:CODE,DS:DATA,SS:STACK
    25.  
    26. SORTMAS MACRO MAS,maslen
    27.       LOCAL internal,exchange,lesser,cycl_j,sorten
    28.       mov CX,maslen-1
    29.       mov FL,0
    30.       mov   i,0         ;инициализация i
    31.                                         ;внутренний цикл по j
    32. internal:
    33.       mov   j,CX            ;инициализация j
    34. mov FL,0
    35.       jmp   cycl_j              ;переход на тело цикла
    36. exchange:
    37.       mov   bx,i                ;bx=i
    38.       shl   bx,1
    39.       mov   ax,mas[bx]          ;ax=mas[i]
    40.       mov   bx,j                ;bx=j
    41.       shl   bx,1
    42.       cmp   ax,mas[bx]          ;mas[i] ? mas[j] — сравнение элементов
    43.       jle   lesser              ;если mas[i] меньше, то обмен не нужен и
    44.                                     ;переход на продвижение далее по массиву
    45.                                         ;иначе tmp=mas[i], mas[i]=mas[j], mas[j]=tmp:
    46.                                         ;tmp=mas[i]
    47.       mov   bx,i                ;bx=i
    48.           shl   bx,1                ;умножаем на 2, так как элементы — слова
    49.       mov   tmp,ax              ;tmp=mas[i]
    50.  
    51.                                         ;mas[i]=mas[j]
    52. mov FL,2
    53.       mov   bx,j                ;bx=j
    54.       shl   bx,1                ;умножаем на 2, так как элементы — слова
    55.       mov   ax,mas[bx]          ;ax=mas[j]
    56.       mov   bx,i                ;bx=i
    57.       shl   bx,1                ;умножаем на 2, так как элементы — слова
    58.       mov   mas[bx],ax          ;mas[i]=mas[j]
    59.  
    60.                                         ;mas[j]=tmp
    61.       mov   bx,j                ;bx=j
    62.       shl   bx,1                ;умножаем на 2, так как элементы — слова
    63.       mov   ax,tmp              ;ax=tmp
    64.       mov   mas[bx],ax          ;mas[j]=tmp
    65.  lesser:                    ;продвижение далее по массиву во внутреннем цикле
    66.       dec   j           ;j--
    67.                                         ;тело цикла по j
    68.  cycl_j:
    69.       mov   ax,j                ;ax=j
    70.       cmp   ax,i                ;сравнить j ? i
    71.       jg    exchange            ;если j>i, то переход на обмен
    72.       cmp FL,1          ;FL<1 то выход из обработки
    73.           jl sorten
    74.                                         ;иначе на внешний цикл по i
    75.  
    76.       inc   i           ;i++
    77.       cmp   i,CX            ;сравнить i ? n — прошли до конца массива
    78.       jl    internal
    79. sorten: nop
    80.  
    81.  
    82.  
    83. ENDM
    84.  
    85. START: MOV AX,DATA
    86.        MOV DS,AX
    87.        MOV AX,STACK
    88.        MOV SS,AX
    89.        LEA SP,STKTOP
    90.  
    91.        SORTMAS MAS1,LENGTHMAS1
    92.        SORTMAS MAS2,LENGTHMAS2
    93. CODE ENDS
    94.      END START
    Теперь нужно сделать для этой программы интерфейс по минимуму:вывод формулировки задачи, ввод массива СЛОВ,проверка на правильность ввода(при не корректном вводе выводиться соответствующее сообщение) и вывод результата.

    Заранее спасибо.
     
  2. Clear_Energy

    Clear_Energy Алексей

    Публикаций:
    0
    Регистрация:
    3 ноя 2008
    Сообщения:
    375
    командную строку или окно?
     
  3. winnix

    winnix New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    22
    ээ...ну чтобы в дос окне вводить
     
  4. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Clear_Energy
    это DOS'овский сорец.

    Есть 3 метода, вывода информации:
    1. Через прерывания самой DOS.
    2. Через прерывания BIOS.
    3. Прямая запись в видеопамять (самый быстрый метод).

    Есть 3 метода, получения информации с клавиатуры:
    1. Через прерывания DOS.
    2. Через прерывания BIOS.
    3. Через прямую работу с портами ввода/вывода (самый быстрый метод).
     
  5. Clear_Energy

    Clear_Energy Алексей

    Публикаций:
    0
    Регистрация:
    3 ноя 2008
    Сообщения:
    375
    Чиай тему
    Я там все ссылки давал - и по прерываниям и по досу...
     
  6. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Средства DOS:
    Вывод на экран в текстовом режиме:
    Функция DOS 02h и 06h: Вывод символа
    Вход: ah - 06h
    dl - ASCII-код символа (кроме 0FFh)

    Код (Text):
    1.     mov ah, 02h
    2.     mov dl, 'A'
    3.     int 21h
    Функция DOS 09h: Вывод строки заканчивающейся символом $(24h)
    Вход: ah - 09h
    ds:dx - адрес строки.

    Код (Text):
    1.     mov ah, 09h
    2.     mov dx, offset mystr ; ds указывает на начало data секции.
    3.     int 21h
    Ввод с клавиатуры:
    Функция DOS 0Ah: Считать строки символов из STDIN в буфер
    Вход: ah - 0Ah
    ds:dx - адрес буфера
    Код (Text):
    1.     mov ah, 0Ah
    2.     mov dx, offset mybuff
    3.     int 21h
     
  7. winnix

    winnix New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    22
    Я не могу понять как мне ввести/вывести массив слов ...объясните пожалуйста...эти функции в Абеле читал но так ничего и не получилось...
     
  8. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    winnix
    так вы имеете ввиду как представить числовое значение ввиде ASCII-символов?
    Если так, то ищите на форуме, здесь публиковалась процедура. Или взгляните на штатный сорец из пакета masm32, вроде wtoa называется.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    winnix
    https://www.wasm.ru/forum/viewtopic.php?id=17962
    замечание насчет заголовка темы
     
  10. winnix

    winnix New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    22
    да что то в этом роде...Я не знаю как записать символы правильно...напишите пример ввода одного символа (слова) и вывода его на экран...дос прерыванием..а дальше по примеру попробую разобраться...
    Заранее спасибо.
     
  11. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    winnix
    вот сорцы из masm32.

    двоичное представление в ASCII-строку:
    Код (Text):
    1. dwtoa proc dwValue:DWORD, lpBuffer:DWORD
    2.        
    3.     ; -------------------------------------------------------------
    4.     ; convert DWORD to ascii string
    5.     ; dwValue is value to be converted
    6.     ; lpBuffer is the address of the receiving buffer
    7.     ; EXAMPLE:
    8.     ; invoke dwtoa,edx,ADDR buffer
    9.     ;
    10.     ; Uses: eax, ecx, edx.
    11.     ; -------------------------------------------------------------
    12.  
    13.     push ebx
    14.     push esi
    15.     push edi
    16.  
    17.     mov eax, dwValue
    18.     mov edi, [lpBuffer]
    19.  
    20.     or eax,eax
    21.     jnz sign
    22.    
    23.   zero:
    24.     mov word ptr [edi],30h
    25.     jmp dw2asc
    26.    
    27.   sign:
    28.     jns pos
    29.     mov byte ptr [edi],'-'
    30.     neg eax
    31.     inc edi
    32.  
    33.   pos:      
    34.     mov ecx,429496730
    35.     mov esi, edi
    36.  
    37.     .while (eax > 0)
    38.       mov ebx,eax
    39.       mul ecx
    40.       mov eax,edx
    41.       lea edx,[edx*4+edx]
    42.       add edx,edx
    43.       sub ebx,edx
    44.       add bl,'0'
    45.       mov [edi],bl
    46.       inc edi
    47.     .endw
    48.  
    49.     mov byte ptr [edi], 0       ; terminate the string
    50.  
    51.     ; We now have all the digits, but in reverse order.
    52.  
    53.     .while (esi < edi)
    54.       dec edi
    55.       mov al, [esi]
    56.       mov ah, [edi]
    57.       mov [edi], al
    58.       mov [esi], ah
    59.       inc esi
    60.     .endw
    61.  
    62.     dw2asc:
    63.  
    64.     pop edi
    65.     pop esi
    66.     pop ebx
    67.  
    68.     ret
    69.  
    70. dwtoa endp
    ASCII-строку в двоичное представление:
    Код (Text):
    1. atodw proc String:DWORD
    2.  
    3.   ; ----------------------------------------
    4.   ; Convert decimal string into dword value
    5.   ; return value in eax
    6.   ; ----------------------------------------
    7.  
    8.     push esi
    9.     push edi
    10.  
    11.     xor eax, eax
    12.     mov esi, [String]
    13.     xor ecx, ecx
    14.     xor edx, edx
    15.     mov al, [esi]
    16.     inc esi
    17.     cmp al, 2D
    18.     jne proceed
    19.     mov al, byte ptr [esi]
    20.     not edx
    21.     inc esi
    22.     jmp proceed
    23.  
    24.   @@:
    25.     sub al, 30h
    26.     lea ecx, dword ptr [ecx+4*ecx]
    27.     lea ecx, dword ptr [eax+2*ecx]
    28.     mov al, byte ptr [esi]
    29.     inc esi
    30.  
    31.   proceed:
    32.     or al, al
    33.     jne @B
    34.     lea eax, dword ptr [edx+ecx]
    35.     xor eax, edx
    36.  
    37.     pop edi
    38.     pop esi
    39.  
    40.     ret
    41.  
    42. atodw endp
     
  12. winnix

    winnix New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    22
    Спасибо большое...буду разбираться...)
     
  13. winnix

    winnix New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    22
    Написал ввод,вывод что то не работает...В досе выводит 2 строки неизвестных символов и все.виснет.Данные записываю в массив слов.что то не работает даже вывод вводимого одного числа..
    ввод и вывод делал так
    Код (Text):
    1.  
    2. MOV  AH,0AH         ;Запрос функции ввода
    3. LEA  DX,NAMEPAR     ;Загрузить адреса списка параметров
    4. INT  21H            ;Вызвать DOS
    5. MOV  AH,09          ;Запрос вывода на экран
    6. LEA  DX,NAMEFLD     ;Загрузка адреса сообщ.
    7. INT  21H            ;Вызов DOS
    вообще не могу разобраться как тут все...
    А как проверку быструю сделать что число(слово) является числом а не набором символов?
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    winnix
    с таким ником а DOSом занимаешся :))
    надеюсь адрес в NAMEFLD это адрес NAMEPAR + 2?
    а кто завершающий символ "$" в выводимую строку добавлять будет?
     
  15. winnix

    winnix New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    22
    А что с ником нетак?=))так учусь...заставляют...
    Вот так вот сделано
    Код (Text):
    1.           NAMEPAR     LABEL     BYTE               ;Список параметров:
    2.           MAXLEN      DB        20                     ; Максимальная длина
    3.           ACTLEN      DB        ?                       ; Реальная длина
    4.           NAMEFLD     DB        20 DUP (' '),'$'
    если не работает значит сделано что то не верно...
     
  16. winnix

    winnix New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    22
    это для байт ...для слов не знаю как вводить слова или записывать нужно в слова...не могу разобраться...Лучше объясните для слов...пожалуйста
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    winnix
    попробуй заменить
    LEA DX, ...
    на
    mov dx, offset ...
    хотя странно, вроде всё правильно написано (запускать код под дос лень :), сегментный регистр ds надеюсь правильно настроен?
    И это не для байт, а для символов вводимых с клавиатуры, эти символы могут быть цифрами и должны корректно вводится/выводиться, но это не числа которые можно складывать, умножать и т.п. ;))
     
  18. winnix

    winnix New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    22
    так mov dx, offset... это тоже самое что и lea dx,...нужно что нить еще поделать...говорят не очень сложно сделать...а вот что то не получается...будем разбираться)