Поменять местами уменьшаемое и вычитаемое в готовом калькуляторе - Assembler
Формулировка задачи:
доброго времени суток)
есть готовая программа - калькулятор.
сложение и умножение работают чудесно (потому что без разницы что на что умножать или складывать).
а вот с вычитанием и делением поплыл.
сначала, почему-то, вводится вычитаемое, а лишь затем уменьшаемое и результат выходит обратный.
будьте добры, подскажите, пожалуйста, как поменять их местами?
знаю, что нужно покопаться в процедурах input и output, но замена местами bx ax - ничего не дала
model tiny STACK 256 DATASEG mes1 db '1. summa',0dh,0ah,'$' mes2 db '2. Raznnost',0dh,0ah,'$' mes3 db '3. umnozhenie',0dh,0ah,'$' mes4 db '4. delenie',0dh,0ah,'$' info db 'Vyberite variant',0dh,0ah,'$' lol db 'Input Error!',0dh,0ah,'$' info2 db 'Vvedite pervoe chuslo',0dh,0ah,'$' info3 db 'Vvedit drugoe chuslo',0dh,0ah,'$' errormes db 'incorrect number',0dh,0ah,'$' buff db 6,7 Dup(?) CODESEG start: mov ax,@data mov ds,ax mov dx,offset mes1 mov ah,09h int 21h mov dx,offset mes2 mov ah,09h int 21h mov dx,offset mes3 mov ah,09h int 21h mov dx,offset mes4 mov ah,09h int 21h mov dx,offset info mov ah,09h int 21h CALL InputInt cmp ax,1 je summa cmp ax,2 je razn cmp ax,3 je umnozhenie cmp ax,4 je delenie jmp error summa: lea dx,info2 mov ah,09h int 21h CALL InputInt mov bx,ax mov dx,offset info3 mov ah,09h int 21h CALL InputInt add ax,bx jmp kinez razn: mov dx,offset info2 mov ah,09h int 21h CALL InputInt mov bx,ax mov dx,offset info3 mov ah,09h int 21h CALL InputInt sub ax,bx jmp kinez umnozhenie: mov dx,offset info2 mov ah,09h int 21h CALL InputInt mov bx,ax mov dx,offset info3 mov ah,09h int 21h CALL InputInt mul bx jmp kinez delenie: mov dx,offset info2 mov ah,09h int 21h CALL InputInt mov bx,ax mov dx,offset info3 mov ah,09h int 21h CALL InputInt xor dx,dx div bx jmp kinez error: mov dx,offset lol mov ah,09h int 21h CALL InputInt xor ah,ah int 16h kinez: CALL OutputInt xor ah,ah int 16h mov ah,04Ch mov al,1h int 21h InputInt proc push bx mov ah,0ah xor di,di mov dx,offset buff int 21h mov ah,02h int 21h mov si,offset buff+2 cmp byte ptr [si],"-" jnz ii1 mov di,1 inc si ii1: xor ax,ax mov bx,10 ii2: mov cl,[si] cmp cl,0dh jz endin cmp cl,'0' jl er cmp cl,'9' ja er sub cl,'0' mul bx add ax,cx inc si jmp ii2 er: mov dx,offset errormes mov ah,09h int 21h int 20h endin: cmp di,1 jnz ii3 neg ax ii3: pop bx ret InputInt endp OutputInt proc test ax,ax jns oi1 mov cx,ax mov ah,02h mov dl,'-' int 21h mov ax,cx neg ax oi1: xor cx,cx mov bx,10 oi2: xor dx,dx div bx push dx inc cx test ax,ax jnz oi2 mov ah,02h oi3: pop dx cmp dl,9 jbe oi4 add dl,7 oi4: add dl,'0' int 21h loop oi3 ret OutputInt endp END start
Решение задачи: «Поменять местами уменьшаемое и вычитаемое в готовом калькуляторе»
textual
Листинг программы
sub ax,bx
Объяснение кода листинга программы
В данном коде происходит вычитание двух чисел, где ax и bx являются аккумуляторами, содержащими значения вычитаемого и уменьшаемого соответственно. Результат вычитания сохраняется в аккумуляторе ax. Вот список действий в данном коде:
- Вычитание:
ax - bx
- Сохранение результата в аккумуляторе ax