Реализовать сложение, вычитание, умножение многочленов - 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.