Помогите с командами условног перехода

Тема в разделе "WASM.BEGINNERS", создана пользователем Nomade, 24 дек 2011.

  1. Nomade

    Nomade New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2011
    Сообщения:
    1
    Уважаемые участники форума, прошу помочь решить задачу с лабораторной работы. Я новичок и не могу разобраться с командами условного перехода.
    Задача
    Вычислить функциии
    7*x+x*x-1 при x<10 и z=0
    5*y/z при x>5 и y=0
    5*x + 3*y +3 все стальные значения x,y,z
    (значения задаються в коде произвольно и изначально)
    Мои код
    То что получись написать без ошибок, но логика программы никуда не годиться, поэтому прошу помоши.
    Код (Text):
    1. data segment
    2.  x db 5
    3.  y db 3
    4.  z db 4  
    5.  f dw ?
    6. data ends
    7. ;code
    8. code segment
    9. assume cs:code, ds:data
    10. main:
    11.       mov ax, data
    12.       mov ds,ax
    13.      
    14.       mov al, x
    15.       cmp al , 10
    16.       jb f1
    17.       cmp al, 10
    18.       jg f3
    19.       mov  bl ,z
    20.       cmp bl , 0
    21.       je f1
    22.       cmp bl , 0
    23.       jne f3
    24.      
    25.       mov cl , x
    26.       cmp cl, 5
    27.       jg f2
    28.       cmp cl,5
    29.       jl f3
    30.       mov dl , y
    31.       cmp dl,0
    32.       je f2
    33.       cmp dl, 0
    34.       jne f3
    35.      
    36.              
    37.       ;f1
    38. f1:   mov al,7
    39.       mul x
    40.       mov bl, x
    41.       mul x
    42.       add al,bl
    43.       sub al,1
    44.      
    45.      
    46.       ;f2
    47. f2:   mov cl,5
    48.       mul y
    49.       mov dl,al
    50.       div z
    51.      
    52.      
    53.       ;f3
    54. f3:   mov al,5
    55.       mul x
    56.       mov bl,al
    57.       mov cl, 3
    58.       mul y
    59.       add cl , al
    60.       add al , 3
    61.  
    62. rs:
    63.  
    64.      mov ax,4c00h
    65.      int 21h
    66.  
    67.            
    68. code ends
    69.      end main
    Код написан и откомпелирован под TASM/TLINK
    Заранее спасибо.
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Непонятны (или неполны) условия.
    Что значит "х<10"? А может х быть "-5"?

    Если отрицательные значения будут, тогда используются инструкции
    JG/JL - переход если больше/переход если меньше.

    Если отрицательных нет, тогда используются инструкции
    JA/JB - переход если больше/переход если меньше.

    И дважды сравнивать не надо, можно переходить пару раз после одного сравнения:
    Код (Text):
    1.     cmp al, 10
    2.     jg  .GREATER
    3.     je  .EQUAL
    4.     ;
    5.     ; AL < 10 -- at this point
    6.     ;
    Совет: напиши логику на другом языке или на псевдо-языке и
    потом просто переведи на ассемблер.
    Например:
    Код (Text):
    1.     IF ((Z=0) AND (X<10)) GOTO F1
    2.     IF ((Y=0) AND (X>5)) GOTO F2
    3.  
    4. F3:
    5.  
    6.  
    7. F1:
    8.  
    9.  
    10. F2:
    На сложных условиях (там где более одного сравнивания) поставь метки:
    Кроме того, после вычисления F1,F2,F3 у тебя нет переходов на общую ветку
    и на пример после F1 код "упадёт" на F2, что неверно.
    Код (Text):
    1.     IF ((Z=0) AND (X<10)) GOTO F1
    2.  
    3. CHECK2:
    4.     IF ((Y=0) AND (X>5)) GOTO F2
    5.  
    6. F3:
    7.     ; calculation ...
    8.     jmp .done
    9.  
    10. F1:
    11.     ; calculation ...
    12.     jmp .done
    13.  
    14. F2:
    15.     ; calculation ...
    16.  
    17. .done:
    Далее просто: переводи условия последовательно.
    Например, если Z НЕ ноль, то переходим сразу на CHECK2.
    Иначе, проверка условия после "AND" и если оно истинно - тогда F1.

    И т.п.