Заменил цикл на процедуру ,почему не нужен счетчик CX

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

  1. Exorcist

    Exorcist New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2008
    Сообщения:
    12
    Вот вопросик.
    Сначала была программа написал на основе цикла

    Код (Text):
    1. masm
    2. model   small
    3. .stack  128
    4. .data
    5. mess1   db      0Ah,0Dh
    6.               db      '        O D I T S Z   A   P   C', 0Ah,0Dh        
    7.               db      '        F F F F F F * F * F * F', 0Ah,0Dh        
    8.               db      '_______________________________'        
    9.               db      0Ah,0Dh,'$'
    10. .code
    11. myproc  proc            
    12. assume  CS:@code, DS:@data, SS:@stack
    13.         mov     AX,@data
    14.         mov     DS,AX
    15.         lea     DX,mess1   
    16.         mov     AH,09h     
    17.         int     21h
    18.         sub     AX,AX    
    19.                        
    20.         sub     Ax,1
    21.         pushf          
    22.         pop     BX     
    23.        mov Cx,10
    24. p1:     rol     BX,1   
    25.                          
    26.         mov     AL,BL      
    27.         and     AL,1    
    28.         or      AL,30h       
    29.         mov     DL,AL      
    30.         mov     AH,2   
    31.         int     21h
    32.         mov     DL,' '
    33.         mov     AH,2
    34.         int     21h
    35.         dec  CX
    36.         cmp     CX,0
    37.         jne  p1    
    38.        ;loop    p1
    39.         mov     AX,4C00h
    40.         int     21h
    41. myproc  endp
    42.         end     myproc
    Потом сделал на основе процедуры и call
    Код (Text):
    1. masm
    2. model   small
    3. .stack  128
    4. .data
    5. mess1   db      0Ah,0Dh
    6.               db      '        O D I T S Z   A   P   C', 0Ah,0Dh        
    7.               db      '        F F F F F F * F * F * F', 0Ah,0Dh        
    8.               db      '_______________________________'        
    9.               db      0Ah,0Dh,'$'
    10. .code
    11. myproc  proc            
    12. assume  CS:@code, DS:@data, SS:@stack
    13.         mov     AX,@data
    14.         mov     DS,AX
    15.         lea     DX,mess1   
    16.         mov     AH,09h     
    17.         int     21h
    18.         sub     AX,AX    
    19.                    
    20.         add     Ax,3
    21.         pushf          
    22.         pop     BX     
    23.        mov cx,10
    24. p1: call outflags
    25.         loop   p1
    26.  
    27.         mov     AX,4C00h
    28.         int     21h
    29.  
    30. myproc endp
    31. outflags  proc
    32.         rol     BX,1
    33.                                            
    34.         mov     AL,BL      
    35.         and     AL,1    
    36.         or      AL,30h       
    37.         mov     DL,AL      
    38.         mov     AH,2   
    39.         int     21h
    40.         mov     DL,' '
    41.         mov     AH,2
    42.         int     21h
    43.          ret        
    44. outflags endp
    45.        
    46.         end     myproc
    Я убрал декрементирование CX и счетчик CX( mov CX,10) . по Идеи должно зацикливаться. или call както влияет на счётчик? можете объяснить?
     
  2. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    CALL на CX никак не влияет, а вот int 21h вполне может влиять. Юзай Turbo Debugger - очень полезно.
     
  3. Exorcist

    Exorcist New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2008
    Сообщения:
    12
    Ну да . TD юзаю , он один раз выполяет call и вылетает. при цилке хоть видно что счётчик уменьшаеться.
    Хм.Как именно 21h может влияеть на CX.
     
  4. Exorcist

    Exorcist New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2008
    Сообщения:
    12
    Если убрать mov cx,10 то программа уже не корректна работает.
    Так значит где то автоматически декрементируеться cx.
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Exorcist
    когда что-то каллиш, это может потрещить твои регистры.
    если не уверен что вызываемый не потрещит - сохраняй перед вызовом.
     
  6. Exorcist

    Exorcist New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2008
    Сообщения:
    12
    хм,ну а почему же нам не надо в процедуре ставить dex cx. ?
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Exorcist
    изучи мануалы по комманде LOOP
     
  8. Jes

    Jes New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    3
    Декремент СХ убрал, а вот mov CX,10 у тебя осталось...обе программы написаны на основе цикла, просто LOOP сравнивает СХ с 0 и если СХ>0 то декрементит его и скачет на метку.
    У тебя ж в первом сорсе стоит в комментах ;loop -раскомменть и удали 3 предыдущие строки-получишь тот же результат
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Exorcist
    Понаписали!!! Команда loop работает с регистром CX. Она его декрементирует. Или счетчик тебе святой дух обеспечит :)
    Кстати, декремент с проверкой эффективнее loop.