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