Реализовать сложение, вычитание, умножение многочленов - Assembler

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

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

.model small
.stack 256
.386
.data
mes1 db 0Dh, 0Ah, 'Enter the degree: $'
mes2 db 0Dh, 0Ah, 'Enter the coef of x^$'
mes3 db ': $'
mes4 db 0Dh, 0Ah, 'Choose action: $'
mes5 db 0Dh, 0Ah, '= $'
polynom struc
    coef dw 256 dup ('0')
polynom ends
polynoms struc
    coefs dw 512 dup ('0')
polynoms ends
deg1 db 0
deg2 db 0
temp dw 0
signs db 0
pol1 polynom <>
pol2 polynom <>
res polynoms <>
.code
rchar proc
    mov ah, 1
    int 21h
    ret
rchar endp
wchar proc ; v AL dolzhen lezhat kod simvola
    push ax
    mov ah, 2
    mov dl, al
    int 21h
    pop ax
    ret
wchar endp
rnum proc ; v DX sohranyaetsa chislo
    push ax
    push bx
    push cx
    mov cx, 0
    mov bx, 1
    mov dx, 0
read:
    call rchar
    cmp al, 13
    je end_read
    cmp al, '-'
    je otr
    xor ah, ah
    sub al, '0'
    push ax
    inc cx
    jmp read
otr:
    mov signs, 1
    jmp read
end_read:
    pop ax
    mul bx
    add dx, ax
    mov ax, 10
    mul bx
    mov bx, ax
    loop end_read
    cmp signs, 1
    je change_sign
    jmp ender
change_sign:
    neg dx
ender:
    pop cx
    pop bx
    pop ax
    ret
rnum endp
wnum proc ; v AX dolzhno lezhat chislo
    push ax
    push bx
    push cx
    push dx
    test ax, ax
    js write_minus
    jmp write_num
write_minus:
    push ax
    push dx
    mov al, '-'
    call wchar
    pop dx
    pop ax
    neg ax
write_num:
    mov bl, 10
    mov cx, 0
divs:
    div bl
    add ah, '0'
    push ax
    inc cx
    cmp al, 0
    je end_div
    xor ah, ah
    jmp divs
end_div:
    pop ax
    mov al, ah
    call wchar
    loop end_div
    pop dx
    pop cx
    pop bx
    pop ax
    ret
wnum endp
input proc ; v BX dolzhen lezhat adres nachala polynoma, v AL - stepen polynoma
    push ax
    push bx
    push cx
    push dx
    xor ah, ah
    mov cx, ax
    inc cx
cycle:
    mov ah, 9
    lea dx, mes2
    int 21h
    xor ah, ah
    call wnum
    mov ah, 9
    lea dx, mes3
    int 21h
    call rnum
    xor ah, ah
    mov si, ax
    add si, si
    mov [bx + si], dx
    sub si, 2
    loop cycle
    pop dx
    pop cx
    pop bx
    pop ax
    ret
input endp
output proc ; v BX dolzhen lezhat adres nachala polynoma, v AX - stepen polynoma
    push ax
    push bx
    push cx
    push dx
    mov ah, 9
    lea dx, mes5
    int 21h
    mov cx, ax
    inc cx
    mov si, ax
    add si, si
cicl:
    mov ax, [bx + si]
    push bx
    push ax
    cmp ax, 0
    je skip
    test ax, ax
    jns write_plus
nazad:
    call wnum
    jmp sled
write_plus:
    mov al, '+'
    call wchar
    jmp nazad
sled:
    mov al, 'x'
    call wchar
    mov al, '^'
    call wchar
    pop ax
    mov bx, 2
    div bx
    call wnum
    sub si, 2
    pop bx
    loop cicl
    jmp rest
skip:
    sub si, 2
    pop ax
    pop bx
    loop cicl
rest:
    pop dx
    pop cx
    pop bx
    pop ax
    ret
output endp
start:
    mov ax, @data
    mov ds, ax
    mov ah, 9
    lea dx, mes1
    int 21h
    call rnum
    mov deg1, dl
    lea bx, pol1.coef
    mov al, deg1
    call input
    mov ah, 9
    lea dx, mes1
    int 21h
    call rnum
    mov deg2, dl
    lea bx, pol2.coef
    mov al, deg2
    call input
    mov ah, 4ch
    int 21h
end start
необходимо реализовать сложение, вычитание, умножение многочленов с помощью структур. Самая сложная часть сделана, осталось добавить только сами операции. Проблема в том, что программа работает неправильно на этапе ввода коэффициентов. Сначала выводится строка с предложением ввести степень. Пока что все нормально. Потом выводится строка с предложением ввести коэффициент x^36. Причем неважно, что было нажато до этого. Всегда выводится x^36. Затем все повторяется, но уже для второго полинома. В чем может быть ошибка?
Прогнал программу через дебаггер. Почему-то процедура rnum не изменяет значение регистра dx. В нем как был 0, так и остается. В ax изначально было 0924. После mov al, dl значение меняется на 0900. Это и есть 36. Вопрос: почему процедура не меняет значение регистра dx?
После выполнения команды в 63 строке dx обнуляется. Почему - неизвестно. Попробую обойти проблему при помощи стека.

Решение задачи: «Реализовать сложение, вычитание, умножение многочленов»

textual
Листинг программы
add res3.coef[si][bx - 2], ax

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

  1. В данном коде выполняется сложение.
  2. res3.coef - это переменная, которая содержит многочлен.
  3. si и bx - это индексы массива, которые используются для доступа к конкретному элементу многочлена.
  4. ax - это второй операнд, который также является многочленом.
  5. Результат сложения сохраняется в переменной res3.coef.

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

15   голосов , оценка 3.867 из 5