Решение СЛАУ в TASM - Assembler

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

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

Помогите решить проблему с выводом условия при a>b и a<b. С a=b вывод работает нормально. При вводе значений a>b код залипает и не выводит результат, аналогичная ситуация с выводом результата при a<b.Вот код:
;(a-b)/a-3 , a>b
;2        , a=b
;(a*a*a+1)/b   , a<b
 
.MODEL small
.Stack 100h
 
.data
    a dw ?
    b dw ?
    h dw 2
    z dw ?  
    mess db 'Error! Devide by zero.$'
    zavd db "(a-b)/a-3 , a>b",0dh,0ah, "2        , a=b" ,0dh,0ah, "(a*a*a+1)/b   , a<b",0dh,0ah,0dh,0ah, '$'
    a1 db "a=4",0dh,0ah,'$'
    b1 db "b=10",0dh,0ah,0dh,0ah,'$'
 
.code
Begin:
    mov ax, @data
    mov ds,ax
        
        mov ah,01h
        int 21h
        mov a,al
        xor al,al
 
        mov ah,01h
        int 21h
        mov b,al
        xor al,al
 
    mov ah, 9h
    mov dx, offset zavd
    int 21h
    mov dx, offset a1
    int 21h
    mov dx, offset b1
    int 21h
 
    mov ax,a
    cmp ax,b
    jl @menshe          ; перехід на @menshe якщо a<b
    jg @bilshe          ; перехід на @bilshe якщо a>b
 
    ;a=b
    mov ax, h
    mov z,ax
    jmp @main           ; прямий перехід на @main
 
    ;a<b
    @menshe:
    cmp b,0             
    je @err
    mov ax,a
    cwd
    imul a
    cwd
    imul a
    adc ax,1
    cwd
    idiv b
    mov z, ax
    jmp @main           ; прямий перехід на @main
 
    ;a>b
    @bilshe:
    cmp a,0
    je @err
    mov ax,a
    sbb ax,b
    cwd
    idiv a
    sbb ax, 3
    mov z, ax
    jmp @main           ; прямий перехід на @main
 
    @main:
    xor ax,ax           ; очистка (приймлальник:джерело) якщо значення різні то записується в приймальник 1 в інших випадках 0
    mov ax,z
    push ax             ; уменьшить значение указателя стека и записать ax в вершину стека
    cmp ax, 0           ; сравнение ax и 0
    jns @plus           ; переход в @plus если знак плюс (знаковый (старший) бит результата равен 0)
    
    mov dl, '-'
    mov ah, 02h         ; вивід
    int 21h
    pop ax              ; загрузить в приемник содержимое вершины стека
    neg ax              ; выполнить вычитание (0 – источник) и поместить результат на место источника;
 
    @plus:
    xor cx, cx          ; очистка (приймлальник:джерело) якщо значення різні то записується в приймальник 1 в інших випадках 0
    mov bx,10           ; помістити в bx 10 (система числення)
 
    @dvsn:
    xor dx,dx           ; очистка (приймлальник:джерело) якщо значення різні то записується в приймальник 1 в інших випадках 0
    div bx              ; 
    push dx             ; уменьшить значение указателя стека и записать ax в вершину стека
    inc cx              ; увеличение значения cx на 1 (треба для loop)
    test ax,ax              ; логічне множення бит результата равен 1, если соответствующие биты операндов равны 1, в остальных случаях бит результата равен 0;
    jnz short @dvsn         ; якщо знаменник <> 0
    
    mov ah,02h              ; вивід
 
    @vivod: 
    pop dx                  ; загрузить в приемник содержимое вершины стека
    add dl, 30h             ; +30
    int 21h
    loop @vivod             ; выполнить декремент содержимого регистра ecx/cx; 
                            ;анализ регистра ecx/cx: 
                                ;если ecx/cx=0, передать управление следующей за loop команде;
                                ;если ecx/cx=1, передать управление команде, метка которой указана в качестве операнда loop.
    jmp @end                ; перехід на мітку
 
    @err:                   ; помилка виконання програми, знаменник = 0
    mov dx, offset mess
    mov ah, 09h
    int 21h
 
    @end:
    mov ax,4c00h            ; успішне завершення програми
    int 21h
end Begin

Решение задачи: «Решение СЛАУ в TASM»

textual
Листинг программы
   push ax             ; уменьшить значение указателя стека и записать ax в вершину стека
    cmp ax, 0           ; сравнение ax и 0
    jns @plus

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

  1. Вначале происходит уменьшение значения указателя стека и запись содержимого регистра ax в вершину стека: push ax
  2. Затем выполняется сравнение содержимого регистра ax со значением 0: cmp ax, 0
  3. Если содержимое регистра ax не равно 0, то происходит переход к метке @plus: jns @plus

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


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

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

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