Организация условных переходов. Ввод и вывод информации - Assembler

Узнай цену своей работы

Формулировка задачи:

Когда записать a=2 и b=3 (a<b) выводит 21844. Почему? Как это исправить и что сделать, чтобы выполнялось условие задания?
.MODEL SMALL
.STACK 100h
.DATA
    EnterA DB 'Please , enter A',13,10,'$'
    EnterB DB 'Please , enter B',13,10,'$'
    Result DB 'X= ',7,7,'$'
    Error DB "Incorrect number$"
    Buff    DB 6,7 Dup(?)
    C10 DB 10
.CODE
START:

    mov ax,@data
    mov ds,ax
    
    mov ah,9
    mov dx,OFFSET EnterA
    int 21h
    
    call InputInt
    
    push ax
    
    mov ah,9
    mov dx,OFFSET EnterB
    int 21h
    
    call InputInt
    
    pop bx
    
    cmp ax, bx
    
    je one
    jb two
    ja thre
 
re: 
    push ax
    mov ah,9
    mov dx,OFFSET Result
    int 21h
    xor ax,ax
    pop ax
    call OutInt
    
    mov ah,4ch
    int 21h

one: 
    mov ax, -2
    jmp re
two:
    add ax ,2
    idiv ax
    jmp re
thre:
    sub ax ,5
    idiv bx 
    jmp re

OutInt proc 
   test   ax, ax
   jns     oi1
 
   mov  cx, ax
   mov     ah, 02h
   mov     dl, '-'
   int     21h
   mov  ax, cx
   neg     ax
oi1:  
    xor     cx, cx
    mov     bx, 10 
oi2:
    xor     dx,dx
    div     bx
 
    push    dx
    inc     cx ; кількість цифр
 
    test    ax, ax
    jnz     oi2
 
    mov     ah, 02h
oi3:
    pop     dx
    add     dl, '0'
    int     21h
    loop    oi3
    
    ret
 
OutInt endp 

InputInt proc 
 
    mov ah,0ah
    xor di,di
    mov dx,offset Buff 
    int 21h 
    mov dl,0ah
    mov ah,02
    int 21h 

    mov si,offset Buff+2 
    cmp byte ptr [si],"-" 
    jnz ii1
    mov di,1 
    inc si   
ii1:
    xor ax,ax
    mov bx,10  
ii2:
    mov cl,[si] 
    cmp cl,0dh  
    jz endin

    cmp cl,'0'  
    jl er
    cmp cl,'9'  
    ja er
 
    sub cl,'0'
    mul bx    
    add ax,cx  
    inc si     
    jmp ii2   
 
er: 
    mov dx, offset Error
    mov ah,09
    int 21h
    mov ah,4ch
    int 21h

endin:
    cmp di,1
    jnz ii3
    neg ax   
ii3:
    ret
InputInt endp
    
END START

Решение задачи: «Организация условных переходов. Ввод и вывод информации»

textual
Листинг программы
    call    GetInt
 
    pop bx
 
    cmp bx, ax
 
    je  one
    jns two
;   jb  thre
thre:
    xchg    ax, bx
    sub ax, 5
    cwd
    idiv    bx
;   jmp re
 
re:
    push    ax
    mov ah,9
    mov dx,OFFSET Result
    int 21h
    xor ax,ax
    pop ax
    call    OutInt
 
    mov ah,4ch
    int 21h
 
 
one:
    mov ax, -2
    jmp re
two:
    add ax, 2
    cwd
    idiv    bx
    jmp re

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

В этом коде организованы условные переходы. Вот список действий:

  1. Вызов функции GetInt (предположительно, это функция, которая получает целочисленный ввод от пользователя).
  2. Изъятие значения из регистра BX.
  3. Сравнение значения в регистрах BX и AX.
  4. Если BX меньше AX, то переход к метке one.
  5. Если BX больше или равно AX, то переход к метке two.
  6. Если BX больше AX, то переход к метке thre.
  7. Обмен значений в регистрах AX и BX.
  8. Вычитание 5 из значения в регистре AX.
  9. Преобразование значения в регистре AX в слово с использованием CWD.
  10. Деление значения в регистре AX на значение в регистре BX с использованием IDIV.
  11. Переход к метке re.
  12. Push значение в регистре AX.
  13. Mov значение -2 в регистр AX для обработки случая, когда BX меньше AX.
  14. Переход к метке re.
  15. Add значение 2 к значению в регистре AX.
  16. CWD.
  17. IDIV значение в регистре BX.
  18. Переход к метке re.
  19. Вывод результата ввода с использованием функции OutInt.
  20. Вывод сообщения об успешном выполнении программы с использованием функции OutString.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.833 из 5
Похожие ответы