Реализовать сложение, вычитание, умножение многочленов - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д