Решение СЛАУ в 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
Объяснение кода листинга программы
- Вначале происходит уменьшение значения указателя стека и запись содержимого регистра ax в вершину стека: push ax
- Затем выполняется сравнение содержимого регистра ax со значением 0: cmp ax, 0
- Если содержимое регистра ax не равно 0, то происходит переход к метке @plus: jns @plus
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д