Реализовать сложение, вычитание, умножение многочленов - 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
Прогнал программу через дебаггер. Почему-то процедура rnum не изменяет значение регистра dx. В нем как был 0, так и остается. В ax изначально было 0924. После mov al, dl значение меняется на 0900. Это и есть 36.
Вопрос: почему процедура не меняет значение регистра dx?
После выполнения команды в 63 строке dx обнуляется. Почему - неизвестно. Попробую обойти проблему при помощи стека.
Решение задачи: «Реализовать сложение, вычитание, умножение многочленов»
textual
Листинг программы
add res3.coef[si][bx - 2], ax
Объяснение кода листинга программы
- В данном коде выполняется сложение.
res3.coef
- это переменная, которая содержит многочлен.si
иbx
- это индексы массива, которые используются для доступа к конкретному элементу многочлена.ax
- это второй операнд, который также является многочленом.- Результат сложения сохраняется в переменной
res3.coef
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д