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