Деление чисел , Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите пожалосто , помогли написать код , но не пойму почему не работает деление . Что тут не так ? Все другие математические работают .
.model small 
.stack 16h 
.data 
ms_info db '(A/B) = ?',13,10,'$ ' 
ms_a db 13,10,'Input A = ', '$ ' 
ms_b db 13,10,'Input B = ', '$ ' 
ms_res db 13,10,'Result: C = ', '$ ' 
 
msg label byte 
maxnum db 6 
reallen db ? 
numfld db 5 dup(30h) 
mult10 dw 0 
ascval db 5 dup(30h),'$' 

a dw 0 
b dw 0 
z dw 0 
 
.code 
 
;Процедури ВВОДУ/ВИВОДУ 
 
input proc 
mov mult10,0001 
mov z,0 
mov cx,10 
lea si,numfld-1 
mov bl,reallen 
sub bh,bh 
sub ah, ah 
b20: 
mov al,[si+bx] 
cmp al, '-' 
jnz @dig 
neg z 
jmp @next 
@dig: 
sub ax, 30h 
mul mult10 
add z,ax 
mov ax,mult10 
mul cx 
mov mult10,ax 
@next: 
dec bx 
jnz b20 
ret 
input endp 
 
output proc 
xor bl, bl 
or ax, ax 
jns @positive 
neg ax 
mov bl, 1 
@positive: 
mov cx,10 
lea si, ascval+4 
c20: 
xor dx,dx 
div cx 
add dl, 30h 
mov [si], dl 
dec si 
or ax, ax 
jnz c20 
cmp bl, 1 
jnz @print 
mov byte ptr [si], '-' 
dec si 
@print: 
lea dx, ascval 
mov ah, 9 
int 21h 
ret 
output endp 
 
start: mov ax, @data 
mov ds, ax 
 
;Службове повідомлення 
mov ah,9 
mov dx, offset ms_info 
int 21H 

;Ввід А 
mov ah,9 
mov dx,offset ms_a 
int 21h 
 
mov ah,0AH 
lea dx,msg 
int 21H 
call input 
mov ax,z 
mov a,ax 

;Ввід В 
mov ah,9 
mov dx, offset ms_B 
int 21H; 
 
mov ah,0AH 
lea dx,msg 
int 21H 
call input 
mov ax,z 
mov b,ax 
 
;Повідомлення результату 
mov ah,9 
mov dx, offset ms_res 
int 21H 

;Початок обробки 
mov ax,a 
idiv b

call output 
 
mov ah, 4ch 
int 21h 
 
end start

Решение задачи: «Деление чисел , Assembler»

textual
Листинг программы
        mov ax, a
        sub ax, b
        mov cx, ax ; cx:=a-b
 
        mov ax, a
        cwd
        idiv b ; ax:=a/b
 
        cwd
        idiv cx ; ax:= (a/b)/(a-b)

Объяснение кода листинга программы

  1. mov ax, a — копирует значение переменной a в регистр ax.
  2. sub ax, b — вычитает значение переменной b из регистра ax.
  3. mov cx, ax — копирует значение регистра ax в переменную cx.
  4. mov ax, a — копирует значение переменной a в регистр ax.
  5. cwd — меняет знак числа в регистре ax на противоположный.
  6. idiv b — выполняет деление регистра ax на переменную b.
  7. cwd — меняет знак числа в регистре ax на противоположный.
  8. idiv cx — выполняет деление регистра ax на переменную cx.
  9. mov dx, ax — копирует значение регистра ax в переменную dx.
  10. mov bx, dx — копирует значение переменной dx в переменную bx.
  11. mov dx, bx — копирует значение переменной bx в переменную dx.
  12. mov cx, dx — копирует значение переменной dx в переменную cx.
  13. mov bx, cx — копирует значение переменной cx в переменную bx.
  14. mov ax, bx — копирует значение переменной bx в регистр ax.
  15. mul bx — выполняет умножение регистра ax на переменную bx.
  16. mov dx, ax — копирует значение регистра ax в переменную dx.
  17. mov bx, dx — копирует значение переменной dx в переменную bx.
  18. mov cx, bx — копирует значение переменной bx в переменную cx.
  19. mov ax, cx — копирует значение переменной cx в регистр ax.
  20. idiv bx — выполняет деление регистра ax на переменную bx.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5