Пишу калькулятор. Входные данные: дисятичное числа из двух цифр. Выходные: результат арифм. действия. Для умножения нужно писать "*" между цифрами. Для деления - "/". А для сложения и вычитания - "+" и "-" соответсвенно. Пример: Vvedite: 12 + 12 Rezultat: 24 Код (Text): data segment s1 db '',13,10,'Vvedite primer:$' s2 db ' $' s3 db '',13,10,'Oshibka. Vvedite povtorno.$' s4 db '',13,10,'Rezultat: $' x dw 10 b dw 0 c dw 0 data ends stk segment stack dd 128 dup (0) stk ends text segment 'code' assume cs:text,ds:data vvod proc mov ah,9h mov dx,offset s2 int 21h mov b,0 mov cl,2h m1: mov ah,1h int 21h call prov sub al,30h cbw mov si,ax mov ax,b mul x add ax,si mov b,ax loop m1 ret endp vivod proc mov ah,9h mov dx,offset s4 int 21h mov ax,c mov cl,0h M2: xor dx,dx div x push dx inc cx cmp ax,0 jne m2 M3: pop dx add dl,30h mov ah,2h int 21h loop m3 call vihod endp prov proc cmp al,39h jg osh cmp al,30h jl osh ret osh: mov ah,9h mov dx,offset s3 int 21h call main endp prov2 proc cmp al,2ah je m4 cmp al,2fh je m5 cmp al,2bh je m6 cmp al,2dh je m7 jmp osh2 M4: call umn m5: call del M6: call slozh m7: call vich osh2: mov ah,9h mov dx,offset s3 int 21h call main endp umn proc xor dx,dx mov dx,b mov c,dx call vvod mul c mov c,ax call vivod endp del proc xor dx,dx mov dx,b mov c,dx call vvod div c mov c,ax call vivod endp slozh proc xor dx,dx mov dx,b mov c,dx call vvod add c,ax call vivod endp vich proc xor dx,dx mov dx,b mov c,dx call vvod sub c,ax call vivod endp vihod proc mov ah,1h int 21h mov ah,4ch int 21h endp main proc mov ax,data mov ds,ax xor ax,ax mov cx,0 mov ah,9h mov dx,offset s1 int 21h call vvod mov ah,9h mov dx,offset s2 int 21h mov ah,1h int 21h call prov2 mov ah,9h mov dx,offset s1 int 21h main endp text ends end main Прошу обратить особое внимание на процедуру ДЕЛЕНИЯ. Видимо что-то с ней не так, поскольку оно (это самое деление) выполняется неправильно. Код (Text): del proc xor dx,dx mov dx,b mov c,dx call vvod div c mov c,ax call vivod endp
Код (Text): xor dx,dx mov dx,b mov c,dx call vvod div c Команда div делит ax:dx на значение регистра, или области памяти. Соответственно, в твоем случае (деление, как я понял, беззнаковое) dx перед командой div надо обнулить. И не совсем понятно, зачем обнулять dx до передачи b в c. + такая обработка ошибок (фактически рекурсия) не есть хорошо: если наошибаться много -- стек накроется.
Нет, не только ax. В зависимости от размера операнда ah:al, dx:ax, edx:eax, rdx:rax. В приведенном примере (word) будет dx:ax.