Не пойму где ошибка в программе - Assembler
Формулировка задачи:
Суть проблемы в том, что, ошибок в примере нету (в программе Far Менеджер, показывало, что нету их), но результаты не сходятся (вычислял пример сам и смотрел в программе Far), но я не могу понять, почему так получается и как исправить это?
Сама задача вот: Вычислить -2с-23d / (a/4)-1; a,c,d ввести с клавиатуры.
А вот и программа:
S Segment stack
db 128 dup (?)
S ENDS
DDD Segment
coc1 db 3
coc2 db 4
r1 db (?)
r2 db (?)
r3 db (?) ;резервные ячейки
r4 db (?)
r5 db -2
a db 3,(?),3 dup (?)
c db 3,(?),3 dup (?) ;буфер для ввода с клавиатуры
d db 3,(?),3 dup (?)
a1 db 0dh,0ah,'введите a,$'
c1 db 0dh,0ah,'введите c,$'
d1 db 0dh,0ah,'введите d,$'
DDD ENDS
CCC Segment
assume ds:ddd,cs:ccc,ss:s
Start:
Mov ax,ddd ;перенос адреса сигмента данных в ds
Mov ds,ax
Lea dx,a1
Mov ah,9AH
int 21H ;вывод строки a1
Lea dx,a
Mov ah,0AH
int 21H ;ввод a
xor ax,ax
Mov si,1
Mov cx,3 ;задание цикла для перевода a
cmp a[si],2
jne m1
inc si
m1: Mov ah,a[si]
inc si
Mov al,a[si]
and ax,0f0fh
aad
Mov r1,al ;перевод числа a
Lea dx,c1
Mov ah,9H
int 21H ;вывод строки c1
Lea dx,c
Mov ah,0AH
int 21H ;ввод c
xor ax,ax
Mov si,1
Mov cx,3 ;задание цикла для перевода c
cmp c[si],2
jne p1
inc si
p1: Mov ah,c[si]
inc si
Mov al,c[si]
and ax,0f0fh
aad
Mov r2,al ;перевод числа c
Lea dx,d1
Mov ah,9H
int 21H ;вывод строки d1
Lea dx,d
Mov ah,0AH
int 21H ;ввод d
Mov si,1
Mov cx,4 ;задание цикла для перевода d
cmp d[si],2
jne v1
inc si
v1: Mov ah,d[si]
inc si
Mov al,d[si]
and ax,0f0fh
aad
Mov r3,al ;перевод d
Mov al,d[si]
and ax,0f0fh
aad
Mov r4,al ;перенос d
Mov AL,r3
Imul r5
Mov bp,ax ;перенос -2c в регистр bp
xor ax,ax ;обнуляем ax
Mov al,r4 ;перенос d в регистр ax
Mul coc1 ;умножаем d на 23
Mov ah,0 ;обнуляем старшую часть ax
Sub bp,ax ;перенос результата в регистр bl
xor ax,ax ;обнуляем ax
Mov al,r1 ;перенос a в регистр ax
div coc2 ;деление a на 4 результат в AL
Mov dl,r2 ;перенос b в регистр dx
Sub al,dl ;1 минус AL
xor ax,ax ;обнуляем ax
Mov ax,bp ;перенос bp в регистр ax
IDiv dl ;делим ax на dl
Mov ax,4C00H
Int 21H
CCC ENDS
END StartРешение задачи: «Не пойму где ошибка в программе»
textual
Листинг программы
;Вычислить -2с-23d/(a/4)-1; a,c,d ввести с клавиатуры. stak segment stack db 128 dup (?) stak ends data segment a2 db (?) c2 db (?) d2 db (?) a_a dw 0 c_c dw 0 d_d dw 0 vvod db 4 line db ? chislo db 3 dup (?) a1 db 0dh,0ah,'введите a,$' c1 db 0dh,0ah,'введите c,$' d1 db 0dh,0ah,'введите d,$' otvet dd 0 z db 0 data ends code segment assume ds:data,cs:code,ss:stak start: mov ax,data mov ds,ax ;;; a ;;;;;;;;;;;; lea dx,a1 call text_1 lea dx,vvod call vvod_1 call perevod mov [a2],al ;;; c ;;;;;;;;;;;; lea dx,c1 call text_1 lea dx,vvod call vvod_1 call perevod mov [c2],al ;;; d ;;;;;;;;;;;; lea dx,d1 call text_1 lea dx,vvod call vvod_1 call perevod mov [d2],al call formula exit_dos: mov ax,4c00h int 21h ;-2с-23d/(a/4)-1 ;;;;;;;;;;;;;;;;;;;;;;;;; formula: ;(a/4)-1 xor ax,ax mov al,[a2] shr ax,2 sub ax,1 mov [a_a],ax ;-2с xor ax,ax mov al,[c2] shl ax,1 not ax mov [c_c],ax ;-23d xor ax,ax mov al,d2 mov cl,-23 imul cl mov [d_d],ax int 3 mov ax,[c_c] sub ax,[d_d] mov cx,[a_a] xor dx,dx idiv cx ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; text_1: mov ah,09h int 21h ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; vvod_1: mov ah,0ah int 21h ret ;perevod string = byte chislo ;;;;;;;;;;;;; perevod: mov [z],0 xor bx,bx xor ax,ax xor cx,cx cmp [line],2 ja p1 cmp [line],1 ja p2 jmp p3 ; chislo * 100 p1: mov al,[chislo+bx] sub al,30h mov cx,2 p1_1: push cx mov cl,al shl al,3 shl cl,1 add al,cl pop cx loop p1_1 inc bx add [z],al ;; chislo * 10 p2: mov al,[chislo+bx] sub al,30h mov cl,al shl al,3 shl cl,1 add al,cl add [z],al inc bx ;; chislo + p3: mov al,[chislo+bx] sub al,30h add [z],al ;vozvrat al=otvet mov al,[z] ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; code ends end start