Reverse введенную строку, 16-bit DOS, real-mode

Тема в разделе "WASM.BEGINNERS", создана пользователем Dmitri, 18 сен 2005.

  1. Dmitri

    Dmitri New Member

    Публикаций:
    0
    Регистрация:
    1 сен 2004
    Сообщения:
    15
    Приветствую!



    Я новичок в программировании на ассемблере, поэтому прошу помощи у вас, опытных программистов дзена: посмотрите на следующий код и скажите, как можно его написать по-нормальному (это расплывчатое понятие, но я знаю, что приведенный код может быть написан короче, яснее, эффективнее).



    Условие: to reverse введенную строку, 16-bit DOS, real-mode



    Примечание: если количество введенных пользователем символов нечетно, то программа выполняет на один цикл меньше, чем нужно. Я не знаю, как округлять в большую сторону cx при выполнении shr cx, 1.




    Код (Text):
    1. data_seg segment para public
    2.     message db "Please enter a string", 13, 10, "$"
    3.     string db 256 dup (?)
    4. data_seg ends
    5.  
    6. stack_seg segment para stack
    7.     db 256 dup (?)
    8. stack_seg ends
    9.  
    10. code_seg segment para public
    11.  
    12.     main proc
    13.         assume ds:data_seg, ss:stack_seg, cs:code_seg
    14.         mov ax, data_seg
    15.         mov ds, ax
    16.         mov ax, stack_seg
    17.         mov ss, ax
    18.        
    19.         mov ah, 09h
    20.         mov dx, offset message
    21.         int 21h
    22.        
    23.         call input
    24.         call reverse
    25.         call output
    26.        
    27.         mov ah, 4ch
    28.         int 21h
    29.     main endp
    30.    
    31.     input proc
    32.         mov ah, 3Fh
    33.         mov bx, 0000h
    34.         mov cx, 00FFh
    35.         mov dx, offset string
    36.         int 21h
    37.         ret
    38.     input endp
    39.    
    40.     output proc
    41.         mov ah, 40h
    42.         mov bx, 01
    43.         mov cx, 00FFh
    44.         mov dx, offset string
    45.         int 21h
    46.         ret
    47.     output endp
    48.    
    49.     reverse proc
    50.         mov cx, ax
    51.         shr cx, 1
    52.         mov bx, dx
    53.         add ax, bx
    54.         dec ax
    55.         add bx, cx             
    56.         sub ax, cx
    57.         mov si, ax
    58.         step:
    59.             mov dl, byte ptr [bx]
    60.             xchg dl, byte ptr [si]
    61.             mov byte ptr [bx], dl
    62.             dec bx
    63.             inc si
    64.         loop step
    65.         ret
    66.     reverse endp
    67.        
    68. code_seg ends
    69.  
    70. end main
     
  2. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87
    Код (Text):
    1.  
    2. @@ -48,6 +48,7 @@
    3.        
    4.         reverse proc
    5.                 mov cx, ax
    6. +               inc cx
    7.                 shr cx, 1
    8.                 mov bx, dx
    9.                 add ax, bx
    10.  
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    > "если количество введенных пользователем символов нечетно, то ..."

    Тут счетчик вообще не нужен:
    Код (Text):
    1.     ;dx = offset string, ax - длина
    2.     lea bx,[dx+ax-1]
    3. step:
    4.     mov al,[dx]
    5.     mov cl,[bx]
    6.     mov [bx],al
    7.     mov [dx],cl
    8.     inc dx
    9.     dec bx
    10.     cmp bx,dx
    11.     jg step
    PS: xchg с памятью - страшный тормоз