Деление чисел , 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)
Объяснение кода листинга программы
mov ax, a
— копирует значение переменнойa
в регистрax
.sub ax, b
— вычитает значение переменнойb
из регистраax
.mov cx, ax
— копирует значение регистраax
в переменнуюcx
.mov ax, a
— копирует значение переменнойa
в регистрax
.cwd
— меняет знак числа в регистреax
на противоположный.idiv b
— выполняет деление регистраax
на переменнуюb
.cwd
— меняет знак числа в регистреax
на противоположный.idiv cx
— выполняет деление регистраax
на переменнуюcx
.mov dx, ax
— копирует значение регистраax
в переменнуюdx
.mov bx, dx
— копирует значение переменнойdx
в переменнуюbx
.mov dx, bx
— копирует значение переменнойbx
в переменнуюdx
.mov cx, dx
— копирует значение переменнойdx
в переменнуюcx
.mov bx, cx
— копирует значение переменнойcx
в переменнуюbx
.mov ax, bx
— копирует значение переменнойbx
в регистрax
.mul bx
— выполняет умножение регистраax
на переменнуюbx
.mov dx, ax
— копирует значение регистраax
в переменнуюdx
.mov bx, dx
— копирует значение переменнойdx
в переменнуюbx
.mov cx, bx
— копирует значение переменнойbx
в переменнуюcx
.mov ax, cx
— копирует значение переменнойcx
в регистрax
.idiv bx
— выполняет деление регистраax
на переменнуюbx
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д