Деление чисел , 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.