Отладка программы для инверсии строки

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

  1. Gin

    Gin New Member

    Публикаций:
    0
    Регистрация:
    12 май 2007
    Сообщения:
    2
    ;начало проги

    OutStr macro str ;макрос вывода строки
    push dx
    mov ah,09h
    lea dx,str
    int 21h
    pop dx
    endm
    ;--------
    .model small
    .code
    org 100h
    begin:
    jmp start
    ; описание переменных
    Return db '',10,13,'$'
    Hello db 'Vvedite stroku:',10,13,'$'
    param label byte ;Список параметров для int 21h
    maxlen db 32 ;Максимальная длина вводимой строки - 32 символа
    reallen db ? ;Реальная длина
    string db 32 dup (' '),'$' ;Введенные символы
    stringOut db 32 dup (' '),'$' ;Выводимые символы
    ;--------------------- начало программы
    start:

    OutStr Hello ;приглашение к вводу
    mov ah,0Ah ;функция DOS считывания строки, param - параметры ввода
    lea dx,param
    int 21h
    OutStr return ;перевод строки

    xor cx,cx
    xor ax,ax
    xor bx,bx ;bx - индекс очередного символа для обработки
    ;(равен cx(уменьшается) при считывании и увел. при записи в строку)

    mov cl,reallen ;в cx - размер строки для цикла обработки

    loopLabel:
    push bx ;сохраняем индекс записи
    mov bx,cx ;и записываем в bx индекс чтения
    mov al,string[bx]
    pop bx
    mov stringOut[bx],al ;запись в выходную строку
    inc bx ;увеличим индекс чтения
    dec cx
    cmp cx,0
    jge loopLabel

    OutStr stringOut ;вывод результата на экран
    ;[***выход***]
    exit:
    mov ax,4C00h
    int 21h

    END BEGIN
    ;конец проги
    ----
    P.s.: Скачал этот файл вместе с уже скомпилированным файлом, но не знаю
    как скомпилировать, т.к. выдаёт ошибки:
    warning A4023: with /coff switch,
    leading underscore required for
    start address: begin.
    Слышал, что нужен старый MASM32, т.к. в новом нельзя сделать com-файлы
    Пожалуйста, помогите отладить эту программу, чтобы компилировалась.
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Ты определись, старый или Masm32. Если старый, то он 6-й версии и уж точно не 32!
     
  3. NoResponse

    NoResponse New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2005
    Сообщения:
    89
    в любом случае лучше использовать последний ml.exe
    для доса старый link.exe, для винды новый link.exe
    P.S. - для библиотек (lib.exe) такая же ботва насколько помню
    ...или использовать fasm

    links.rar
     
  4. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Писал я как-то такую вещь:
    Код (Text):
    1.    mov cx,slr_len
    2.    mov si,offset source
    3.    mov di,end_of_destination
    4. label:
    5.    cld
    6.    lodsb
    7.    std
    8.    stosb
    9.    loop label
    Вроде меньше и быстее.
    Да и размещение данных посреди кода не есть хорошо. Помести их лучше после вызода из программы.
    Ассемблируй лучше TASM'ом, меньше проблем будет.
     
  5. MHajduk

    MHajduk New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    123
    Vov4ick
    Ловко сделано, :) но после этого кода надо ставить cld.
     
  6. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Одним байтом больше, одним меньше :derisive: Но можно и поменять местами, если критично:
    Код (Text):
    1. label:
    2.    lodsb
    3.    std
    4.    stosb
    5.    cld
    6.    loop label